FACILE à mémoriser des numéros

41

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:

  1. La longueur est de 5 chiffres

  2. Il y a deux paires de chiffres répétés séparés

  3. Un ensemble de chiffres répétés est au début ou à la fin et les chiffres sont côte à côte

  4. Le nombre impair à l'extérieur est entouré par l'autre paire de chiffres

  5. Les paires de deux chiffres et l'autre nombre doivent tous être uniques

  6. 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 , donc la réponse la plus courte en octets gagne!

drham
la source
5
Je suggère "Sorties possibles (probabilité> 0)" et "Sorties non possibles (probabilité = 0)" plutôt que "Vérité" et "Falsie" - cela semble plus conforme à ce que je pense que vous demandez (et au Python )
Khuldraeseth na'Barya
9
Devons-nous imprimer une sortie telle que 09033 avec un zéro non significatif?
Xnor
3
Si la probabilité est uniforme, pouvez-vous préciser cela dans la question. Par défaut, randomne signifie pas uniformément ainsi
Jo King
3
peut-être ajouter 99233, pour convenir à comprendre
l4m2
3
Bienvenue chez PPCG! Beau premier défi.
Jonathan Allan

Réponses:

21

05AB1E , 11 octets

žh.r3£ûÁÂ)Ω

Essayez-le en ligne!

Explication

žh            # push "0123456789"
  .r          # random shuffle
    3£        # take the first 3
              # EX: 152
      û       # palendromize
              # EX: 15251
       Á      # rotate right
              # EX: 11525
        Â)    # pair with its reverse
              # EX: [11525, 52511]
          Ω   # pick one at random
Emigna
la source
Je me demande si Emigna ha ... voit la première réponse +1.
Urne magique Octopus
9

CJam (16 octets)

YmrG*98+ZbA,mrf=

Démo en ligne

Remarque: j'ai supposé que par "unique" OP signifie vraiment "distinct".

Aussi pour 16 octets:

98ZbA,mrf=W2mr#%
98ZbA,mrf=_W%]mR

Dissection

Ymr    e# Select a random number from [0 1]
G*98+  e# Multiply by 16 and add 98 to get 98 or 114
Zb     e# Base conversion in base 3 to get [1 0 1 2 2] or [1 1 0 2 0]
A,mr   e# Shuffle the numbers from 0 to 9
f=     e# Map "select the item at this index"

Les autres variantes génèrent en utilisant [1 0 1 2 2]puis en sélectionnant le résultat ou l'inverse.

Peter Taylor
la source
9

Perl 5 , 81 63 56 octets

Coupez 7 octets en vous inspirant de @DomHastings

Construire le nombre à partir du modèle approprié.

@q{0..9}++;say+(keys%q)[.5>rand?(2,2,0,1,0):(0,1,0,2,2)]

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.

$_=sprintf'%05d',0|rand 1E5until(/(.)\1(.)(.)\2/||/(.)(.)\1(.)\3/)&&$1-$2&$2-$3&$1-$3;say

Essayez-le en ligne!

Xcali
la source
Belle astuce en utilisant les touches de hachage pour le hasard! Je pense que cela équivaut à -8, même si j'ai peut-être manqué une affaire de bord ... Essayez-le en ligne!
Dom Hastings
1
Randomisation de hachage. Brillant! plus courte
Ton Hospel
La question est de savoir si oui ou non time%2est suffisamment aléatoire, car en un sens, il est sous le contrôle de l'utilisateur.
Xcali
@Xcali Il semble y avoir un consensus sur le fait que c'est bien tant que vous ne l'utilisez qu'une fois, alors je pense que vous devriez être bon.
FryAmTheEggman
8

Python 2 , 80 octets

from random import*
a,b,c=sample(range(10),3)
print[a,a,b,c,b][::choice((-1,1))]

Essayez-le en ligne!

Affiche une liste de chiffres.

Python 2 , 83 octets

from random import*
a,b,c=sample('0123456789',3)
print(a*2+b+c+b)[::choice((-1,1))]

Essayez-le en ligne!

La sortie est un nombre.

ovs
la source
Si le caractère aléatoire non uniforme est autorisé par défaut (la question ne spécifie pas), vous pouvez enregistrer des octets en échantillonnant également l'inverse: Essayez-le en ligne! Edit: Peu importe, je vois que l'uniformité a été modifiée dans la spécification. Je me demande si cette approche peut encore être sauvée.
xnor
7

APL (Dyalog Unicode) , 22 21 20 18 17 octets

