EINFACHE Speicherung von Zahlen

41

Zahlen, die leicht zu merken sind, aber theoretisch nicht leicht zu machen sind

Ihre Herausforderung besteht darin, ein Programm / eine Funktion in einer beliebigen Sprache zu erstellen, die einheitliche Zufallszahlen generiert, die diesen Kriterien entsprechen:

  1. Die Länge beträgt 5 Ziffern

  2. Es gibt zwei separate, sich wiederholende Ziffernpaare

  3. Ein Satz wiederholter Ziffern befindet sich am Anfang oder Ende und die Ziffern stehen nebeneinander

  4. Die ungerade Zahl ist von dem anderen Ziffernpaar umgeben

  5. Die beiden Ziffernpaare und die andere Nummer sollten alle eindeutig sein

  6. Ihr Programm kann nach eigenem Ermessen Zahlen mit führenden Nullen unterstützen oder nicht. Wenn führende Nullen unterstützt werden, müssen sie in die Ausgabe einbezogen werden: 06088, nicht 6088. Wenn führende Nullen nicht unterstützt werden, sollten überhaupt keine Zahlen wie 06088 generiert werden.

Testfälle

Akzeptierte Ausgaben:

55373
55494
67611
61633
09033
99757
95944
22808
65622
22161

Nicht akzeptierte Ausgaben:

55555
77787
85855
12345
99233
12131
abcde
5033

Weitere akzeptable Testfälle finden Sie unter diesem Pastebin-Link .

Diese wurden mit diesem Python-Programm erstellt:

zufällig importieren
für i in range (100):

    if random.randint (0,100)> = 50: #Put pair touching at begin, falls true
        temp = [] #working array
        temp.append (random.randint (0,9)) # zufällige Ziffer anhängen
        temp.append (temp [0]) #nochmal die gleiche Ziffer anhängen

        x = random.randint (0,9)
        während x == temp [0]:
            x = random.randint (0,9)
        temp.append (x) #hänge eine weitere eindeutige Ziffer an

        y = random.randint (0,9)
        während y == temp [0] oder y == temp [2]:
            y = random.randint (0,9)
        temp.append (y) #hängt eine weitere eindeutige Ziffer und die vorherige eindeutige Ziffer an
        temp.append (x)

    sonst: #Berührendes Paar am Ende eingeben
        temp = [] #working array  
        temp.append (random.randint (0,9)) # zufällige Ziffer anhängen

        #Versuchen Sie es erneut, obwohl dies nicht eindeutig ist
        x = random.randint (0,9)
        während x == temp [0]:
            x = random.randint (0,9)
        temp.append (x) #hänge eine weitere eindeutige Ziffer an


        temp.append (temp [0]) #nochmal die gleiche 0-te Ziffer anhängen


        y = random.randint (0,9)
        während y == temp [0] oder y == temp [1]:
            y = random.randint (0,9)
        temp.append (y) #hängt zweimal eine andere eindeutige Ziffer an
        temp.append (y)

    tempstr = ""
    denn ich in temp:
        tempstr + = str (i)
    Drucktempstr

Das ist , also gewinnt die kürzeste Antwort in Bytes!

drham
quelle
5
Ich schlage "Mögliche Ausgaben (Wahrscheinlichkeit> 0)" und "Nicht mögliche Ausgaben (Wahrscheinlichkeit = 0)" anstelle von "Wahrheit" und "Falsch" vor - dies scheint eher mit dem übereinzustimmen, was ich denke, dass Sie fragen (und mit dem Python) ).
Khuldraeseth na'Barya
9
Müssen wir eine Ausgabe wie 09033 mit einer führenden Null drucken?
xnor
3
Wenn die Wahrscheinlichkeit einheitlich ist, können Sie dies in der Frage angeben. Standardmäßig randombedeutet das nicht einheitlich
Jo King
3
fügen Sie vielleicht 99233 hinzu, damit Sie bequem verstehen
l4m2
3
Willkommen bei PPCG! Schöne erste Herausforderung.
Jonathan Allan

Antworten:

21

05AB1E , 11 Bytes

žh.r3£ûÁÂ)Ω

Probieren Sie es online!

Erläuterung

ž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
quelle
Ich frage mich, ob Emigna die beste Antwort +1 sieht .
Magic Octopus Urn
9

CJam (16 Bytes)

YmrG*98+ZbA,mrf=

Online-Demo

Hinweis: Ich habe angenommen, dass mit "einzigartig" OP wirklich "eindeutig" bedeutet.

