J'ai lu cette question et j'ai pensé que ce serait un beau défi.
Tâche
Donner une entrée 0<n<10
générer un nombre aléatoire avec
- exactement n chiffres
- le premier pas un
0
- alors
f(n)>10**(n-1)-1
- alors
- chiffres distincts
Critères gagnants
C'est le code-golf donc le code le plus court gagne.
au hasard
Je veux dire aléatoire réparti uniformément. Du point de vue du programme, chaque nombre possible a donc la même chance. Si la langue dans laquelle vous écrivez a un étrange générateur de nombres aléatoires, vous pouvez l'utiliser.
Exemple
La liste des valeurs à sélectionner aléatoirement n=2
est:
[10, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98]
code-golf
number
random
grid
game
king-of-the-hill
javascript
code-golf
arithmetic
statistics
code-golf
math
code-golf
math
code-golf
string
palindrome
code-golf
string
interactive
code-golf
quine
polyglot
code-golf
string
stack-exchange-api
code-golf
number-theory
decision-problem
code-golf
tips
code-golf
string
internet
code-golf
graphical-output
image-processing
fractal
code-golf
ascii-art
geometry
hexagonal-grid
code-golf
string
restricted-source
hello-world
code-golf
game
code-golf
cipher
code-golf
permutations
cops-and-robbers
permutations
cops-and-robbers
code-golf
internet
stack-exchange-api
code-golf
ascii-art
random
code-golf
tips
code-golf
ascii-art
code-golf
code-golf
kolmogorov-complexity
code-golf
string
unicode
code-golf
number
sequence
primes
palindrome
code-golf
game
decision-problem
code-golf
math
geometry
code-golf
graphical-output
interactive
code-golf
set-partitions
code-golf
number
arithmetic
restricted-source
code-golf
decision-problem
python
recursion
code-golf
ascii-art
code-golf
source-layout
code-golf
function
recursion
functional-programming
code-golf
game
combinatorics
permutations
code-golf
string
file-system
code-golf
string
hashing
code-golf
stack-exchange-api
code-golf
string
code-golf
math
number
arithmetic
polyglot
Roman Gräf
la source
la source
Réponses:
Python 2 , 77 octets
Essayez-le en ligne!
Mélange la liste des 10 chiffres jusqu'à ce qu'elle ne commence pas par 0, puis crée un nombre avec les premiers
n
chiffres répertoriés.la source
9
ou10
.[1::3]
fonctionne la conversion d'une liste en chaîne? Je n'avais jamais vu ça auparavant.[
.[1::3]
obtient le personnage à l'index 1, puis tous les trois. Car[1, 2, 3]
, cela donne123
, sauter les crochets, les virgules et les espaces.[1, 2, 3]
avait déjà été strictifié et que les virgules et les espaces devaient être sautés. Merci!Brachylog ,
910 octetsEssayez-le en ligne!
Comme d'habitude pour Brachylog, il s'agit d'une soumission de fonction. Le lien TIO ci-dessus a reçu un argument de ligne de commande pour transformer la fonction en programme complet.
J'ai dû ajouter un octet supplémentaire à partir de la première version de ceci, en changeant
ℕ
enℕ₁
, pour interdire la sortie 0 (quelque chose qui a maintenant été clarifié).Explication
Assez inefficace, car l'interpréteur génère une liste de toutes les valeurs possibles, puis en choisit une au hasard (c'est ce que
ᶠṛ
signifie; Brachylog n'avait pas d'option "choisir une solution aléatoire" au moment où cette question a été posée).Quelques commentaires sur l'étiquetage ici: si le
≜
est omis, la section entre les accolades ne produit qu'une seule valeur, une contrainte représentant les nombres avec la propriété que nous voulons; choisir un résultat aléatoire nous donne donc la contrainte, et l'interpréteur sort la valeur absolue minimale qui respecte la contrainte (1, 10, 102, 1023, 10234, etc.), ce qui n'est pas ce que nous voulons. Il faut donc le forcer à construire la liste via une étiquetage explicite.La plupart des implémentations de Prolog que j'ai vues ont une fonction intégrée pour trouver un résultat aléatoire correspondant à une contrainte, mais généralement pas avec une probabilité uniforme; Brachylog n'en avait pas, cependant (un a été ajouté en réponse à ce défi, mais je ne peux évidemment pas l'utiliser en raison de règles d'échappatoire). Si tel était le cas, et s'il
~lℕ₁≠
s'avérait donner une probabilité uniforme sur ce problème, ce programme serait simplement suivi par ce module intégré, pour une longueur probable de 6 octets.Brachylog , 8 octets, en collaboration avec @Fatalize
Essayez-le en ligne!
C'est le genre de truc de génie de bas niveau qui n'a de sens que dans la façon dont Prolog fait les choses et n'a pas beaucoup de sens lorsqu'il est décrit mathématiquement.
Comme précédemment,
~lℕ₁≠
construit une valeur qui décrit une contrainte ("longueur égale à l'entrée, nombre naturel, tous les éléments différents"). Génère ensuite≜ᶠ
toutes les valeurs possibles qui respectent la contrainte. Le point ici est qu'avec la séquence d'évaluation de Brachylog, aucun choix réel n'est fait jusqu'à ce que≜
s'affiche, donc l'opération "trouver toutes les solutions" neᶠ
doit s'appliquer qu'à la "valeur spécifique qui remplit une contrainte"≜
. Cela signifie qu'il n'est pas nécessaire pour a{…}
de sélectionner sa portée, économisant 2 octets.la source
≜₁
avant de réaliser qu'elle a été ajoutée en raison de ce défiGelée , 9 octets
Essayez-le en ligne! (ne fonctionnera pas chez TIO pour n> 6 en raison de l'inefficacité de la mise en œuvre)
ou une implémentation alternative de la même chose:
Comment?
C'est assez sournois et très inefficace! Jelly fait certaines choses utiles implicitement lorsqu'un atome attend une liste mais reçoit un entier (c'est voulu par la conception).
Ce code utilise quelques-unes de ces actions implicites utiles:
L'atome monadique
Ṗ
, "pop", lorsqu'il est appelé avec une entrée entière crée implicitement une plage à partir de laquelle éclater, donc une entrée de n fait d'abord [1, 2, ..., n] , puis éclate, donnant [1, 2 , ..., n-1] .L'atome monadique
Q
, "de-dupliquer" ou "unique", lorsqu'il est appelé avec une entrée entière fait implicitement une liste décimale à dédoublonner, donc une entrée de n où:n = d k-1 × 10 k-1 + d k-2 × 10 k-2 + ... + d 1 × 10 + d 0
crée d'abord
[d k-1 , d k-2 , ..., d 1 , d 0 ]
puis donne les valeurs uniques par première impression.
Ainsi, par exemple, n = 5835518 donnerait [5, 8, 3, 1] .
De plus, l'atome monadique
M
, "index d'éléments maximaux", renvoie les index des éléments maximaux d'une liste, ce qui économise deux octets par rapport à l'alternative beaucoup plus évidente de tester l'égalité avec l'entrée et de trouver des index véridiques⁵*ṖQL$€=⁸TX
, ou⁵*ṖðQL⁼ð€TX
Tout cela est assez inefficace, à la fois en temps et en mémoire: d'abord une liste de 10 n entiers est faite et un est rejeté, puis pour chacun d'eux une liste de n entiers (pas un objet 4 bits ou une énumération de fantaisie) est faite puis dédoublonné. Cette déduplication a une implémentation entièrement basée sur une liste (aucun ensemble, ensemble trié ou dictionnaire n'est impliqué sous le capot, chaque chiffre est vérifié pour l'existence dans la liste qui obtient finalement la sortie).
Hors ligne n = 7 utilise ~ 0,5 Go et prend ~ 25 secondes, tandis que n = 8 utilise ~ 4 Go et prend ~ 5 minutes - je n'ai pas pris la peine de courir n = 9 car je n'ai que 16 Go de RAM (je suppose que cela prendrait ~ 45 minutes ).
L'implémentation alternative utilise simplement le
ÐṀ
filtre rapide intégré pour conserver le minimum (ce qui ajoute juste un peu de surcharge dans la gestion pour le même nombre d'octets).la source
Gelée , 11 octets
Essayez-le en ligne!
Comment ça marche
la source
JavaScript (ES6),
72717069 octetsIl s'agit d'une fonction récursive qui prend le nombre de chiffres x . Le deuxième paramètre y , initialement défini sur la chaîne vide, garde une trace du nombre lorsque nous le générons chiffre par chiffre.
D'abord, nous générons un chiffre aléatoire z avec
Math.random()*10|0
. Maintenant, nous voulons vérifier que le y ne contient pas z , et que y et z ne sont pas tous les deux 0 .On peut calculer la première condition avec
!y.match(z)
.y.match(z)
renvoie un tableau (toujours vrai) si y contient z , null (faux) sinon; le!
convertit en un booléen et l'inverse.La deuxième condition est vérifiée avec
y|z
. Bien que y soit une chaîne, JS la convertit implicitement en un entier lors de l'utilisation|
. Il s'agit d'un entier positif si y contient déjà des chiffres, 0 sinon. Le résultat net est quey|z
renvoie 0 si y est vide et z est 0 , ou un entier positif sinon.Si ces deux conditions sont remplies, nous ajoutons le chiffre à y , décrémentons x et recommençons le processus. Sinon, nous revenons simplement au début et espérons que le prochain chiffre aléatoire fonctionne. Lorsque x atteint 0 , nous renvoyons simplement la chaîne vide pour terminer la récursivité.
La version précédente:
Il s'agit d'une fonction récursive qui prend le nombre de chiffres. Le deuxième paramètre initialement indéfini, y , est une table de recherche à 10 bits qui nous indique les chiffres que nous avons déjà, commodément stockés sous forme d'entier.
D'abord, nous générons un chiffre aléatoire z avec
Math.random()*10|0
. Maintenant, nous voulons vérifier que le zième bit le moins significatif de y n'est pas défini, et que y et z ne sont pas tous les deux 0 .On peut calculer la première condition avec
~y>>z&1
; inverser y , le déplacer de z bits vers la droite et ne prendre que le bit le moins significatif. Cela donne 1 si nous n'avons pas encore généré le chiffre en question, ou 0 sinon.La deuxième condition était initialement assez difficile à comprendre (j'ai essayé d'utiliser
y/z
d'abord pour générerNaN
s'ils sont tous les deux 0), mais à un moment donné, j'ai réalisé que celay|z
ferait tout simplement l'affaire. Le résultat est 0 ssi y et z sont 0 ; sinon un entier positif.Si ces deux conditions sont vraies (
~y>>z&1&&y|z
), alors nous générons le reste du nombre et ajoutons z . Le reste du nombre est généré en appelant à nouveau la fonction avecx-1
ety|1<<z
( y , mais avec le bit d'index z mis à 1 ). Lorsque x atteint 0 , nous renvoyons simplement la chaîne vide pour terminer la récursivité.la source
ClojureScript,
8179 octetsIl s'agit d'une fonction anonyme, vous devez donc l'utiliser comme ceci:
Où vous remplacez
{arguments}
par vos arguments.Vous pouvez essayer le code ici (ClojureScript REPL).
Merci d'
@cliffroot
avoir rasé 2 octets!Code développé:
Explication:
Je vais parcourir les lignes une par une, en utilisant un exemple d'entrée de
8
.Assez simple, cela définit la fonction
random-digits
avec un argument, appelén
. Dans ma réponse, j'ai utilisé une fonction anonyme (#(...)
), pour économiser des octets.Examinons de l'intérieur
let
, de l'intérieur:En ClojureScript (et Clojure),
(range n)
est similaire à Pythonrange(n)
: il vous donne une liste avec chaque numéro de0
àn - 1
(9
dans ce cas).shuffle
prend une liste et renvoie un vecteur (qui est légèrement différent d'une liste) avec tous ses éléments mélangés. Donc, en utilisant notre exemple, nous obtenons quelque chose comme ceci:(subvec vector start end)
prend un vecteur (seulement un vecteur) et retourne un vecteur qui a tous les éléments de l'indexstart
àend
. Dans ce cas, nous prenons des éléments du0
th élément à l'argument donné àrandom-digits
. Si nous appliquons cela à notre exemple, nous obtenons:Cette
if
instruction vérifie si le premier élément denum-vector
est a0
.Si c'est le cas
0
, alors nous appelons à nouveau la fonction, avec l'argumentn
, en utilisantrecur
.Si ce n'est pas le cas
0
:(apply function list)
prend une liste et les crache dans la fonction comme arguments. Par exemple:Se transforme en:
Ce qui équivaut
9
.(str items)
transforme chaque élémentitems
en une chaîne, puis les concatène.int
convertit n'importe quoi en entier. Donc, si nous appliquons cela à notre exemple, nous obtenons:Quelle est notre réponse finale.
la source
(int string)
place de(Integer/parseInt string)
:)read-string
à Clojure, mais ce n'est pas beaucoup mieux ...#(let[a(subvec(shuffle(range 10))0 %)](if(=(a 0)0)(recur %)(int(apply str a))))
se déplace uneapply str
partie de l'extrémité, permet de comparer à la0
place de\0
et utilisesubvec
au lieu detake
permet de vecteur d'utilisation en fonction et donc de supprimerfirst
shuffle
transformé la collection en unvec
. Merci! Devra écrire une nouvelle explication, cependant ...Python 2,
898180 octetsEssayez-le en ligne
la source
99**n
, juste pour être sûr de les avoir tous. : Dif`set(`i`)`[5*n:]]
.R, 45 octets
la source
k=0
car c'est un vecteur implicite de longueur un, et vous pouvez utiliser i = scan () pour prendre l'entrée de stdin comme un nombre. Je ne suis pas sûr non plus qu'une liste de chiffres soit une soumission "correcte", mais je ne suis pas juge.while(!k[1])
pour économiser 2 octets?Utilitaires Bash + GNU, 46
Essayez-le en ligne .
Cela prend beaucoup de temps pour les n plus grands - environ 30 secondes pour n = 7, et augmente 10 fois pour chaque incrément, donc probablement 8 à 9 heures pour n = 10.
la source
Java 7,
150147145134 octets-2 octets grâce à @TheLethalCoder
(ancienne) Explication:
Code de test:
Essayez-le ici.
Exemple de sortie:
la source
n->...
- dire ou est-ce Java 8+?for(int l,x;(l=r.length())<n;)
-à- dire et vous devez enregistrer un octet.n->...
c'est Java 8. Personnellement, je préfère le codegolf en Java 7, même si 8 est toujours plus court.Perl 6 , 44 octets
Essayez-le
Étendu:
la source
PHP, 67 octets
Version en ligne
Toutes les versions basées sur un mélange des chiffres de 0 à 9
71 octets
73 octets
la source
MATL , 15 octets
Essayez-le sur MATL Online!
Explication
la source
Gelée , 12 octets
Actuellement, un octet derrière mon autre réponse Jelly, mais j'aime vraiment celle-ci.
Essayez-le en ligne!
Comment ça marche
la source
APL (Dyalog) ,
271917 octetsRequiert
⎕IO←0
ce qui est par défaut sur de nombreux systèmes.Essayez-le en ligne!
Mélange les chiffres jusqu'à ce qu'ils soient valides:
10⊥
décoder des chiffres de base 10 en nombre régulier,⊢
puis↑
premiers éléments de{
...}⍣{
...}
répéter la fonction ...?⍨10
mélanger les dix premiers entiers positifsjusqu'à ce que ...
⊃⍺
le premier chiffre de la dernière tentative×
est positivela source
Python 2 ,
100939290 octetsMerci à @ mbomb007 pour avoir rasé 2 octets
Essaie les nombres dans le champ requis jusqu'à ce que l'un soit trouvé avec des chiffres uniques. Je parie qu'il existe une façon beaucoup plus propre de le faire, mais aucune ne me vient à l'esprit.
la source
return(n==len(set(`k`)))*k or f(n)
. Essayez-le en lignePyth , 11 octets
Utilise le même algorithme que la réponse de Dennis .
Essayez-le en ligne!
la source
Perl, 48 octets
Explication:
Générez de manière répétée des entiers aléatoires de 1 à 10 ** $ n-1, en les rejetant jusqu'à ce qu'il y en ait un de la bonne longueur (donc au moins 10 ** ($ n-1)) sans chiffres répétés.
la source
Lot, 156 octets
x
conserve un masque de bits de chiffres utilisés.f
indique le nombre de chiffres disponibles (compte à rebours de 9). Des chiffres aléatoires sont générés jusqu'à ce qu'un chiffre inutilisé soit trouvé.n=10
pourrait être pris en charge pour 165 octets:(
r
contient un zéro de tête supplémentaire car il est golfeur de cette façon.) L'approche précédente pour 165 octets a mis en majuscule le premier chiffre, et s'est également avérée fonctionner avecn=10
(la version numérique a en fait pris 166 octets!):L'approche originale pour 170 octets a également fonctionné pour
n=10
:Utilise la manipulation de chaînes pour détecter les chiffres en double.
la source
Bash , 66 octets
Essayez-le en ligne!
Simple, utilise shuf, xargs est utilisé pour joindre les lignes et continue d'essayer pendant que la combinaison commence par 0.
Cant beat 46 char from other answer but is is fast!
la source
Pyth,
1528 octetsEssayez-le ici
la source
0
, donc je pense que vous voudrez passer^TttQ
à^TtQ
(-1 octet, prime!). 2) tous les chiffres de la sortie doivent être uniques, vous devrez donc forcer cela à se produire d'une manière ou d'une autre.C #,
127132128126125 125 octetsEssayez-le en ligne!
A emprunté l'idée de la réponse de @ KevinCruijssen pour initialiser l'aléatoire
r
, dans leif
instruction pour économiser 2 octets.Je suis sûr que cela peut être joué plus loin, mais je n'ai pas le temps pour le moment.
Ancienne version utilisant une
while
boucle:la source
0
, il faudrait d' abord essayer ceif(s.Length<1&r>0)
qui est faux, mais il fera ceif(!s.Contains(r+""))
qui est vrai et encore append"0"
às
comme premier chiffre..Next(10)
... avec un;
. Donc pas d'améliorations supplémentaires, mais bonne idée.n=>{var s="";for(int l=0,r;l<n;l=s.Length)if((l<1&(r=new System.Random().Next(10))>0)|(l>0&!s.Contains(r+"")))r+=x;return s;};
C (gcc) ,
123122100951041039997 octetsCelui-ci génère un nombre aléatoire réel
Essayez-le en ligne!
C (gcc) ,
8785 octetsIci, il imprime une chaîne de chiffres.
Essayez-le en ligne!
la source
PHP,
6563 octetsprend l'entrée de STDIN; courir avec
-nR
.créer un nombre aléatoire entre
1
et10^N
inclusif;répéter pendant que le nombre de caractères distincts est <
N
.la source
while(count(count_chars($x=rand(1,10**$argn),1))<$argn);echo$x;
-2 octetsMathematica
6560 octetsVoici une version plus rapide mais ajoute 9 octets:
la source
Java 9 JShell, 86 octets
Essayez-le en ligne!
Remarque: je ne compte pas les importations car ces packages sont importés par défaut dans JShell, mais il n'y a pas de lien Try-it-online que je connaisse pour JShell, donc j'en ai fourni un pour Java 9 avec le code d'en-tête et de pied de page à faire fonctionner dans ce contexte. Dans JShell, vous pouvez simplement faire:
Et alors:
Comment ça marche:
Nous définissons une fonction de Integer à Long et créons un flux infini de longs aléatoires dans la plage de 0-9, la limitons aux n-1 premiers éléments, puis la réduisons avec un int aléatoire de 1-9 comme valeur initiale et une fonction qui multiplie la valeur par 10 et ajoute la valeur suivante du flux.
J'ai utilisé des longs donc cela devrait fonctionner jusqu'à environ 18 chiffres (n = 18).
la source
C,
9693 octetsFisher-Yates mélange l'initialisation jusqu'à ce que le premier chiffre ne soit pas nul.
Est uniforme, en supposant qu'il
rand()%i
est uniforme. (Puisque pour la plupart iRAND_MAX/i
laisse un petit reste, il y a un très petit biais. Ce biais devient plus petit à mesure que RAND_MAX grandit.)Voyez-le fonctionner en ligne .
Voyez-le générer des nombres corrects lorsque n est égal à 2, comme indiqué dans la question .
la source
Axiome, 191 octets
débloquer, résultat du test
la source
Méduse , 17 octets
Essayez-le en ligne!
Fork de la réponse de Dennis 'Jelly .
la source
Rubis,
5352 octetsMélangez jusqu'à ce que le premier chiffre ne soit pas 0, puis combinez les chiffres et convertissez-les en entier.
Essayez-le en ligne!
la source