(3∨?2)⌽1↓,∘⌽⍨3?10

Essayez-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?10ou 3⌽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?

(3∨?2)⌽1↓,∘⌽⍨3?10  Anonymous function.
              3?10   Deal 3 (distinct) random numbers from 0 to 9. (Assume 1 2 3)
                   Use that as both arguments for:
          ,∘⌽       Rotate (⌽), then concatenate (,).
                    Yields 3 2 1 1 2 3.
        1          Drop the first element. Our vector is now 2 1 1 2 3
                   Rotate the vector to the left using as argument:
(  ?2)              Roll 0 or 1 and...
 3                 Do the GCD between 3 and the result. (30=3; 31=1.)
                    This yields either 1 1 2 3 2 or 2 3 2 1 1.
J. Sallé
la source
L'entrée ne peut pas être donnée
drham
@drham il n'y a pas d'entrée dans la fonction. Dans ce cas, le champ TIO Inputest utilisé pour appeler la fonction g. En outre, le g←n'est pas compté dans le nombre d'octets car ce n'est pas nécessaire, il est uniquement utilisé pour appeler la fonction.
J. Sallé
Le fait que cela gsoit appelé dans la section input n'est qu'une bizarrerie sur la manière dont APL est configuré pour fonctionner sur TIO
H.PWiz
(4∨?2)enregistre un octet1 4[?2]
H.PWiz
1
Vous pouvez également enregistrer des octets en n'attribuant pas fet en n'utilisant pas de train. Je vous laisse ça cependant :)
H.PWiz
6

Java 8, 145 136 125 119 octets

v->{String r;for(;!(r=(int)(Math.random()*1e5)+"").matches("((.).?\\2){2}")|r.chars().distinct().count()<3;);return r;}

-9 octets grâce à @ OlivierGrégoire.
-11 octets grâce à @RickHitchcock .
-6 octets grâce à @Nevay .

Explication:

Essayez-le en ligne.

v->{            // Method with empty unused parameter and String return-type
  String r;     //  Result-String
  for(;!(r=(int)(Math.random()*1e5)+"")
                //  Generate a random number in the range [0; 100000) and set it to `r`
        .matches("(.).*\\1(.).*\\2")
                //   And continue doing this as long as it doesn't match the regex above,
       |r.chars().distinct().count()<3;);
                //   or doesn't have three distinct digits
  return r;}    //  Return the result
Kevin Cruijssen
la source
136 octets
Olivier Grégoire
@ OlivierGrégoire Avez-vous posté ceci au bon défi? ..: S Cela semble familier, mais ce n'est certainement pas ce défi ..
Kevin Cruijssen
Le truc moche a cassé mon lien ... En tout cas, voici le golf:v->{String r="";for(;!r.matches("(.)\\1(.).\\2|(.).\\3(.)\\4")|r.chars().distinct().count()!=3;r=(int)(Math.random()*1e5)+"");return r;}
Olivier Grégoire
1
Je pense que votre expression rationnelle peut être raccourcie (.).*\\1(.).*\\2, économisant 11 octets.
Rick Hitchcock
1
119 octets:v->{String r;for(;!(r=(int)(Math.random()*1e5)+"").matches("((.).?\\2){2}")|r.chars().distinct().count()<3;);return r;}
Nevay
5

Gelée , 23 octets

