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:
Die Länge beträgt 5 Ziffern
Es gibt zwei separate, sich wiederholende Ziffernpaare
Ein Satz wiederholter Ziffern befindet sich am Anfang oder Ende und die Ziffern stehen nebeneinander
Die ungerade Zahl ist von dem anderen Ziffernpaar umgeben
Die beiden Ziffernpaare und die andere Nummer sollten alle eindeutig sein
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 Code-Golf , also gewinnt die kürzeste Antwort in Bytes!
random
bedeutet das nicht einheitlichAntworten:
05AB1E , 11 Bytes
Probieren Sie es online!
Erläuterung
quelle
CJam (16 Bytes)
Online-Demo
Hinweis: Ich habe angenommen, dass mit "einzigartig" OP wirklich "eindeutig" bedeutet.
Auch für 16 Bytes:
Präparation
Die anderen Varianten erzeugen mit
[1 0 1 2 2]
und selektieren dann entweder das Ergebnis oder dessen Umkehrung.quelle
Perl 5 ,
816356 BytesSchneiden Sie 7 Bytes mit Inspiration von @DomHastings
Konstruieren Sie die Zahl aus dem entsprechenden Muster.
Probieren Sie es online!
Perl 5 , 89 Bytes
Wählt zufällige 5-stellige Zahlen aus, bis eine gefunden wird, die den Kriterien entspricht.
Probieren Sie es online!
quelle
time%2
es ausreichend zufällig ist oder nicht , da es gewissermaßen unter der Kontrolle des Benutzers steht.Python 2 , 80 Bytes
Probieren Sie es online!
Gibt eine Liste von Ziffern aus.
Python 2 , 83 Bytes
Probieren Sie es online!
Ausgabe ist eine Zahl.
quelle
APL (Dyalog Unicode) ,
22 21 20 1817 BytesProbieren Sie es online!
Wenn es akzeptabel ist, die Zahlen immer im gleichen Format auszugeben, kann dies entweder
1⌽1↓,∘⌽⍨3?10
oder auf 12 Byte gekürzt werden3⌽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?
quelle
Input
zum Aufrufen der Funktion verwendetg
. Außerdem wird dasg←
nicht in der Byteanzahl gezählt, da es nicht erforderlich ist, sondern nur zum Aufrufen der Funktion verwendet wird.g
im Eingabeabschnitt aufgerufen wird, ist nur eine Eigenheit, wie APL auf TIO(4∨?2)
speichert ein Byte über1 4[?2]
f
Zug zuweisen und verwenden. Das überlasse ich dir aber :)Java 8,
145136125119 Bytes-9 Bytes dank @ OlivierGrégoire.
-11 Bytes dank @RickHitchcock .
-6 Bytes dank @Nevay .
Erläuterung:
Probieren Sie es online aus.
quelle
v->{String r="";for(;!r.matches("(.)\\1(.).\\2|(.).\\3(.)\\4")|r.chars().distinct().count()!=3;r=(int)(Math.random()*1e5)+"");return r;}
(.).*\\1(.).*\\2
11 Bytes gekürzt werden .v->{String r;for(;!(r=(int)(Math.random()*1e5)+"").matches("((.).?\\2){2}")|r.chars().distinct().count()<3;);return r;}
Jelly , 23 Bytes
Probieren Sie es online!
quelle
Jelly ,
1211 BytesProbieren Sie es online!
Erläuterung
(*) Das richtige Argument von
ṃ
ist die['0','1','2',...,'9']
zufällig gemischte Liste mit 10 Elementen. Die Zahl13122
wird also in die bijektive Basis 10 ([1,3,1,2,2]
) konvertiert und in die Liste indexiert (wenn die Liste also istl
, ist der Rückgabewert des Atoms[l[1],l[3],l[1],l[2],l[2]]
, wobei Jelly 1-basierte Indexierung verwendet)quelle
JavaScript (ES6), 79 Byte
Probieren Sie es online!
Wie?
Math.random()
ergibt ein zufälliges Floaten in [0..1) . Wir+f
erzwingen 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.quelle
&&
kann sein&
. Wie funktioniert das[,,a,b,c,d]
? Ich habe noch nie einen Eingang wie[,,
vorher gesehen.a=4, b=2, c=1
deshalb scheitern4-2&4-1&2-1 == 2&3&1 == 0
. Ich habe eine kurze Erklärung zur Variablenzuordnung hinzugefügt.&&
,&
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.Perl 6 , 42 Bytes
Probieren Sie es online!
quelle
Schmutzig , 33 Bytes
Verwendet das
--numeric-output
Flag so, dass es lesbar ist, andernfalls würde es eine Folge von Steuerzeichen mit Codepunkten ausgeben, die den Ziffern entsprechen.Probieren Sie es online!
Erklärt:
quelle
Kohle , 34 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:
quelle
Retina , 40 Bytes
Probieren Sie es online!
Kann Zeichenfolgen mit führenden Nullen drucken.
Erläuterung
Initialisieren Sie die Zeichenfolge mit 10 Unterstrichen.
Wortzeichen zyklisch in Ziffern umwandeln. Das ist ein bisschen komisch. Das
w
und istd
die Abkürzung für die folgenden Zeichenfolgen:Zyklische Transliteration bedeutet, dass zunächst beide Zeichenfolgen bis zur Länge ihrer LCM wiederholt werden:
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:All das, um ein einzelnes Byte über der Literalzeichenfolge zu speichern
0369258147
. : DWie auch immer, wir haben jetzt eine Zeichenfolge mit allen 10 Ziffern.
Dies mischt die Ziffern. Die ersten drei Ziffern sind also eine gleichmäßig zufällige Auswahl von drei verschiedenen Ziffern.
Wir passen die Saite an
...ABC
und machen darausBABCC
. 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 (7
Null-Basis), dieAB
in...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).Schließlich ordnen wir entweder 3 oder 2 Zeichen zu und mischen die Übereinstimmungen, indem wir sie entweder
BABCC
oderCCBAB
zufällig eingeben.quelle
R , 78 Bytes
Probieren Sie es online!
sample
3 nimmt zufällige Werte von0:9
in 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.quelle
rt
, aber aus irgendeinem Grund dachte ich, sie wäre länger ...(
als No-Op ist ein guter Fund :)PHP,
737266 BytesEdit: 66 Bytes dank @Davids Vorschlag.
Probieren Sie es online!
quelle
<?=strtr(rand()%2?AABCB:BCBAA,ABC,rand(0,9).rand(0,9).rand(0,9));
rand(0,3).rand(4,6).rand(7,9)
, ist aber andererseits nicht "einheitlich zufällig". Btw. Ich war damit nicht vertrautrand()%2
, und Ihr Kommentar hat mir trotzdem geholfen, meine Lösung ein wenig zu verbessern.<?=strtr(rand()%2?AABCB:BCBAA,ABC,join(array_rand(range(0,9),3)));
. Sie können testen , ob derarray_rand
‚s zweite Parameter nur eindeutige Ergebnisse liefert hier (über 10000 Iterationen getestet).Rot ,
147, 146,125 BytesProbieren Sie es online!
Ungolfed:
quelle
Wolfram Language (Mathematica) , 59 Bytes
Probieren Sie es online!
quelle
Ruby ,
6059 BytesProbieren Sie es online!
Es wird eine Liste mit Ziffern zurückgegeben.
quelle
Python 3 + Anzahl, 69 Bytes
Erläuterung
quelle
C (GCC) ,
126119 Bytes-6 Bytes von @ceilingcat
Probieren Sie es online!
quelle
J , 35 Bytes
Probieren Sie es online!
Ich bin sicher, es kann viel weiter golfen werden.
Erläuterung:
quelle