Auch für 16 Bytes:

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

Präparation

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"

Die anderen Varianten erzeugen mit [1 0 1 2 2]und selektieren dann entweder das Ergebnis oder dessen Umkehrung.

Peter Taylor
quelle
9

Perl 5 , 81 63 56 Bytes

Schneiden Sie 7 Bytes mit Inspiration von @DomHastings

Konstruieren Sie die Zahl aus dem entsprechenden Muster.

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

Probieren Sie es online!


Perl 5 , 89 Bytes

Wählt zufällige 5-stellige Zahlen aus, bis eine gefunden wird, die den Kriterien entspricht.

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

Probieren Sie es online!

Xcali
quelle
Netter Trick mit den Hash-Tasten für Zufälligkeit! Ich denke, das ist gleichbedeutend mit -8, obwohl ich vielleicht einen Randfall verpasst habe ... Probieren Sie es online aus!
Dom Hastings
1
Hash-Randomisierung. Brillant! kürzer
Ton Hospel
Die Frage ist, ob time%2es ausreichend zufällig ist oder nicht , da es gewissermaßen unter der Kontrolle des Benutzers steht.
Xcali
@Xcali Es scheint Konsens zu sein, dass es in Ordnung ist, solange du es nur einmal verwendest, also denke ich, dass du gut sein solltest.
FryAmTheEggman
8

Python 2 , 80 Bytes

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

Probieren Sie es online!

Gibt eine Liste von Ziffern aus.

Python 2 , 83 Bytes

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

Probieren Sie es online!

Ausgabe ist eine Zahl.

ovs
quelle
Wenn standardmäßig eine ungleichmäßige Zufälligkeit zulässig ist (in der Frage nicht angegeben), können Sie Bytes sparen, indem Sie auch die Umkehrung abtasten: Probieren Sie es online aus! Bearbeiten: Egal, ich sehe, dass die Spezifikation einheitlich bearbeitet wurde. Ich frage mich, ob dieser Ansatz noch geborgen werden kann.
Xnor
7

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

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

Probieren Sie es online!

Wenn es akzeptabel ist, die Zahlen immer im gleichen Format auszugeben, kann dies entweder 1⌽1↓,∘⌽⍨3?10oder auf 12 Byte gekürzt werden 3⌽1↓,∘⌽⍨3?10.

Ein Byte wurde gespeichert, indem das unnötige entfernt wurde .

Dank H.PWiz wurde ein Byte gespeichert, und aufgrund des Tipps 2 weitere Bytes.

Dank ngn wurde ein Byte gespeichert.

Die Funktion übernimmt ⎕IO←0( I ndex O rigin).


Wie?

(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é
quelle
Eingabe nicht möglich
drham
@ drham Es gibt keine Eingabe für die Funktion. In diesem Fall wird das TIO-Feld Inputzum Aufrufen der Funktion verwendet g. Außerdem wird das g←nicht in der Byteanzahl gezählt, da es nicht erforderlich ist, sondern nur zum Aufrufen der Funktion verwendet wird.
J. Sallé
Die Tatsache, dass gim Eingabeabschnitt aufgerufen wird, ist nur eine Eigenheit, wie APL auf TIO
H.PWiz am
(4∨?2)speichert ein Byte über1 4[?2]
H.PWiz
1
Sie können auch Bytes sparen, indem Sie keinen fZug zuweisen und verwenden. Das überlasse ich dir aber :)
H.PWiz
6

Java 8, 145 136 125 119 Bytes

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

-9 Bytes dank @ OlivierGrégoire.
-11 Bytes dank @RickHitchcock .
-6 Bytes dank @Nevay .

Erläuterung:

Probieren Sie es online aus.

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
quelle
136 Bytes
Olivier Grégoire
@ OlivierGrégoire Hast du dies bei der richtigen Herausforderung gepostet? ..: S Es kommt mir bekannt vor, aber es ist sicherlich nicht diese Herausforderung ..
Kevin Cruijssen
Das kleine Ding hat meine Verbindung unterbrochen ... Wie auch immer, hier ist der 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
Ich denke, Ihre Regex kann auf (.).*\\1(.).*\\211 Bytes gekürzt werden .
Rick Hitchcock
1
119 Bytes:v->{String r;for(;!(r=(int)(Math.random()*1e5)+"").matches("((.).?\\2){2}")|r.chars().distinct().count()<3;);return r;}
Nevay
5