⁵Ḷṗ3⁼Q$ÐfXµḢ;`;ŒBW;U$µX

Essayez-le en ligne!

HyperNeutrino
la source
Bien, je voterais bien, mais je ne peux pas
drham,
7
@drham :) merci. vous devriez pouvoir le faire bientôt, une fois que la plupart des membres actifs se seront réveillés, votre question obtiendra probablement beaucoup de votes positifs. bon premier défi et bienvenue à PPCG en passant!
HyperNeutrino
5

Gelée , 12 à 11 octets

ØDẊ⁽0yṃ,U$X

Essayez-le en ligne!


Explication


ØDẊ⁽0yṃ,U$X    Niladic link, generate a random string.
ØD             List of digits, ['0','1','2',...,'9'].
  Ẋ            Random shuffle.
   ⁽0y         Number 13122.
      ṃ        Base decompression. (*)
       ,U$     Pair with its upend (reverse).
          X    Choose one (it or its reversed) randomly.

(*) 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 nombre 13122sera converti en base bijective 10 ( [1,3,1,2,2]) et indexé dans la liste (ainsi, si la liste est l, 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)

utilisateur202729
la source
(même idée que la réponse 05AB1E, est venue indépendamment)
user202729
... 05AB1E reçoit 6 votes positifs en raison de sa capacité à nouer Jelly, Jelly ne reçoit que 2 votes positifs en raison de son incapacité à gagner 05AB1E?
user202729
2
J'ai voté votre réponse. -> SPEECH 100 <---
L_Church
4

JavaScript (ES6), 79 octets

f=([,,d,a,b,c]=[...Math.random()+f])=>a-b&&a-c&&b-c?d&1?a+a+b+c+b:b+c+b+a+a:f()

Essayez-le en ligne!

Comment?

Math.random()donne un float aléatoire dans [0..1) . Nous utilisons +fpour 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.

Arnauld
la source
Les deux &&peuvent être &. Aussi, comment ça [,,a,b,c,d]marche? Je n'ai jamais vu une entrée comme [,,avant.
Kevin Cruijssen
1
@KevinCruijssen Un AND au niveau des bits échouerait par exemple pour a=4, b=2, c=1car 4-2&4-1&2-1 == 2&3&1 == 0. J'ai ajouté une brève explication sur l'affectation de variable.
Arnauld
Ah bien sur. Je viens d' essayer &&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.
Kevin Cruijssen
Ceci est simplement génial +1
Luis felipe De jesus Munoz
2

Sale , 33 octets

Utilise le --numeric-outputdrapeau pour le rendre lisible, sinon il produirait une chaîne de caractères de contrôle avec des points de code correspondant aux chiffres.

10⭧[1w#%D⅋№3⤱≠1ẅ&]1wẂ⭿⭣1u∅#1∧◌ŪW‼

Essayez-le en ligne!

A expliqué:

10⭧              put 10 on the right stack
[1w#%D⅋№3⤱≠1ẅ&] loop until there are 3 distinct positive numbers below 10 in the top stack
1wẂ              clean-up the right and top stacks
⭿               copy the top and bottom of the top stack to each-other
⭣                swap the first two elements of the top stack
1u               rotate the top stack by 1
∅#1∧◌ŪW          reverse the top stack half of the time
‼                print the top stack
Οurous
la source
2

charbon , 34 octets

≔‽χθ≔‽Φχ⁻ιθη↑I⟦θθη‽Φχ×⁻ιθ⁻ιηη⟧¿‽²‖

Essayez-le en ligne! Le lien est vers la version verbeuse du code. Explication:

  χ                                 Predefined variable 10
 ‽                                  Random element from implicit range
≔  θ                                Assign to variable `q`
       χ                            Predefined variable 10
      Φ                             Filter on implicit range
         ι                          Current value
          θ                         Variable `q`
        ⁻                           Subtract
     ‽                              Random element
    ≔      η                        Assign to variable `h`
                    χ               Predefined variable 10
                   Φ                Filter on implicit range
                       ι  ι         Current value
                        θ           Variable `q`
                           η        Variable `h`
                      ⁻  ⁻          Subtract
                     ×              Multiply
                  ‽                 Random element
               θθ                   Variable `q`
                 η          η       Variable `h`
              ⟦              ⟧      Wrap 5 values into array
             I                      Cast array elements to string
            ↑                       Make array print horizontally
                                ²   Literal 2
                               ‽    Random element from implicit range
                              ¿     If
                                 ‖  Reflect
Neil
la source
2

Retina , 40 octets


10*
Y`w`d
V?`
Lv$7`.(.)
$1$<'$'
O?`...?

Essayez-le en ligne!

Peut imprimer des chaînes avec des zéros non significatifs.

Explication


10*

Initialisez la chaîne à 10 caractères de soulignement.

Y`w`d

Traduire cycliquement les caractères des mots en chiffres. C'est un peu bizarre. Les wet dsont courts pour les chaînes suivantes, respectivement:

w: _0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
d: 0123456789

La translittération cyclique signifie qu’en premier lieu, les deux chaînes sont répétées à la longueur de leur LCM:

_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_012345...
0123456789012345678901234567890123456789012345678901234567890123456789...

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:

0369258147

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.

V?`

Cela mélange les chiffres. Les trois premiers chiffres constituent donc une sélection aléatoire uniforme de trois chiffres distincts.

Lv$7`.(.)
$1$<'$'

Nous faisons correspondre la chaîne ...ABCet la transformons en BABCC. 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 est ABdans ...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).

