Richard Dawkins beschreibt in seinem Buch The Blind Watchmaker ein Wiesel-Programm . Der Algorithmus kann wie folgt beschrieben werden:
Beginnen Sie mit einer zufälligen Zeichenfolge von 28 Zeichen. Gültige Zeichen sind alle Großbuchstaben und Leerzeichen.
Erstellen Sie 100 Kopien dieser Zeichenfolge, wobei für jedes Zeichen eine 5-prozentige Chance besteht, dass dieses Zeichen durch ein zufälliges Zeichen ersetzt wird.
Vergleichen Sie jede neue Zeichenfolge mit dem Ziel "METHINKS IT IS LIKE A WEASEL" und geben Sie jeder eine Punktzahl entsprechend der Anzahl der Buchstaben in der Zeichenfolge, die korrekt und an der richtigen Position sind.
Wenn eine der neuen Saiten eine perfekte Punktzahl hat (28), halten Sie an.
Wählen Sie die Saite mit der höchsten Punktzahl aus Schritt 3. Wie Sie ein Unentschieden ausarbeiten, liegt bei Ihnen. Es kann jedoch nur eine Saite ausgewählt werden. Nehmen Sie die gewählte Saite und fahren Sie mit Schritt 2 fort.
Der Gewinner ist das kürzeste Code-Snippet, um die richtige Antwort zu erhalten, während der String mit der höchsten Punktzahl jeder Generation im folgenden Format gedruckt wird:
Wenn die Leute helfen könnten, indem sie die Antworten anderer prüfen, wären sie sehr hilfreich!
Antworten:
APL (143)
Erläuterung:
0{
...}⊃∘(C←27↑⎕A)¨?28/27
: AufC
die ersten 27 Großbuchstaben setzen. Es gibt nur 26, also wird das 27. Element ein Leerzeichen sein. Wählen Sie 28 zufällige Elemente ausC
. Dies wird der erste sein⍵
. Die erste⍺
(Generation) wird sein0
.⍵≢T←'METHINKS IT IS LIKE A WEASEL
:T
auf den String setzen'METHINKS IT IS LIKE A WEASEL'
. Solange⍵
nicht gleich istT
:{
...}¨100⍴⊂⍵
: Machen Sie 100 Kopien von⍵
. Für jede dieser ...9≠?28/20
: Wählen Sie 28 Zufallszahlen von 1 bis 20. Erstellen Sie eine Bitmaske, wobei jede1
bedeutet, dass die Zufallszahl ungleich war9
. (Dies bedeutet eine 5% ige Chance von a0
).⍵{⍵:⍺⋄C[?27]}¨
: für jeden Buchstaben in⍵
, falls das entsprechende Bit vorhanden war1
, behalten Sie diesen Buchstaben bei, andernfalls ersetzen Sie ihn durch ein zufällig ausgewähltes Element ausC
.c←
: Speichere die 100 mutierten Strings inc
.G←{+/⍵=T}¨c
:c
Berechnen Sie für jedes Element in die Punktzahl (Anzahl der übereinstimmenden ZeichenT
) und speichern Sie die Punkte inG
.s←⌈/G
: Finde die maximale Punktzahl und speichere sie ins
.c←⊃c/⍨G=s
: Wählen Sie den ersten Punkt aus,c
dessen Punktzahl gleichs
(dem Maximum) ist, und speichern Sie ihnc
erneut.⎕←(⍕⍺),':'c'-- score:',s
: drucke die Generation im angegebenen Format (⍺
ist die aktuelle Generation,c
ist die aktuell beste Zeichenfolge,s
ist die Punktzahlc∇⍨1+⍺
: Inkrementieren Sie die Generierung und führen Sie die Mutation erneut mit der aktuell besten Zeichenfolge (c
) als Eingabe aus.quelle
Mathematica -
238236225Beispielausgabe
quelle
Python (273)
quelle
K
173,167/
quelle
Python: 282 Zeichen ohne Semikolon
278 mit:
quelle
JavaScript,
277246(Pfeilfunktion wird unterstützt; Einrückung nur zur besseren Lesbarkeit hinzugefügt)
Fühlen Sie sich frei zu ändern ,
alert
umconsole.log
wenn Sie ein angenehmeres Ausführungserlebnis wünschen.Hier gibt es ein paar raffinierte Golfbits:
Die Funktion
c
gibt ein zufälliges Zeichen aus der alphabetischen Zeichenfolge zurück" ABC..."
. Die Funktion verwendet ein Argument als Obergrenze für die Zufallsindexauswahl. Bei der Generierung des Basisstrings verwenden wir27
, damit sich die Funktion normal verhält.Wir missbrauchen dieses Verhalten jedoch, indem wir nach einer zufälligen Obergrenze von 540 Zoll fragen
h = c(540) || h
. In nur 5% derc
Fälle wird tatsächlich eine Zeichenfolge zurückgegeben (da 540 * .05 = 27). In den anderen 95% der Fälle überschreitet der zufällig ausgewählte Index die Länge der Zeichenfolge, sodass die Funktion zurückgegeben wirdundefined
. Dieser Falsey-Wert führt zu einer logischen ODER-Kaskadec(540) || h
, sodass der ursprünglichemap
Werth
verwendet wird (dh es findet kein Ersatz statt).Die Score-Summierbetrieb tut
f+=h=="METHINKS IT IS LIKE A WEASEL"[p]
, die sagt „hinzufügen ,true
um ,f
wenn der aktuellemap
Charakterh
entspricht denp
th Charakter des WEASEL string“. Der boolesche Zusatz number-plus-boolean erzwingt das boolesche Ergebnis entweder0
oder1
, was bedeutet, dassf
es nur dann inkrementiert wird, wenn eine Übereinstimmung mit der Ziel-WEASEL-Zeichenfolge vorliegt.quelle
v
im Code angegeben? Es wird dort nirgendwo anders erwähnt. Sie können sich 2 Zeichen sparen.v
ist ein Argument für die Pfeilfunktion gespeichert inc
:c = (v => ...)
. Wenn Sie eine Pfeilfunktion ohne Argumente definieren möchten, kostet sie zwei()=>...
statt nur eines Zeichens. Daherv=>...
ist es besser, nur ein nicht verwendetes Argument zu haben.k=s=[28]
und++
, ich hatte keine Ahnung!R (
245239238 Zeichen)Gibt:
...
quelle
0: ...
wenn du beim ersten Aufruf auf 1cat
aufsteigstc
? (+1 Trotzdem versuche ich seit einer Stunde etwas kürzeres zu machen und ich kann es immer noch nicht :))ifelse(…,h(f,1),…)
alle ausgewählten Positionen durch die gleichen zufälligen Zeichen ersetzt. Sie können die Regeln in diese Richtung interpretieren, aber es fühlt sich an, als würde man sie biegen, also würde ich es zumindest erwähnen. Zweitens ersetzen Sies=z
innerhalb der1:100
Schleife, sodass Sie nicht 100 Kopien derselben Zeichenfolge erstellen, sondern manchmal Kopien einer Kopie. Das scheint mir eine Regel zu brechen, nicht sie nur zu biegen.C 256
Einfache drei Schleifen, Initialisierung, Generierung neuer Zeichenfolgen aus Parent und Score, die mit derselben Anweisung berechnet werden. Es ist auch mit Einrückung nicht sehr lesbar.
C 252
Eine Schleife, wobei ein Array alle 101 Zeichenfolgen enthält.
Diese zweite Version verstößt gegen die Regeln, weil sie die Zeichenfolge aus (dem Äquivalent von) Schritt 1 druckt, aber entweder die letzte Zeichenfolge oder nicht. Ich bin ratlos, wie ich es reparieren kann, ohne in der Größe zu explodieren. Ich poste es trotzdem zur Inspiration.
C 256
Anderer Ansatz, anstatt ein Array mit 101 Zeichenfolgen zu erstellen, wird die Zeichenfolge nur 100 Mal neu generiert und die Strukturzuweisung zum einfachen Kopieren verwendet. Die Initialisierung erfolgt durch Starten des Zählers "100-mal wiederholen" bei -1 und sorgfältiges Behandeln durch strategisch ausgewähltes Nachinkrement. Trotz einer ganz anderen Herangehensweise ergibt sich genau das Gleiche wie beim ersten Versuch - 256 Zeichen.
quelle
C # - 436
quelle
Lua 5.1 (502)
Die minimierte Version:
und die leichter lesbare Version (mit Kommentaren!):
Um ehrlich zu sein, obwohl dies definitiv nicht gewinnen wird, war ich einfach froh, eine einigermaßen kurze Lösung für dieses Problem zu finden und zu minimieren ! (Betonung vernünftigerweise): p
quelle
SAS - 374
->
Mit Zeilenumbrüchen / Einzug / Kommentaren:
quelle
C
361331Nicht so gut wie Art's Lösung, aber hier ist mein (neuer) Versuch einer C-Lösung. 361 Zeichen, wenn Sie Zeilenumbrüche und Tabulatoren entfernen.
Edit: Die verschachtelte Schleife wurde entfernt und ein 1D-Array verwendet. Ich hatte gehofft, es würde einen größeren Unterschied machen, aber es hat mir nur 30 Zeichen erspart. Hier ist der Code:
Bearbeiten: Dies ist der originale, ungolfed Code für diejenigen, die wissen möchten, wie das "Golfen" gemacht wurde. Der Code erzeugt keine Warnungen, wenn er mit GCC kompiliert wird und -Wall und C99 aktiviert sind. Vielleicht bist du ein Golf-Neuling wie ich oder ein C-Neuling wie ich, oder vielleicht bist du nur neugierig. :) https://gist.github.com/cpx/97edbce4db3cb30c306a
quelle
Scala,
347341337 Zeichen:=>
quelle
println("%2d: %s -- score: %d".format(i,a,s(a))
kann auf geändert werdenprintln(f"$i%2d: $a%s -- score: ${s(a)}%d")
, wodurch 4 Zeichen gespart werden!def c=(' '+:('A'to'Z'))(r(27))
gibt mirerror: type mismatch; found : Int required: scala.collection.generic.CanBuildFrom[scala.collection.immutable.IndexedSeq[Char],Char,?]
PHP 442
Readbly:
quelle
if\for
, es ist bei 436. Sie könnten auch$n>90
für ein anderesr()
unds()
Funktionen gefunden. Hier sind die Änderungen mit Kommentaren: ideone.com/4ecZQc%s
ist immer gleich lang und der%d
ist linksbündig, daher können Sie stattdessen Folgendes verwenden:printf("%2d: $s -- score: $l\n",$i);
Java (632)
Java ist so eine ausführliche Sprache .. :(
quelle
Python (
330321)Lesbare Version:
Beispielausgabe:
Bearbeiten: Einige Zeichen basierend auf der Antwort von AMK und Timtechs wurden entfernt
quelle
sum(1for c in range(28)if n[c]==t[c])
kann aufsum(n[c]==t[c] for c in range(28))
(-3 Zeichen) gekürzt werdenimport random as r
zufrom random import*
und entfernen Sie dann die drei Instanzen vonr.
S
? Die Herausforderung setzt voraus, dass Sie mit einer zufälligen Zeichenfolge beginnen.PHP (
381 397 323 319312):Lesbare Version:
Optimierungspunkte (319):
Optimierungspunkte (312):
quelle
for
für$f=N;while($f--){
jedes für 3 Zeichen. und für einen anderen char:$n=rand(0,26);[...]chr($n?$n+64:32)
Rubin, 218
Beispiel laufen
quelle
Rubin -
225202203198 ZeichenRuby scheint in dieser Herausforderung bisher unterrepräsentiert zu sein, also dachte ich, ich würde es versuchen! Verbesserungen sind willkommen.
quelle
1
aber die Frage gibt an0
. Wenn Sie mit einleiten,g=-1
dann ist es in Ordnung. Es mag einen intelligenteren Weg geben, aber ich habe es so gemacht. Prost RubyGolfer.puts"#{g+=1}: #{$.,s=(0..99).map{n=(r=0..27).map{|i|x=[' ',*?A..?Z].sample;rand<0.05?x:s[i]||=x};[r.count{|i|n[i]=='METHINKS IT IS LIKE A WEASEL'[i]},n*'']}.max;s} -- score: #$."until$.>27
Ruby,
206200199Die erste Zeile ist einfach eine andere Art zu definieren
q=-2
,i=-1
undR=(0..27).to_a
. Alle Arbeiten werden in der 2. Zeile erledigt:quelle
Japt v2.0a0,
112108 BytesProbieren Sie es online!
-4 Bytes dank @ETHproductions.
Ausgepackt und wie es funktioniert
quelle
Japt
-R
, 94 BytesEine andere Herangehensweise, aber mit ein wenig Inspiration von Bubblers Lösung .
Testen Sie es (oder versuchen Sie es online )
Erläuterung
Linie 1
Das Ergebnis wird der Variablen zugewiesen
U
.Zeile 2
Das Ergebnis wird der Variablen zugewiesen
V
.Zeile 3
Das Ergebnis dieser Zeile wird implizit mit Zeilenumbrüchen und Ausgaben verknüpft.
quelle
Perl 5 , 219 Bytes
Probieren Sie es online!
quelle
Rubin - 410
Bearbeiten * Es schlägt derzeit fehl (aus irgendeinem Grund wird ein [any] auf 0 gesetzt (type => fixnum)). Das eigentliche Design stimmt jedoch, ich muss nur den Fehler finden, der das verursacht (es ist sehr mysteriös)
quelle
Python 284
quelle
JavaScript - 312
Es gibt oben bereits eine kürzere JS-Lösung, die jedoch experimentelle Zeigerfunktionen verwendet. Daher dachte ich, ich würde eine andere Lösung einbauen, die in jeder JS-Umgebung ausgeführt wird:
quelle
Java:
557534Ausgepackt:
quelle
PHP
429426421415hübscher Druck
Ich werde beim nächsten Mal eine weniger ausführliche Sprache brauchen
quelle
Python 2.7 - 319 Bytes
Sicher ist es nicht das kleinste, aber es hat Spaß gemacht, es zu programmieren.
Verwendet eine rekursive Funktion, sodass sie die maximale Rekursionstiefe erreichen kann, wenn die Zeichenfolge eine seltsame Abweichung aufweist.
Ein großes Dankeschön an Sp3000 für die Hilfe beim Golfen.
quelle
Julia, 281 Bytes
Golf gespielt:
Der Algorithmus selbst ist nicht sehr clever, aber hier sind ein paar coole Teile drin. Einen Zeichenbereich mit einem anderen Charakter Kombination dann in sie indizieren:
['A':'Z',' '][rand(1:27,n)]
und die Summe aus einer Anordnung von booleans nehmen (gemeinsam, aber ich liebe die Idee):sum(a.=="METHINKS IT IS LIKE A WEASEL".data)
. Ich bin froh, dass ich unter 300 bin!Ungolfed:
quelle