Jelly , 23 Bytes

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

Probieren Sie es online!

HyperNeutrino
quelle
Nizza, ich würde stimmen, aber ich kann nicht
Drham
7
@ drham :) danke. Sobald die meisten aktiven Mitglieder aufwachen, wird Ihre Frage wahrscheinlich viele positive Stimmen erhalten. gute erste herausforderung und übrigens willkommen bei PPCG!
HyperNeutrino
5

Jelly , 12 11 Bytes

ØDẊ⁽0yṃ,U$X

Probieren Sie es online!


Erläuterung


Ø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.

(*) Das richtige Argument von ist die ['0','1','2',...,'9']zufällig gemischte Liste mit 10 Elementen. Die Zahl 13122wird also in die bijektive Basis 10 ( [1,3,1,2,2]) konvertiert und in die Liste indexiert (wenn die Liste also ist l, ist der Rückgabewert des Atoms [l[1],l[3],l[1],l[2],l[2]], wobei Jelly 1-basierte Indexierung verwendet)

user202729
quelle
(Dieselbe Idee wie die 05AB1E-Antwort, wurde unabhängig entwickelt)
user202729
... 05AB1E 6 Upvotes erhalten, weil Jelly gebunden werden kann, Jelly nur 2 Upvotes erhalten, weil 05AB1E nicht gewonnen werden kann?
user202729
2
Ich habe deine Antwort positiv bewertet. -> SPEECH 100 <---
L_Church
4

JavaScript (ES6), 79 Byte

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()

Probieren Sie es online!

Wie?