O?`...?

Enfin, nous faisons correspondre 3 ou 2 caractères et mélanger les matchs, nous donnant soit BABCCou CCBABau hasard.

Martin Ender
la source
2

R , 78 octets

z=sample(0:9,3)[c(2,1:3,3)];cat(paste(`if`(runif(1)>.5,z,rev(z)),collapse=''))

Essayez-le en ligne!

sample3 reprend les valeurs aléatoires depuis 0: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.

JAD
la source
Très agréable! 62 octets ; on dirait que vous êtes un peu à l'aise;)
Giuseppe
J'ai regardé utiliser rt, mais pour une raison quelconque, je pensais que c'était plus long ....
JAD
Et le (non-op est une bonne trouvaille :)
JAD
@ Giuseppe, votre réponse peut être complétée jusqu'à 55 octets ... TIO
JayCe
2

PHP, 73 72 66 bytes

<?=strtr(rand()%2?AABCB:BCBAA,ABC,join(array_rand(range(0,9),3)));

Edit: 66 octets grâce à la suggestion de @David.

Essayez-le en ligne!

rétroviseur
la source
Vous pouvez l'obtenir à 65 avec ceci:<?=strtr(rand()%2?AABCB:BCBAA,ABC,rand(0,9).rand(0,9).rand(0,9));
Davіd
@ David Malheureusement, votre solution enfreint la règle 5. Cela pourrait être comme 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 avec rand()%2, alors votre commentaire m'a aidé à améliorer légèrement ma solution de toute façon.
Retrowaver
1
ah oui, tu as raison. Je n'ai pas vu cette règle. J'ai un qui fonctionne maintenant, à 66 octets: <?=strtr(rand()%2?AABCB:BCBAA,ABC,join(array_rand(range(0,9),3)));. Vous pouvez vérifier que le array_randdeuxième paramètre de s ne renvoie ici que des résultats uniques (testé plus de 10 000 itérations).
David
@David merci, vient de mettre à jour mon post!
Retrowaver
1

Rouge , 147, 146 125 octets

func[][b: copy[]d:[1 1 2 3 2]if 1 = random 2[d: reverse d]while[4 > length? b][alter b(random 10)- 1]foreach a d[prin b/(a)]]

Essayez-le en ligne!

Ungolfed:

f: func[] [                       function with no arguments
    b: copy []                    an empty list
    d: [1 1 2 3 2]                preset digits at positons
    if 1 = random 2 [             generate 1 or 2 
        d: reverse d]             based on this choose to reverse the positions list
    while [4 > length? b] [       while we haven't chosen 3 different digits
        alter b (random 10) - 1   pick a random digit, if it's not in the list already
                                  append it to the list, otherwise remove it
    ]
    foreach a d [                 for each position
       prin b/(a)]                print the corresponding digit 
]
Galen Ivanov
la source
1

Ruby , 60 59 octets

->{a,b,c=[*0..9].sample 3;[[a,a,b,c,b],[b,c,b,a,a]].sample}

Essayez-le en ligne!

Il retourne une liste de chiffres.

Eric Duminil
la source
1

Python 3 + numpy, 69 octets

from pylab import*
r=choice
i=r(2)
print(r(10,3,0)[[1-i,0,1,2,-1-i]])

Explication

from pylab import*     
r=choice               # `choice` takes a range, number of samples, and wether repetition is allowed
i=r(2)                 # Single value in [0,1] to specify if repeated digits come on right or left
print(r(10,3,0)[[1-i,0,1,2,-1-i]])    # Construct output using index list and 3 random integers
utilisateur2699
la source
1

C (gcc) , 126 119 octets

-6 octets de @ceilingcat

#define R time(0)%10
b,n,m,k;f(){b=R^8;for(n=R;m==n|k==m|k==n;m=R,k=R);printf("%d%d%d%d%d",b?n:m,b?n:k,m,b?k:n,b?m:n);}

Essayez-le en ligne!

vazt
la source
0

J , 35 octets

[:u:48+[:|.^:(?&2:)2 2 1 0 1{3?10"_

Essayez-le en ligne!

Je suis sûr que ça peut être joué beaucoup plus loin.

Explication:

  3?10             - generates 3 different digits
7 0 3

  2 2 1 0 1{       - constructs a list using digits positions 0, 1 and 2

  2 2 1 0 1{3?10   
3 3 0 7 0

  |.^:(?&2:)       - generates 0 or 1 and if 1, reverses the list 

  |.^:(?&2:)2 2 1 0 1{3?10
0 7 0 3 3

   u:48+              - converts to char by adding 48 to each digit
   u:48+|.^:(?&2:)2 2 1 0 1{3?10
07033
Galen Ivanov
la source