Der Satz vom unendlichen Affen besagt, dass eine Maschine, die einen endlosen Strom zufälliger Zeichen sendet, bei unendlicher Zeit immer einen bestimmten Text eingibt.
Das klingt für mich nach einer großartigen Idee für eine Herausforderung.
Verarbeiten
Um einen String A mit einem Affen zu versehen, müssen folgende Schritte ausgeführt werden:
- Nehmen Sie eine leere Zeichenfolge. Wir werden diesen String B nennen.
- Wählen Sie ein gleichmäßig zufälliges druckbares ASCII-Zeichen (Zeichen im Bereich
0x20
bis0x7E
) und fügen Sie dieses Zeichen zu B hinzu. - Wenn A eine Teilzeichenfolge von B ist, ist B unsere affengroße Zeichenfolge. Andernfalls wiederholen Sie Schritt 2, bis A eine Teilzeichenfolge von B ist.
Dieser Vorgang ist nur ein Beispiel. Je nach Sprache gibt es möglicherweise einfachere Methoden. Sie müssen diese Methode nicht genau befolgen, solange die gleiche Verteilung der Ausgaben erzielt wird.
Die Herausforderung
Schreiben Sie ein Programm oder eine Funktion, die bei einer nicht leeren Zeichenfolge in einem angemessenen Format eine affengroße Version dieser Zeichenfolge zurückgibt.
Ihr Programm muss praktisch nur für Eingaben mit einer Länge von 3 oder weniger funktionieren. Bei längeren Eingaben kann vorzeitig mit oder ohne Ausgabe beendet werden.
Beispiel
Leider ist es schwierig, Beispiele für diese Frage zu erstellen, da sie zufällig ist und große Ergebnisse liefert.
Ich kann jedoch ein einziges Beispiel für die Eingabe hi
in Hastebin angeben.
Wertung
Da es sich um Code-Golf , die Vorlage mit dem wenigsten Bytes gewinnt.
B
direkt generieren, indem wir eine nicht negative Anzahln
zufälliger Zeichen voranstellenA
. Das einzige wirkliche Problem ist dann, die Verteilung vonn
(ich wette auf eine geometrische Verteilung).W!}zH+ZOrd\k
, ähneln stark dem, was ein Affe eingegeben hat.Antworten:
C 192 Bytes
Probieren Sie es online!
Es ist jetzt ein Chaos, aber zumindest funktioniert es sogar für die Eckfälle ...
C636261 BytesVielen Dank an Jonathan Frech für das Speichern eines Bytes!
Probieren Sie es online!quelle
i
groß genug wird, ums[i]
auf den Nullterminator der Zeichenfolge (Zeichen 0) zu verweisen.ababc
und der Affe generiert!!abababc
wird Ihr Programm anhalten?Python , 79 Bytes
Probieren Sie es online!
Dies ist theoretisch sinnvoll, stürzt jedoch aufgrund der Rekursionsbeschränkungen von Python vorzeitig ab (Sie können sie weiter einstellen, um längere Ergebnisse zu erzielen).
Python, 84 Bytes
Probieren Sie es online!
Dieser sollte für relativ längere Zeichenfolgen funktionieren, da er nicht rekursiv ist und 5 Byte kostet.
quelle
s+'randint(32,126)'
randint(32,126)
würde eine Zeichenfolge der Zahl erzeugen, nicht die ASCII-Char-ZuordnungOhm v2 , 10 Bytes
Probieren Sie es online!
Erläuterung:
quelle
GNU sed + coreutils, 75 + 1 (r flag) = 76 Bytes
Probieren Sie es online! (Die Antwort für eine Eingabe der Länge 2 ist in vielen Durchläufen erforderlich, da Ihnen die zulässige TIO-Rechenzeit meistens ausgeht.)
Erläuterung:
Benchmark: ungefähre Angabe, nur zu Skalierungszwecken
quelle
Funky , 64 Bytes
Dies verwendet ein paar Tricks, die ich in Funky verwenden wollte, wie einen Variablennamen nach einem Schlüsselwort wie in
whileS
und die Tatsache, dass Zeichenfolgen implizit übergeordnet zurstring
Bibliothek sind.Ungolfed
Probieren Sie es online!
quelle
Haskell , 100 Bytes
Probieren Sie es online!
Grundlegende Idee ist, eine unendliche Liste von Zeichen mit zu generieren
randomRs
und anzuhalten, sobald wir die Zeichenkette gefunden haben.quelle
isPrefixOf
ist nicht im Standard-Prelude ...C # (.NET Core) , 86 Byte
Ich mag es nicht wirklich, wie viel das Erstellen der
Random
Instanz kostet, aber ich glaube nicht, dass es einen Weg gibt, dies zu umgehen.Probieren Sie es online!
quelle
Random.Next(Int32,Int32)
wird, exklusiv ist und daher keine der generierten Zahlen. Dies kann durch Ersetzen126
durch behoben werden127
.Random
können Sie die Variablendeklaration entfernen! 79 BytesPerl 5, 31 +2 (-pa) Bytes
Probieren Sie es online aus
quelle
\E$
irrelevant istJapt , 26 Bytes
Probieren Sie es online!
quelle
R ,
797675 Bytes-3 Bytes dank MickyT für den Wechsel des Zufallssamplers
-1 Byte Dank an Robin Ryder für die erneute Optimierung des Zufallssamplers
Probieren Sie es online!
quelle
intToUtf8(runif(1,32,127))
32+95*runif(1)
als Zufallsgenerator speichern .Kohle,
151412 BytesProbieren Sie es online! Link ist eine ausführliche Version des Codes. Bearbeiten: 2 Bytes aufgrund einer nachfolgenden Fehlerbehebung in Charcoal gespeichert. Erläuterung:
quelle
Ruby , 42 Bytes
Probieren Sie es online!
quelle
Pyth - 14 Bytes
Probieren Sie es hier online aus .
quelle
W!}Qk=+kpOrd\
ist ebenfalls 14 Bytes, SE ist mit der Formatierung durcheinander, weil nicht druckbar, aber der Bereich wird auf die gleiche Weise generiertMathematica, 65 Bytes
Probieren Sie es online!
-3 Bytes von Jonathan Frech
quelle
FromCharacterCode[RandomInteger@94+32]
ist gleichbedeutend mit der kürzerenRandomChoice@CharacterRange[32,126]
.Lua ,
99102 BytesProbieren Sie es online!
quelle
MATL ,
1716 BytesProbieren Sie es online!
-1 Byte danke an Giuseppe
quelle
Oktave , 62 Bytes
Probieren Sie es online!
Erläuterung:
Vielen Dank an Luis Mendo für die Änderungen!
quelle
isvector
durch ersetzennnz
? Undstrfind
vonregexp
. Sie können auchrandi(95)+31
die gesamtesprintf
Anweisung verwenden oder durcho=[o,randi(95)+31];
(implizite Konvertierung in char) ersetzenJapt ,
161411 BytesVersuch es
quelle
Alice , 21 Bytes
Probieren Sie es online!
Erläuterung
Dies ist der Rahmen für meist lineare Programme, die vollständig im Ordinal-Modus (Zeichenfolgenverarbeitung) arbeiten. Die IP springt zweimal diagonal auf und ab durch das Programm, was bedeutet, dass der tatsächliche Code etwas seltsam verschachtelt ist. Die Befehle lauten in der Reihenfolge, in der sie tatsächlich ausgeführt werden:
Lass uns das durchgehen:
quelle
Perl 6 , 39 Bytes
Probieren Sie es online!
(...)[*-1]
gibt das letzte Element der Sequenz zurück, die definiert ist durch...
:""
ist das erste Element;* ~ (" " .. "~").pick
generiert das nächste Element, indem ein zufälliges Zeichen im entsprechenden Bereich an das vorherige Element angehängt wird; und* ~~ /$_/
ist die Endbedingung, dh, das aktuelle Element entspricht dem Eingabeargument der Hauptfunktion$_
als literaler Teilstring.quelle
*~~
für -3 tio.run/##K0gtyjH7n1upoJamYPu/…Java 8,
817978 Bytes-1 Byte danke an @ OlivierGrégoire für den Hinweis auf einen (großen>. <) Fehler, den ich gemacht habe ..
Erläuterung:
Probieren Sie es hier aus.
quelle
32+Math.random()*95
. Dort ... Fehler behoben und ein Byte gespeichert! ;-)05AB1E ,
109 Bytes (-1 @ Emigna)Probieren Sie es online!
Mach den Affen mit mir.
quelle
Ω
anstelle von tun.R
.QBIC , 33 Bytes
Erläuterung
Probelauf:
quelle
PHP, 55 + 1 Bytes
Als Rohr mit laufen lassen
-nR
. Nicht geeignet für TIO wegen möglicher Zeitüberschreitung.Fügen Sie zwischen den Anführungszeichen für PHP älter als 7.1 ein Leerzeichen ein.
Diese 51 + 1-Byte- Version schlägt fehl, wenn die Eingabe wie folgt lautet
0
:quelle
Javascript 74 Bytes
ruf so an:
quelle
~b.search
anstelle vonb.includes
.Julia 0,6 , 53 Bytes
Probieren Sie es online!
quelle
Aufdringlich ,
20 bis18 BytesProbieren Sie es online!
Das Programm behält einen Stapel von
len(input)
Zeichen bei, entfernt den ersten ständig und hängt einen neuen zufälligen Buchstaben an, bis die anfängliche Eingabezeichenfolge erreicht ist. Jedes Zeichen wird beim Hinzufügen gedruckt, wodurch der gewünschte Effekt erzielt wird.Erläuterung:
quelle
Brachylog , 17 Bytes
Probieren Sie es online!
Kann Überlauf zufällig stapeln. Hierbei werden zwei kürzlich hinzugefügte Funktionen in Brachylog verwendet: globale Variablen und das Metapredikat "Schwanz anwenden"
ᵗ
.quelle
Pyth, 13 Bytes
wobei das nicht druckbare Zeichen 0x7F ist.
Prüfung
quelle
Bash 94 Bytes
Probieren Sie es online aus
quelle