Math.random()ergibt ein zufälliges Floaten in [0..1) . Wir +ferzwingen Zwang an einer Schnur. Wir ignorieren dabei die führende Null und den Dezimalpunkt [,,( destrukturierende Zuordnung der ersten beiden Zeichen zu nichts) und sammeln die ersten 4 Dezimalstellen in d , a , b und c .

Wenn a , b und c drei verschiedene Ganzzahlen sind, erstellen wir die endgültige Ausgabe entweder im AABCB- oder im BCBAA- Format (wobei wir die Parität von d verwenden , um zu entscheiden). Ansonsten versuchen wir es erneut, bis sie es sind.

In dem höchst unwahrscheinlichen Fall Math.random(), dass ein Wert ohne ausreichende Nachkommastellen zurückgegeben wird, wird mindestens c auf ein nicht-stelliges Zeichen gesetzt, wodurch der Test fehlschlägt und der rekursive Aufruf erfolgt. Wenn a , b und c gültige Ganzzahlen sind, ist garantiert, dass d auch eine gültige Ganzzahl ist, sodass diese nicht getestet werden muss.

Arnauld
quelle
Beides &&kann sein &. Wie funktioniert das [,,a,b,c,d]? Ich habe noch nie einen Eingang wie [,,vorher gesehen.
Kevin Cruijssen
1
@KevinCruijssen Ein bitweises UND würde zum Beispiel a=4, b=2, c=1deshalb scheitern 4-2&4-1&2-1 == 2&3&1 == 0. Ich habe eine kurze Erklärung zur Variablenzuordnung hinzugefügt.
Arnauld
Ah natürlich. Ich habe gerade versucht &&, &in TIO und es gab korrekte Ausgaben, also nahm ich an, dass es möglich war. Wusste nicht, &anstatt &&sonst gültige Ausgaben herauszufiltern. Und danke für die zusätzliche Erklärung zu der Destrukturierungsaufgabe, die ich noch nie gesehen habe.
Kevin Cruijssen
Dies ist einfach fantastisch +1
Luis Felipe De Jesus Munoz
2

Schmutzig , 33 Bytes

Verwendet das --numeric-outputFlag so, dass es lesbar ist, andernfalls würde es eine Folge von Steuerzeichen mit Codepunkten ausgeben, die den Ziffern entsprechen.

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

Probieren Sie es online!

Erklärt:

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
quelle
2

Kohle , 34 Bytes

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:

  χ                                 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
quelle
2

Retina , 40 Bytes


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

Probieren Sie es online!

Kann Zeichenfolgen mit führenden Nullen drucken.

Erläuterung


10*

Initialisieren Sie die Zeichenfolge mit 10 Unterstrichen.

Y`w`d

Wortzeichen zyklisch in Ziffern umwandeln. Das ist ein bisschen komisch. Das wund ist ddie Abkürzung für die folgenden Zeichenfolgen:

w: _0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
d: 0123456789

Zyklische Transliteration bedeutet, dass zunächst beide Zeichenfolgen bis zur Länge ihrer LCM wiederholt werden:

_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_012345...
0123456789012345678901234567890123456789012345678901234567890123456789...

Da die Zeichenkettenlängen 53 und 10 Coprime sind, wird jede Kopie von _mit einer anderen Ziffer gepaart. Und jetzt ersetzt die zyklische Transliteration die i- te Kopie von _durch die i- te Paarung in dieser erweiterten Liste. Am Ende haben wir also die folgende Zeichenfolge:

0369258147

All das, um ein einzelnes Byte über der Literalzeichenfolge zu speichern 0369258147. : D

Wie auch immer, wir haben jetzt eine Zeichenfolge mit allen 10 Ziffern.

V?`

Dies mischt die Ziffern. Die ersten drei Ziffern sind also eine gleichmäßig zufällige Auswahl von drei verschiedenen Ziffern.

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

Wir passen die Saite an ...ABCund machen daraus BABCC. Die Art und Weise, wie wir dies tun, ist allerdings etwas verrückt und spart wiederum nur ein Byte im Vergleich zu einem einfacheren Ansatz. Wir passen zuerst alle überlappenden ( v) Zeichenpaare an und erfassen das zweite ( .(.)). Dann behalten wir nur das achte Spiel ( 7Null-Basis), die ABin ...ABC. Dann ersetzen wir ( $) durch: B( $1) ABC( $<'das ist das Suffix des Match- Separators links vom Match) C( $'das ist das Suffix des Matches selbst).

O?`...?

Schließlich ordnen wir entweder 3 oder 2 Zeichen zu und mischen die Übereinstimmungen, indem wir sie entweder BABCCoder CCBABzufällig eingeben.

Martin Ender
quelle
2

R , 78 Bytes

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

Probieren Sie es online!

sample3 nimmt zufällige Werte von 0:9in einem Vektor, der wie so platziert sind: a b a c c. Jetzt haben wir eine 50/50-Chance, diesen Vektor umzukehren und dann zu verketten und zu drucken.

JAD
quelle
Sehr schön! 62 Bytes ; Sieht aus wie Sie ein wenig aus der Übung sind;)
Giuseppe
Ich habe mir die Verwendung angeschaut rt, aber aus irgendeinem Grund dachte ich, sie wäre länger ...
JAD
Und das (als No-Op ist ein guter Fund :)
JAD
@ Giuseppe Ihr Asnwer kann weiter zu 55 Bytes
Golf gespielt werden
2

PHP, 73 72 66 Bytes

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

Edit: 66 Bytes dank @Davids Vorschlag.

Probieren Sie es online!

retrowaver
quelle
Sie können es auf 65 mit diesem bekommen:<?=strtr(rand()%2?AABCB:BCBAA,ABC,rand(0,9).rand(0,9).rand(0,9));
Davіd
@David Deine Lösung verstößt leider gegen Regel 5. Es könnte so sein rand(0,3).rand(4,6).rand(7,9), ist aber andererseits nicht "einheitlich zufällig". Btw. Ich war damit nicht vertraut rand()%2, und Ihr Kommentar hat mir trotzdem geholfen, meine Lösung ein wenig zu verbessern.
Retrowaver
1
ah ja du hast recht Ich habe diese Regel nicht gesehen. Ich habe ein bekam , die jetzt bei arbeitet 66 Bytes: <?=strtr(rand()%2?AABCB:BCBAA,ABC,join(array_rand(range(0,9),3)));. Sie können testen , ob der array_rand‚s zweite Parameter nur eindeutige Ergebnisse liefert hier (über 10000 Iterationen getestet).
Davіd
@ David danke, habe gerade meinen Beitrag aktualisiert!
Retrowaver
1

Rot , 147, 146, 125 Bytes

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)]]

Probieren Sie es online!

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
quelle
1

Ruby , 60 59 Bytes

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

Probieren Sie es online!

Es wird eine Liste mit Ziffern zurückgegeben.

Eric Duminil
quelle
1

Python 3 + Anzahl, 69 Bytes

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

Erläuterung

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
user2699
quelle
1

C (GCC) , 126 119 Bytes

-6 Bytes von @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);}

Probieren Sie es online!

vazt
quelle
0

J , 35 Bytes

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

Probieren Sie es online!

Ich bin sicher, es kann viel weiter golfen werden.

Erläuterung:

  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
quelle