Des nombres faciles à retenir mais théoriquement difficiles à réaliser
Votre défi consiste à créer un programme / fonction dans n’importe quelle langue qui génère des nombres uniformément aléatoires qui correspondent à ces critères:
La longueur est de 5 chiffres
Il y a deux paires de chiffres répétés séparés
Un ensemble de chiffres répétés est au début ou à la fin et les chiffres sont côte à côte
Le nombre impair à l'extérieur est entouré par l'autre paire de chiffres
Les paires de deux chiffres et l'autre nombre doivent tous être uniques
Votre programme peut prendre en charge les nombres avec des zéros non significatifs ou non, à votre discrétion. Si les zéros au début sont pris en charge, ils doivent être inclus dans la sortie: 06088 et non 6088. Si les zéros au début ne sont pas pris en charge, les numéros tels que 06088 ne doivent pas être générés du tout.
Cas de test
Sorties acceptées:
55373 55494 67611 61633 09033 99757 95944 22808 65622 22161
Sorties non acceptées:
55555 77787 85855 12345 99233 12131 abcde 5033
Des cas de test plus acceptables peuvent être trouvés à ce lien pastebin .
Celles-ci ont été faites avec ce programme python:
importer au hasard pour i dans la gamme (100): si random.randint (0,100)> = 50: #Put paire de toucher au début si vrai temp = [] # tableau de travail temp.append (random.randint (0,9)) #append chiffre aléatoire temp.append (temp [0]) #applique à nouveau le même chiffre x = random.randint (0,9) tandis que x == temp [0]: x = random.randint (0,9) temp.append (x) #append un autre chiffre unique y = random.randint (0,9) tandis que y == temp [0] ou y == temp [2]: y = random.randint (0,9) temp.append (y) #append un autre chiffre unique et le chiffre précédent unique temp.append (x) sinon: mettre la paire touchante à la fin temp = [] # tableau de travail temp.append (random.randint (0,9)) #append chiffre aléatoire #Quand pas unique, essayez à nouveau x = random.randint (0,9) tandis que x == temp [0]: x = random.randint (0,9) temp.append (x) #append un autre chiffre unique temp.append (temp [0]) #applique à nouveau le même chiffre 0 y = random.randint (0,9) tandis que y == temp [0] ou y == temp [1]: y = random.randint (0,9) temp.append (y) #append un autre chiffre unique deux fois temp.append (y) tempstr = "" pour i in temp: tempstr + = str (i) imprimer tempstr
C'est du code-golf , donc la réponse la plus courte en octets gagne!
random
ne signifie pas uniformément ainsiRéponses:
05AB1E , 11 octets
Essayez-le en ligne!
Explication
la source
CJam (16 octets)
Démo en ligne
Remarque: j'ai supposé que par "unique" OP signifie vraiment "distinct".
Aussi pour 16 octets:
Dissection
Les autres variantes génèrent en utilisant
[1 0 1 2 2]
puis en sélectionnant le résultat ou l'inverse.la source
Perl 5 ,
816356 octetsCoupez 7 octets en vous inspirant de @DomHastings
Construire le nombre à partir du modèle approprié.
Essayez-le en ligne!
Perl 5 , 89 octets
Choisit des nombres aléatoires de 5 chiffres jusqu'à ce qu'il en trouve un qui répond aux critères.
Essayez-le en ligne!
la source
time%2
est suffisamment aléatoire, car en un sens, il est sous le contrôle de l'utilisateur.Python 2 , 80 octets
Essayez-le en ligne!
Affiche une liste de chiffres.
Python 2 , 83 octets
Essayez-le en ligne!
La sortie est un nombre.
la source
APL (Dyalog Unicode) ,
22 21 20 1817 octetsEssayez-le en ligne!
S'il est acceptable de sortir les nombres toujours dans le même format, cela peut être réduit à 12 octets,
1⌽1↓,∘⌽⍨3?10
ou3⌽1↓,∘⌽⍨3?10
.Enregistré un octet en supprimant l'inutile
∘
.Sauvegardé un octet grâce à H.PWiz, puis 2 autres en raison de leur astuce.
Enregistré un octet grâce à ngn.
La fonction assume
⎕IO←0
( I ndex O rigin).Comment?
la source
Input
est utilisé pour appeler la fonctiong
. En outre, leg←
n'est pas compté dans le nombre d'octets car ce n'est pas nécessaire, il est uniquement utilisé pour appeler la fonction.g
soit appelé dans la section input n'est qu'une bizarrerie sur la manière dont APL est configuré pour fonctionner sur TIO(4∨?2)
enregistre un octet1 4[?2]
f
et en n'utilisant pas de train. Je vous laisse ça cependant :)Java 8,
145136125119 octets-9 octets grâce à @ OlivierGrégoire.
-11 octets grâce à @RickHitchcock .
-6 octets grâce à @Nevay .
Explication:
Essayez-le en ligne.
la source
v->{String r="";for(;!r.matches("(.)\\1(.).\\2|(.).\\3(.)\\4")|r.chars().distinct().count()!=3;r=(int)(Math.random()*1e5)+"");return r;}
(.).*\\1(.).*\\2
, économisant 11 octets.v->{String r;for(;!(r=(int)(Math.random()*1e5)+"").matches("((.).?\\2){2}")|r.chars().distinct().count()<3;);return r;}
Gelée , 23 octets
Essayez-le en ligne!
la source
Gelée ,
12 à11 octetsEssayez-le en ligne!
Explication
(*) Le bon argument de
ṃ
est que la liste['0','1','2',...,'9']
, mélangée de manière aléatoire, a 10 éléments. Ainsi, le nombre13122
sera converti en base bijective 10 ([1,3,1,2,2]
) et indexé dans la liste (ainsi, si la liste estl
, la valeur de retour de l'atome est[l[1],l[3],l[1],l[2],l[2]]
, où Jelly utilise l'indexation basée sur 1)la source
JavaScript (ES6), 79 octets
Essayez-le en ligne!
Comment?
Math.random()
donne un float aléatoire dans [0..1) . Nous utilisons+f
pour forcer la contrainte à une chaîne. Nous ignorons le zéro et le séparateur décimal en faisant[,,
( attribution de déstructuration des deux premiers caractères à néant) et recueillons les 4 premiers chiffres décimaux dans d , a , b et c .Si a , b et c sont 3 entiers distincts, nous construisons la sortie finale au format AABCB ou BCBAA (en utilisant la parité de d pour décider). Sinon, nous essayons encore jusqu'à ce qu'ils le soient.
Dans le cas hautement improbable du
Math.random()
renvoi d'une valeur sans suffisamment de décimales, au moins c sera défini sur un caractère non numérique, ce qui obligera le test à échouer et à déclencher l'appel récursif. Si a , b et c sont des entiers valides, alors il est garanti que d est également un entier valide. Il n’est donc pas nécessaire de tester celui-ci.la source
&&
peuvent être&
. Aussi, comment ça[,,a,b,c,d]
marche? Je n'ai jamais vu une entrée comme[,,
avant.a=4, b=2, c=1
car4-2&4-1&2-1 == 2&3&1 == 0
. J'ai ajouté une brève explication sur l'affectation de variable.&&
de&
dans TIO et lui a donné des sorties correctes, donc je suppose qu'il était possible. N'a pas réalisé&
au lieu de&&
filtrer les sorties valides Et merci pour l'explication ajoutée sur la mission de déstructuration, jamais vue auparavant.Perl 6 , 42 octets
Essayez-le en ligne!
la source
Sale , 33 octets
Utilise le
--numeric-output
drapeau pour le rendre lisible, sinon il produirait une chaîne de caractères de contrôle avec des points de code correspondant aux chiffres.Essayez-le en ligne!
A expliqué:
la source
charbon , 34 octets
Essayez-le en ligne! Le lien est vers la version verbeuse du code. Explication:
la source
Retina , 40 octets
Essayez-le en ligne!
Peut imprimer des chaînes avec des zéros non significatifs.
Explication
Initialisez la chaîne à 10 caractères de soulignement.
Traduire cycliquement les caractères des mots en chiffres. C'est un peu bizarre. Les
w
etd
sont courts pour les chaînes suivantes, respectivement:La translittération cyclique signifie qu’en premier lieu, les deux chaînes sont répétées à la longueur de leur LCM:
Etant donné que les longueurs de chaîne 53 et 10 sont identiques, chaque copie
_
est associée à un chiffre différent. Et maintenant, la translittération cyclique remplacera la i- ème copie_
par la i- paire dans cette liste étendue. Nous nous retrouvons donc avec la chaîne suivante:Tout cela pour sauvegarder un seul octet sur la chaîne littérale
0369258147
, alors oui, je suppose? :RÉQuoi qu'il en soit, nous avons maintenant une chaîne de 10 chiffres.
Cela mélange les chiffres. Les trois premiers chiffres constituent donc une sélection aléatoire uniforme de trois chiffres distincts.
Nous faisons correspondre la chaîne
...ABC
et la transformons enBABCC
. Notre façon de faire est un peu folle et ne sauve qu'un octet par rapport à une approche plus simple. Nous mettons d’abord en correspondance toutes lesv
paires de caractères qui se chevauchent ( ), en capturant la seconde (.(.)
). Ensuite, nous ne conservons que la 8ème correspondance (7
, basée sur zéro) qui estAB
dans...ABC
. Ensuite, nous le remplaçons$
par:B
($1
),ABC
($<'
qui est le suffixe du match- séparateur à gauche du match),C
($'
qui est le suffixe du match lui-même).Enfin, nous faisons correspondre 3 ou 2 caractères et mélanger les matchs, nous donnant soit
BABCC
ouCCBAB
au hasard.la source
R , 78 octets
Essayez-le en ligne!
sample
3 reprend les valeurs aléatoires depuis0:9
, qui sont placés dans un vecteur comme ceci:a b a c c
. Nous avons maintenant une chance sur 50 d'inverser ce vecteur, puis de le concaténer et de l'imprimer.la source
rt
, mais pour une raison quelconque, je pensais que c'était plus long ....(
non-op est une bonne trouvaille :)PHP,
737266 bytesEdit: 66 octets grâce à la suggestion de @David.
Essayez-le en ligne!
la source
<?=strtr(rand()%2?AABCB:BCBAA,ABC,rand(0,9).rand(0,9).rand(0,9));
rand(0,3).rand(4,6).rand(7,9)
, mais là encore, ce n'est pas "uniformément aléatoire". Btw. Je n'étais pas familier avecrand()%2
, alors votre commentaire m'a aidé à améliorer légèrement ma solution de toute façon.<?=strtr(rand()%2?AABCB:BCBAA,ABC,join(array_rand(range(0,9),3)));
. Vous pouvez vérifier que learray_rand
deuxième paramètre de s ne renvoie ici que des résultats uniques (testé plus de 10 000 itérations).Rouge ,
147, 146125 octetsEssayez-le en ligne!
Ungolfed:
la source
Wolfram Language (Mathematica) , 59 octets
Essayez-le en ligne!
la source
Ruby ,
6059 octetsEssayez-le en ligne!
Il retourne une liste de chiffres.
la source
Python 3 + numpy, 69 octets
Explication
la source
C (gcc) ,
126119 octets-6 octets de @ceilingcat
Essayez-le en ligne!
la source
J , 35 octets
Essayez-le en ligne!
Je suis sûr que ça peut être joué beaucoup plus loin.
Explication:
la source