Ein Wieselprogramm Golf spielen

65

Richard Dawkins beschreibt in seinem Buch The Blind Watchmaker ein Wiesel-Programm . Der Algorithmus kann wie folgt beschrieben werden:

  1. Beginnen Sie mit einer zufälligen Zeichenfolge von 28 Zeichen. Gültige Zeichen sind alle Großbuchstaben und Leerzeichen.

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

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

  4. Wenn eine der neuen Saiten eine perfekte Punktzahl hat (28), halten Sie an.

  5. 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:

Antworten in diesem Format bitte

Wenn die Leute helfen könnten, indem sie die Antworten anderer prüfen, wären sie sehr hilfreich!

Noelkd
quelle
4
Welche Zeichen sind erlaubt? Unicode? Kleinbuchstaben?
Oriol
4
Ah, ich liebe Dawkins. Schönheit und Durchführbarkeit der Evolution in einem einfachen Algorithmus gezeigt.
Cruncher
Kann Schritt 4 besser ersetzt werden durch "Schritt 1.5) Wenn die neuen Saiten eine perfekte Punktzahl haben (28), halten Sie an" und "Schritt 4) Nehmen Sie die Saite mit der höchsten Punktzahl und fahren Sie mit Schritt 1.5 fort." Das heißt, wenn die anfängliche zufällige Zeichenfolge ein Gewinner ist, müssen wir auffächern?
Rob Starling
1
Ich bin ein bisschen verwirrt über die Reihenfolge der Operationen hier. Ist die Absicht, dass wir 100 neue Zeichenfolgen erstellen, die auf der ursprünglichen Zeichenfolge basieren? Oder sind es 100 neue Zeichenfolgen, wobei die erste Zeichenfolge auf der ursprünglichen und jede nachfolgende Zeichenfolge auf der vorherigen Zeichenfolge basiert? Die Beschreibung des Algorithmus scheint die erstere zu implizieren, während die Stichprobenausgabe die letztere zu sein scheint.
Iszi
2
Die Anweisungen sind ziemlich klar, aber was ist, wenn die ursprüngliche Zeichenfolge das Ziel ist?
Christian Palmstierna

Antworten:

27

APL (143)

0{⍵≢T←'METHINKS IT IS LIKE A WEASEL':c∇⍨1+⍺⊣⎕←(⍕⍺),':'c'-- score:',s⊣c←⊃c/⍨G=s←⌈/G←{+/⍵=T}¨c←{⍵{⍵:⍺⋄C[?27]}¨9≠?28/20}¨100⍴⊂⍵}⊃∘(C←27↑⎕A)¨?28/27

Erläuterung:

  • 0{... }⊃∘(C←27↑⎕A)¨?28/27: Auf Cdie ersten 27 Großbuchstaben setzen. Es gibt nur 26, also wird das 27. Element ein Leerzeichen sein. Wählen Sie 28 zufällige Elemente aus C. Dies wird der erste sein . Die erste (Generation) wird sein 0.

  • ⍵≢T←'METHINKS IT IS LIKE A WEASEL: Tauf den String setzen 'METHINKS IT IS LIKE A WEASEL'. Solange nicht gleich ist T:

    • {... }¨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 jede 1bedeutet, dass die Zufallszahl ungleich war 9. (Dies bedeutet eine 5% ige Chance von a 0).
      • ⍵{⍵:⍺⋄C[?27]}¨: für jeden Buchstaben in , falls das entsprechende Bit vorhanden war 1, behalten Sie diesen Buchstaben bei, andernfalls ersetzen Sie ihn durch ein zufällig ausgewähltes Element aus C.
    • c←: Speichere die 100 mutierten Strings in c.
    • G←{+/⍵=T}¨c: cBerechnen Sie für jedes Element in die Punktzahl (Anzahl der übereinstimmenden Zeichen T) und speichern Sie die Punkte in G.
    • s←⌈/G: Finde die maximale Punktzahl und speichere sie in s.
    • c←⊃c/⍨G=s: Wählen Sie den ersten Punkt aus, cdessen Punktzahl gleich s(dem Maximum) ist, und speichern Sie ihn cerneut.
    • ⎕←(⍕⍺),':'c'-- score:',s: drucke die Generation im angegebenen Format ( ist die aktuelle Generation, cist die aktuell beste Zeichenfolge, sist die Punktzahl
    • c∇⍨1+⍺: Inkrementieren Sie die Generierung und führen Sie die Mutation erneut mit der aktuell besten Zeichenfolge ( c) als Eingabe aus.
Marinus
quelle
5
Erläuterung? Das sieht aus wie Buchstabensuppe! :)
ToastyMallows
2
@ToastyMallows: added Erklärung
marinus
1
Beste Antwort bisher, toll, eine Erklärung dazu zu haben.
Noelkd
1
@marinus Bist du ein Zauberer?
ToastyMallows
3
Bullcrap, Sie haben gerade MS Word geöffnet und die Schriftart
WingDings
11

Mathematica - 238 236 225

c:="@"~CharacterRange~"Z"~RandomChoice~28/."@"->" "
For[s=""<>c;i=0,{d,s}=Sort[{#~HammingDistance~"METHINKS IT IS LIKE A WEASEL",#}&@
StringReplace[s,_/;20Random[]<1:>c〚1〛]&~Array~100]〚1〛;
d>0Print[i++,":"s," -- score: ",28-d],]

Beispielausgabe

0:  CYPMEIHADXRXVTFHERYOZNRVFCSQ  -- score: 0
1:  CYPMEIHADIRXVTFBERYOZNRVFCSQ  -- score: 1
2:  CYPMEIHA IRXVTFBIRYOZNRVFCSQ  -- score: 3
...
50:  METHINKS IT IS LIKE A WEASEL  -- score: 28
ybeltukov
quelle
9

Python (273)

from random import choice as c
n=range
a=map(chr,n(65,91)+[32])
s=map(c,[a]*28)
p=x=0
while p<28:
 p,s=max((sum(g==r for g,r in zip(y,'METHINKS IT IS LIKE A WEASEL')),y)for y in ([c(a+[x]*513)for x in s]for _ in n(100)));print '%d: %s -- score: %d' % (x,''.join(s),p);x+=1
tecywiz121
quelle
6

K 173, 167

o:"METHINKS IT IS LIKE A WEASEL"
i:0;{~x~o}{-1($i),": ",(r:a@*&b=c)," -- score: ",$c:max@b:+/'o=/:a:{x{if[0~*1?20;x[y]:*1?s];x}/!#x}'100#,x;i+:1;r}/28?s:"c"$32,65+!26;

/

0: FQRZPHACDIBHZOUUCYKKFBJWVNVI -- score: 1
1: FQRZP ACDITHCOUUCYKKFBJWVNVI -- score: 2
2: FQRZP AFDIT COUUCYKKFBJWVNVI -- score: 3
...
51: METHINKS IT IS LIKECA WEASEL -- score: 27
52: METHINKS IT IS LIKECA WEASEL -- score: 27
53: METHINKS IT IS LIKE A WEASEL -- score: 28
tmartin
quelle
6

Python: 282 Zeichen ohne Semikolon

from random import*
g,r,l,c=0,0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ ",choice
k=map(c,[l]*28)
while(r!=28):
 r,k=max((sum(i==j for i,j in zip(t,"METHINKS IT IS LIKE A WEASEL")),t)for t in[[c(l)if random()<.05 else i for i in k]for i in[1]*100])
 print`g`+":","".join(k),"-- score:",`r`
 g+=1

278 mit:

from random import*;g,r,l,c=0,0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ ",choice;k=map(c,[l]*28)
while(r!=28):r,k=max((sum(i==j for i,j in zip(t,"METHINKS IT IS LIKE A WEASEL")),t)for t in[[c(l)if random()<.05 else i for i in k]for i in[1]*100]);print`g`+":","".join(k),"-- score:",`r`;g+=1
Noelkd
quelle
4
Sie sollten die Sprache explizit angeben, und da die Frage mit Code-Golf gekennzeichnet ist, sollten Sie eine Zeichenanzahl angeben.
Tim Seguine
Werde es tun, danke für die tipps tim.
Noelkd
Sie sollten auch alle Variablennamen mit einem Buchstaben verwenden, um die Zeichenanzahl weiter zu verringern.
Türklinke
Warten Sie bis später, um noch ein bisschen Golf zu spielen, und haben Sie trotzdem ein paar leichte Gewinne. Vielen Dank.
Noelkd
1
Soll es wirklich mit allen gleichen Buchstaben beginnen? :)
Joachim Isaksson
5

JavaScript, 277 246

c=m=>" ABCDEFGHIJKLMNOPQRSTUVWXYZ"[0|Math.random()*m];for(s=[k=28];e=k;s[--k]=c(27));for(;alert(k+++": "+s.join("")+" -- score: "+e),e<28;s=t)for(z=100;f=0,z--;f>e&&(t=n,e=f))n=s.map((h,p)=>(h=c(540)||h,f+=h=="METHINKS IT IS LIKE A WEASEL"[p],h))

(Pfeilfunktion wird unterstützt; Einrückung nur zur besseren Lesbarkeit hinzugefügt)

// c() returns a random char using `m` as an index max
c=m=>" ABCDEFGHIJKLMNOPQRSTUVWXYZ"[0|Math.random()*m];

// generate base string `s`
for(s=[k=28];e=k;s[--k]=c(27));

// while score `e` is < 28
for(;alert(k+++": "+s.join("")+" -- score: "+e),e<28;s=t)
    for(z=100;f=0,z--;f>e&&(t=n,e=f))            // do 100 mutations; keep best score
        n=s.map((h,p)=>(                         // map `s` to `n` with 5% mutation
            h=c(540)||h,                         // change the char in 5% of cases
            f+=h=="METHINKS IT IS LIKE A WEASEL"[p],  // score++ if char matches
            h                                    // arrow function return character
        ))

Fühlen Sie sich frei zu ändern , alertumconsole.log wenn Sie ein angenehmeres Ausführungserlebnis wünschen.

Hier gibt es ein paar raffinierte Golfbits:

  • Die Funktion cgibt 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 wir 27, 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% der cFä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 wird undefined. Dieser Falsey-Wert führt zu einer logischen ODER-Kaskade c(540) || h, sodass der ursprüngliche mapWert hverwendet wird (dh es findet kein Ersatz statt).

  • Die Score-Summierbetrieb tut f+=h=="METHINKS IT IS LIKE A WEASEL"[p], die sagt „hinzufügen , trueum , fwenn der aktuelle mapCharakter hentspricht den pth Charakter des WEASEL string“. Der boolesche Zusatz number-plus-boolean erzwingt das boolesche Ergebnis entweder 0oder 1, was bedeutet, dass fes nur dann inkrementiert wird, wenn eine Übereinstimmung mit der Ziel-WEASEL-Zeichenfolge vorliegt.

Apsillers
quelle
Warum hast du vim Code angegeben? Es wird dort nirgendwo anders erwähnt. Sie können sich 2 Zeichen sparen.
WallyWest
1
@ Eliseod'Annunzio vist ein Argument für die Pfeilfunktion gespeichert in c: c = (v => ...). Wenn Sie eine Pfeilfunktion ohne Argumente definieren möchten, kostet sie zwei ()=>...statt nur eines Zeichens. Daher v=>...ist es besser, nur ein nicht verwendetes Argument zu haben.
Apsillers
Clevere Verwendung von Code!
WallyWest
Netter Trick mit k=s=[28]und ++, ich hatte keine Ahnung!
Dom Hastings
5

R ( 245 239 238 Zeichen)

t=strsplit("METHINKS IT IS LIKE A WEASEL","")[[1]]
h=sample
s=h(f<-c(LETTERS," "),28,T)
c=0
while(!all(s==t)){for(i in 1:100){z=ifelse(runif(28)<.05,h(f,1),s)
y=sum(s==t)
if(sum(z==t)>y)s=z}
cat(c<-c+1,": ",s," -- score: ",y,"\n",sep="")}

Gibt:

1: HSSSIMJM ETJISGBSCIELUYPLSED -- score: 7
2: HSSSIMJM ETJISGBSKIELUYPLSED -- score: 8
3: EETLITLM ETJISTBSKIELUYLLSEL -- score: 11

...

78: METHINKS IT IS LIKEEA WEASEL -- score: 27
79: METHINKS IT IS LIKEEA WEASEL -- score: 27
80: METHINKS IT IS LIKEEA WEASEL -- score: 27
81: METHINKS IT IS LIKE A WEASEL -- score: 28
Henrik
quelle
Wie bekommst du deine erste Zeile, 0: ...wenn du beim ersten Aufruf auf 1 cataufsteigst c? (+1 Trotzdem versuche ich seit einer Stunde etwas kürzeres zu machen und ich kann es immer noch nicht :))
Plannapus
@plannapus Das stimmt, war von einer alten Version (die etwas länger war). Entweder ändere ich es zu Beginn auf -1 oder verwende 1 in der ersten Zeile ...
Henrik
Ich sehe zwei Probleme mit Ihrem Code. Erstens werden dadurch 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 Sie s=zinnerhalb der 1:100Schleife, 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.
MVG
5

C 256

char c[101][29],s,n,z,b,j,i,w;g;main(){for(;w<28;printf("%d: %s -- score: %d\n",g++,c[b=n],w))for(i=w=0;i<101;i++)for(s=j=0;j<28&&!(i==b&&g);j++)(s+=(c[i][j]=g&&rand()%20?c[b][j]:(z=rand()%27)?'A'+z-1:' ')=="METHINKS IT IS LIKE A WEASEL"[j])>w?n=i,w=s:0;}

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

i,g,n,b,o,s,w,z;char c[2929];main(){for(;(o=i%29)|i|w<28;(i=(i+1)%2929)||printf("%d: %s -- score: %d\n",g++,&c[b=n],w))(s+=o>27?-s:((i-o!=b||!g)&&(c[i]=g&&rand()%20?c[b+o]:(z=rand()%27)?'A'+z-1:' ')=="METHINKS IT IS LIKE A WEASEL"[o]))>w?n=i-o,w=s:0;}

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

struct{char d[29];}p,t,n;i,j=-1,z,s,w,g;main(){for(;w<28;j>1&&printf("%d: %s -- score: %d\n",g++,(p=n).d,w))for(;j++%100;p=j?p:t)for(s=0,i=28;i--;)(s+=(t.d[i]=j&&rand()%20?p.d[i]:(z=rand()%27)?'A'+z-1:' ')=="METHINKS IT IS LIKE A WEASEL"[i])>w?n=t,w=s:0;}

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.

Kunst
quelle
4

C # - 436

namespace System.Linq{class W{static void Main(){var r=new Random();
Func<char>c=()=>(char)(r.Next(33,60)%59+32);var s="";
while(s.Length<28)s+=c();var a="METHINKS IT IS LIKE A WEASEL";int b=0;
while (s!=a){int m=-1;var f=s;for(int i=0;i<100;i++){
var l=string.Join("",s.Select(j=>(r.Next(20)!=0?j:c()).ToString()));
int o=Enumerable.Range(0,28).Sum(j=>l[j]==a[j]?1:0);if(o>m){f=l;m=o;}}
Console.WriteLine(b+++": "+(s=f)+" -- score: "+m);}}}}
tia
quelle
Das ist kaputt. Sie müssen System verwenden; oder manuelles Qualifizieren des Systems.
istNotALie.
Nein, tust du nicht. ideone.com/4alNSi .
tia
Ah schön. Sah in der NS-Deklaration nach einer Verwendung aus.
istNotALie.
3

Lua 5.1 (502)

Die minimierte Version:

s,t,b,c,i,q,a,d,f="ABCDFGHJYUEGKSHNCOLPQIEJUSNC","METHINKS IT IS LIKE A WEASEL",1,math.random,table.insert,1,string.sub,100,28 while q~=f do r,p={},{} for x=1,d do i(r,s) i(p,0) e="" for o=1,f do if c(1,20)==1 then if c(1,27)==1 then e=e.." " else e=e..string.char(c(65,90)) end else e=e..a(r[x],o,o) end end r[x]=e for y=1,f do if a(r[x],y,y)==a(t,y,y) then p[x]=p[x]+1 end end if p[x]==f then s=r[x] end end for x=1,d do if p[x]>=q then s,q=r[x],p[x] end end print(b..":",s,"-- score: "..q) b=b+1 end

und die leichter lesbare Version (mit Kommentaren!):

s,t,b,c,i,q,a,d,f="ABCDFGHJYUEGKSHNCOLPQIEJUSNC","METHINKS IT IS LIKE A WEASEL",1,math.random,table.insert,1,string.sub,100,28
--s=random string, t=target, b=counter, c=reference to math.random, i=reference to table.insert, q=top score,a=reference to string.sub, d=constant (100), f=constant (28)
while q~=f do
    r,p={},{}
    for x=1,d do  --add 100 copies to the table of strings
        i(r,s)
        i(p,0)
        e=""
        for o=1,f do  --for each character in string
            if c(1,20)==1 then  -- 5% chance
                if c(1,27)==1 then e=e.." " else e=e..string.char(c(65,90)) end  --set it to an ASCII char between 65 and 90 (A-Z) or a space character
            else
                e=e..a(r[x],o,o)
            end
        end
        r[x]=e  --current string = mutations
        for y=1,f do
            if a(r[x],y,y)==a(t,y,y) then p[x]=p[x]+1 end
        end  --for each char increment score if it is correct
        if p[x]==f then
            s=r[x]
        end  --if 28 then final string is this!
    end
    for x=1,d do
        if p[x]>=q then s,q=r[x],p[x] end  --if this is the highest score so far, then make the string equal to this
    end
    print(b..":",s,"-- score: "..q)  --print it!
    b=b+1  --add one to the counter!
end

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

finnbar
quelle
3

SAS - 374

%macro r;ranuni(7)%mend;%macro s;r=int(%r*27);substr(x,t,1)=byte(ifn(r,64+r,32));%mend;%macro y;char(y,t)=char(x,t)%mend;options nonotes nosource;data x;length x$28;do t=1to 28;%s;end;y="METHINKS IT IS LIKE A WEASEL";do z=1by 1;o=x;do i=1to 100;c=0;x=o;do t=1to 28;if %r<=.05then do;%s;end;c+%y;end;if c>m then do;m=c;v=x;end;end;x=v;put z":" x"-- score:" m;if m<28;end;run;

->

1 :GUUVLNUSILSRZLRBXVVCWXX HXKC -- score:2
2 :MUUVLNUSILSRZLRBXVMCWXX HXKC -- score:3
3 :MUUVLNESILSRILRBXVMCWXX HXKC -- score:4
4 :MEUVLNESILSRIRRBXVMCWXX HXKC -- score:5
....
95 :METHINKS IT IS LIKE A XEASEL -- score:27
96 :METHINKS IT IS LIKE A XEASEL -- score:27
97 :METHINKS IT IS LIKE A XEASEL -- score:27
98 :METHINKS IT IS LIKE A WEASEL -- score:28

Mit Zeilenumbrüchen / Einzug / Kommentaren:

%macro r;
 ranuni(7)   /* seed 0 will make new each time (seed=clock), otherwise fixed results */
%mend;
%macro s;  /* does the rand char, used both to initialize and replace; */
 r=int(%r*27); 
 substr(x,t,1)=byte(ifn(r,64+r,32)); *r=0 becomes space otherwise upper char;
%mend;
%macro y;  /*compares using new to 9.2 CHAR function which is equivalent to substr(str,start,1) */
 char(y,t)=char(x,t)
%mend;
options nonotes nosource; /*cheapest way to get clean log */
data x;
 length x$28; /*annoyingly necessary*/
 do t=1to 28;%s;end; /*initialize string*/
 y="METHINKS IT IS LIKE A WEASEL"; /*compare string */
 do z=1by 1; /*start iterating */
  o=x; /*save this iteration's string */
  do i=1to 100;
   c=0; /*score for this iteration*/
   x=o; /*string to fudge about start out clean, reusing x so no params to macro*/
   do t=1to 28;
    if %r<=.05then do;%s;end; /*if 5% then change the char out */
    c+%y; /*score that character*/
   end;
   if c>m then do; /*if on better scoring line, save it */
    m=c;
    v=x;
   end;
  end;
  x=v; *for next iter - this is cheaper than other options involving o=v due to first iter;
  put z":" x"-- score:" m;
  if m<28; *quit at 28;
 end;
run;
Joe
quelle
3

C 361 331

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

char*w="METHINKS IT IS LIKE A WEASEL";char b[101][29];t,s,n,i,j,x,a;main(){for(;i<28;i++)b[0][i]=w[rand()%28];while(s<28){for(j=1;j<101;j++){x=0;for(i=0;i<28;i++){if(!(rand()%20))b[j][i]=w[rand()%28];else b[j][i]=b[0][i];if(b[j][i]==w[i])x++;}if(x>s){s=x;t=j;}}printf("%d: %s -- score %d\n",n++,b[t],s);for(;i>=0;--i){a=b[0][i];b[0][i]=b[t][i];b[t][i]=a;}t=0;}}

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:

char*w="METHINKS IT IS LIKE A WEASEL";char b[2929];t,s,n,i,x;main(){for(;i<28;i++)b[i]=w[rand()%28];while(s<28){for(;i<2929;i++){if((i+1)%29){if(!(i%29))x=0;b[i]=rand()%20?b[i%29]:w[rand()%28]; x+=b[i]==w[i%29];if(x>s){s=x;t=i/29;}}}for(i=0;i<29;i++){x=b[i+t*29];b[i+t*29]=b[i];b[i]=x;}printf("%d: %s -- score %d\n",n++,b,s);t=0;}}

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

Christian Palmstierna
quelle
3

Scala, 347 341 337 Zeichen:

import util.Random.{nextInt=>r}
val t="METHINKS IT IS LIKE A WEASEL"
def c="ABCDEFGHIJKLMNOPQRSTUVWXYZ "(r(27))
def s(a:String)=t.zip(a).map{x=>if(x._1==x._2) 1 else 0}.sum
def w(a:String,i:Int=0){println(f"$i%2d: $a -- score: ${s(a)}")
if(s(a)!=28){w((0 to 99).map{_=>a.map(o=>if(r(20)<1) c else o)}.sortBy(s).last,i+1)}}
w(t.map(_=>c))

=>

 0: PGSHWAEPALQFTCORUKANPNUTRVXH -- score: 2
 1: PGSHWAEPALQ TCOQUKANPNUTRVXH -- score: 3
...
47: METHINKS WT IS LIKE A WEASEL -- score: 27
48: METHINKS IT IS LIKE A WEASEL -- score: 28
Rob Starling
quelle
Hoppla. Ich habe den Algorithmus falsch verstanden und anstatt "eine 5% ige Chance pro Zeichen, dass dieses Zeichen durch ein zufälliges Zeichen ersetzt wird", habe ich ein einzelnes zufälliges Zeichen permutiert. wird reparieren.
Rob Starling
fest und ein wenig getrimmt!
Rob Starling
In Scala 2.10 println("%2d: %s -- score: %d".format(i,a,s(a))kann auf geändert werden println(f"$i%2d: $a%s -- score: ${s(a)}%d"), wodurch 4 Zeichen gespart werden!
Rob Starling
((('A'to'Z') toSeq): + '') == "ABCDEFGHIJKLMNOPQRSTUVWXYZ", und die 2% s sind nicht erforderlich, um eine Zeichenfolge zu drucken, um 9 Zeichen zu sparen
Chris
@ Chris, unter welcher Scala-Version hast du das laufen lassen? def c=(' '+:('A'to'Z'))(r(27))gibt mirerror: type mismatch; found : Int required: scala.collection.generic.CanBuildFrom[scala.collection.immutable.IndexedSeq[Char],Char,?]
Rob Starling
2

PHP 442

<? function r(){$n=rand(65,91);if($n==91) return ' ';else return chr($n);}function s($s){$c=0;$t='METHINKS IT IS LIKE A WEASEL';for($i=0;$i<28;$i++) if($s[$i]==$t[$i]) $c++;return $c;}function m($s){for($i=0;$i<28;$i++) if(rand(0,99)<5) $s[$i]=r();return $s;}$s='';for($i=0;$i<28;$i++) $s.=r();for($i=0;;$i++){$l=s($s);printf("%2d: %s -- score: %d\n",$i,$s,$l);if($l==28) break;$x=$s;for($j=0;$j<100;$j++){$t=m($s);if(s($t)>$l) $x=$t;}$s=$x;}

Readbly:

<?
//random char
function r(){
    $n=rand(65,91);
    if($n==91) return ' ';
    else return chr($n);
}
//score
function s($s){
    $c=0;
    $t='METHINKS IT IS LIKE A WEASEL';
    for($i=0;$i<28;$i++)
        if($s[$i]==$t[$i]) $c++;
    return $c;
}
//mutate
function m($s){
    for($i=0;$i<28;$i++)
    if(rand(0,99)<5) $s[$i]=r();
    return $s;
}
$s='';
for($i=0;$i<28;$i++) $s.=r();
for($i=0;;$i++){
    $l=s($s);
    printf("%2d: %s -- score: %d\n",$i,$s,$l);
    if($l==28) break;
    $x=$s;
    for($j=0;$j<100;$j++){
        $t=m($s);
        if(s($t)>$l) $x=$t;
    }
    $s=$x;
}
Sammitch
quelle
Entfernen von zusätzlichen Leerzeichen nach if\for, es ist bei 436. Sie könnten auch $n>90für ein anderes
Zeichen
Ich mag das, es ist tatsächlich lesbar. Ich habe ein paar mögliche Verbesserungen an Ihrem r()und s()Funktionen gefunden. Hier sind die Änderungen mit Kommentaren: ideone.com/4ecZQc
Mr. Llama
Oh, und Ihre printf-Anweisung kann gekürzt werden. Der %sist immer gleich lang und der %dist linksbündig, daher können Sie stattdessen Folgendes verwenden:printf("%2d: $s -- score: $l\n",$i);
Mr. Llama
2

Java (632)

class C {public static void main(String[] a){String b="AAAAAAAAAAAAAAAAAAAAAAAAAAAA";for(int i=1;;i++){String c=w(b);int s=s(c);if(s==28)break;if(s(b)<s){b=c;System.out.println(i+": "+c+" -- score: "+s);}}}public static String w(String b) {StringBuffer c = new StringBuffer(b);int max = 0;for (int i=0;i<100;i++){for(int j=0;j<28;j++)if(Math.random()<.06){double d=Math.random();c.setCharAt(j,(char)(d==1?32:d*26+65));}String d=c.toString();int s=s(d);if(s>max){max=s;b=d;}}return b;}public static int s(String s){String b="METHINKS IT IS LIKE A WEASEL";int sum=0;for(int j=0;j<28;j++)sum+=s.charAt(j)==b.charAt(j)?1:0;return sum;}}

Java ist so eine ausführliche Sprache .. :(

Javatarz
quelle
2

Python ( 330 321)

def b(i,s):print i,':',''.join(s),'-- score:',p(s)
from random import*;a=" ABCDEFGHIJKLMNOPQRSTUVWXYZ";i,s,t=0,choice(a)*28,"METHINKS IT IS LIKE A WEASEL";p=lambda n:sum(n[c]==t[c]for c in range(28))
while p(s)<28:b(i,s);s=sorted([[(c,choice(a))[random()<.05]for c in s]for k in[1]*100],key=lambda n:p(n))[-1];i+=1
b(i,s)

Lesbare Version:

def b(i,s):
    print i,':',''.join(s),'-- score:',p(s)

import random as r
a=" ABCDEFGHIJKLMNOPQRSTUVWXYZ"
i,s,t=0,r.choice(a)*28,"METHINKS IT IS LIKE A WEASEL"
p=lambda n:sum(1for c in range(28)if n[c]==t[c])
while p(s)<28:
    b(i,s)
    s=sorted([[(c,r.choice(a))[r.random()<.05]for c in s]for k in[1]*100],key=lambda n:p(n))[-1];i+=1
b(i,s)

Beispielausgabe:

0 : SSSSSSSSSSSSSSSSSSSSSSSSSSSS -- score: 3
1 : SSSQSSSSSSSSSSSSISSSSSSSSSSS -- score: 4
2 : SSSQISSSSSSSSSSSISSSSSSSSSSS -- score: 5
3 : SSSQISSSSSSSSSSSIKSSSSSSSSSS -- score: 6
4 : SMSQISSSSSSSISSSIKSSSSGSSSSS -- score: 7
...
53 : METHINKS IT IS UIKE A WEASEL -- score: 27
54 : METHINKS IT IS UIKE A WEASEL -- score: 27
55 : METHINKS IT IS LIKE A WEASEL -- score: 28

Bearbeiten: Einige Zeichen basierend auf der Antwort von AMK und Timtechs wurden entfernt

PsHegger
quelle
2
sum(1for c in range(28)if n[c]==t[c])kann auf sum(n[c]==t[c] for c in range(28))(-3 Zeichen) gekürzt werden
AMK
1
Speichern Sie 5 Zeichen, wechseln Sie import random as rzu from random import*und entfernen Sie dann die drei Instanzen vonr.
Timtech
1
Entschuldigung, ich spreche kein Python. Ist Zeile Null in Ihrer Beispielausgabe nur ein ungewöhnlicher Zufall oder beginnt Ihr Skript immer mit allen S? Die Herausforderung setzt voraus, dass Sie mit einer zufälligen Zeichenfolge beginnen.
Iszi
Es beginnt mit 28 zufälligen Zeichen, aber sie sind immer gleich.
PsHegger
@Iszi Lol, es hat nie gesagt, dass jeder einzelne Charakter zufällig sein muss! PsHegger: lol beginnend mit allen s ist passend für den Namen Ihrer Sprache;)
Türklinke
2

PHP ( 381 397 323 319 312):

<? function s(&$s,&$i=0){$t='METHINKS IT IS LIKE A WEASEL';$i=0;$c=$s;$f=28;while($f--){$n=rand(0,26);$i+=($s[$f]=($c=='_'||!rand(0,19)?chr($n?$n+64:32):$s[$f]))==$t[$f];}}$s='_';s($s);$x=$y=0;do{$f=100;while($f--){$m=$s;s($m,$i);if($i>$y){$y=$i;$l=$m;}}printf("%2d: %s -- score: $y\n",$x++,$s=$l);}while($y<28);

Lesbare Version:

<?
function s(&$s, &$i = 0) {
    $t = 'METHINKS IT IS LIKE A WEASEL';
    $i = 0;
    $c = $s;
    $f = 28; while ($f--) {
        $n = rand(0, 26);
        $i += ($s[$f] = ($c == '_' || !rand(0, 19) ? chr($n ? $n + 64 : 32) : $s[$f])) == $t[$f];
    }
}

$s = '_';
s($s);
$x = $y = 0;

do {
    $f = 100; while ($f--) {
        $m = $s;
        s($m, $i);

        if ($i > $y) {
            $y = $i;
            $l = $m;
        }
    }

    printf("%2d: %s -- score: $y\n", $x++, $s = $l);
} while ($y < 28);

Optimierungspunkte (319):

Optimierungspunkte (312):

  • @ Einacio's Kommentare
Bruder Filip
quelle
Ich mag den gemeinsamen Generator + Randomizer
Einacio
Sie könnten beide ändern forfü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)
Einacio
Generator + Randomizer + Punktzahlberechnung. :) Danke, ich habe deine Optimierungen angewendet.
Bruder Filip
2

Rubin, 218

g,s,p,t=-1,'',1;while t!=28;t,b=-1;100.times{|i|m,n='',0
28.times{|j|n+=1if(m[j]=(rand<p ?[*?A..?Z,' '].sample: s[j]))=="METHINKS IT IS LIKE A WEASEL"[j]}
b,t=m,n if n>t};puts"#{g+=1}: #{s=b} -- score: #{t}";p=0.05;end

Beispiel laufen

0: LRAZZMKL IKUOGEHLKPWEVNEAZWX -- score: 6
1: LRAZZMKL IKUIGEALKMWEVNEAZWX -- score: 7
2: HRAGZMKL IKUIGEALKMWEVNEAZWX -- score: 7
3: HVAGZMKL IKUISAALKYWEVNEAZWX -- score: 8
                  ...
48: METHIUKS IT IS LIKEIA WEASEL -- score: 26
49: METHINKS IT IS LIKEIA WEASEL -- score: 27
50: METHINKS IT IS LIKEIA WEASEL -- score: 27
51: METHINKS IT IS LIKE A WEASEL -- score: 28
Darren Stone
quelle
2

Rubin - 225 202 203 198 Zeichen

Ruby scheint in dieser Herausforderung bisher unterrepräsentiert zu sein, also dachte ich, ich würde es versuchen! Verbesserungen sind willkommen.

g=-1
s=[]
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
Paul Prestidge
quelle
In Ihrer Ausgabe beginnt "generation #" bei, 1aber die Frage gibt an 0. Wenn Sie mit einleiten, g=-1dann ist es in Ordnung. Es mag einen intelligenteren Weg geben, aber ich habe es so gemacht. Prost RubyGolfer.
Darren Stone
@ DarrenStone Guter Anruf, danke! Kostet einen Charakter, aber ich könnte mir keinen besseren Weg vorstellen.
Paul Prestidge
1
Durch Verschieben des Codes in die Zeichenfolge erhalten Sie 198 Zeichen: (dieselben ersten beiden Zeilen, dann diese für den Rest)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
Justin
Guter Anruf! Ich bearbeite es in.
Paul Prestidge
2

Ruby, 206 200 199

q,i,*R=*-2..27
puts"#{i+=1}: #{$.,s=(-2..q).map{x=R.map{|j|!s||rand<0.05?[*?A..?Z,' '].sample: s[j]};[R.count{|i|x[i]=='METHINKS IT IS LIKE A WEASEL'[i]},x]}.max;q=97;s.join} -- score: #$."until$.>27

Die erste Zeile ist einfach eine andere Art zu definieren q=-2, i=-1und R=(0..27).to_a. Alle Arbeiten werden in der 2. Zeile erledigt:

puts"..."until$.>27 # Prints the string in quotes until we reach the desired score
     ^
     |
 +---+
 |
"#{i+=1}: #{...} -- score: #$."
   ^        ^               ^  
   +--------|---------------|-- Generation counter
 +----------+---------------|-- Current string
 |                          +-- Score of current string (interpolates the `$.` variable)
 |   
 #{$.,s=(-2..q).map{...}.max;q=97;s.join} # Generate the score & string
   ^         ^  ^   ^    ^   ^    ^
   +---------|--|---|----|---|----|------ Store the score; this variable makes
             |  |   |    |   |    |       string interpolation shorter.
             +--|---|----|---+----|------ `q` automatically takes care of generating
                |   |    |        |        the string vs randomizing the string.
                +---|----|--------|------  Make 100 (or 1 the first time) strings,
                    |    |        |        and compute their score.
                    |    +--------|------- Take the string with the max score.
 +------------------+             +------- `s` is stored as an array
 |
 x=R.map{...};[R.count{...},x] # Compute string and its score, store in array
   ^     ^    ^^       ^
   +-----|----|+-------|------ `R` is 0..27, we use the constant to save chars.
         |    +--------|------ `max` orders by first element, then second. We clearly want
         |             |       the highest score, so make the score first.
 +-------+-------------|------ Generate the string, store in `x`.
 |                     +------ Count the number of chars that overlap with 'METHINKS...'
 |                     |
 |                    {|i|x[i]=='METHINKS IT IS LIKE A WEASEL'[i]}
{|j|!s||rand<0.05?[*?A..?Z,' '].sample: s[j]}
    ^   ^         ^             ^       ^
    +---+---------|-------------|-------|---- 5% chance of randomizing, or 100% for
                  |             |       |     first string.
                  +-------------+-------|---- Sample from alphabet + ' '.
                                        +---- Don't alter the string 95% of the time
Justin
quelle
@ ZachGates Schön, dass dir der Kommentarstil gefällt
Justin
2

Japt v2.0a0, 112 108 Bytes

ª(T=Si26õdI q¹ö28
_¬í¥`Ú0ˆks Š ‰ ¦ke a Øâel`u q)x
(OpW+`: {U} -- sÖ: `+(K=[U]xV¹WÄ
K<28©ßLÆ®p513 iT ö}ÃñV o

Probieren Sie es online!

-4 Bytes dank @ETHproductions.

Ausgepackt und wie es funktioniert

U||(T=Si26õdI q) ö28  Initialize primary input
U||                   If U is not initialized...
        26õdI           Generate uppercase alphabets
              q         Convert to string
      Si                Add space
   (T=         )        Assign to variable T
                 ö28    Sample 28 random chars from T and form a string
                        Implicitly assign to U

_q í==`Ú0ˆks Š ‰ ¦ke a Øâel`u q)x  Match counting function
_                                  Declare a function...
 q í==                         )     Convert to array of chars and pair with the next,
                                     and map with equality...
      `Ú0ˆks Š ‰ ¦ke a Øâel`u q        "methinks it is like a weasel" to uppercase
                                        split into chars
                                x    Sum (true == 1, false == 0)
                                   Implicitly assign to V

(OpW+`: {U} -- sÖ: `+(K=[U]xV) W+1  Output and increment counter
(Op                           )      Output with newline...
   W+`: {U} -- sÖ: `+                 `{W}: {U} -- score: `
                         [U]xV         Call V on [U] and force cast to number
                      (K=     )        Assign to K
                                W+1  Add 1 to W and implicitly assign to W

K<28&&ßLo@Um_p513 iT ö}} ñV o  Termination check and recursion
K<28&&                         If the match count is less than 28...
      ß                          Recurse the program with...
          Um_                      Map over chars of U...
             p513 iT                 The char repeated 513 times plus T
                     ö}              Sample a char from it
       Lo@             }           Generate array of 100 of the above
                         ñV o      Sort by V, pop the largest, pass it as U
Bubbler
quelle
106 Bytes , mit einem Wechsel zu v1.4.5.
Shaggy
2

Japt -R , 94 Bytes

Eine andere Herangehensweise, aber mit ein wenig Inspiration von Bubblers Lösung .

;C±S ö28
ȶ`Ú0ks   ¦ke a Øâel`gY
@=#dÆ£20ö ?X:CöÃÃñ_¬xVÃo)ʶG}a@Np[X+':Uu '-²`sÖ:`G=U¬xV]¸

Testen Sie es (oder versuchen Sie es online )


Erläuterung

Linie 1

Das Ergebnis wird der Variablen zugewiesen U.

;C±S ö28
;C           :The lower case alphabet
  ±S         :Append a space and reassign result to C
     ö28     :Generate a string of 28 random characters

Zeile 2

Das Ergebnis wird der Variablen zugewiesen V.

ȶ`Ú...l`gY
È               :A function that takes 2 arguments; a string (X) and an integer (Y)
  `Ú...l`       :  The compressed string "methinks it is like a weasel"
         gY     :  Get the character at index Y
 ¶              :  Test for equality with X

Zeile 3

Das Ergebnis dieser Zeile wird implizit mit Zeilenumbrüchen und Ausgaben verknüpft.

@=#dÆ£20ö ?X:CöÃÃñ_¬xVÃo)Ê¥G}a@Np[X+':Uu '-²`sÖ:`G=U¬xV]¸
@                           }a@                            :Repeat until true
                                 [                     ]   :Build an array containing ...
                                  X+':                     :  A colon appended to the number of the current iteration
                                      Uu                   :  The current value of U uppercased
                                         '-²               :  A hyphen repeated twice
                                            `sÖ:`          :  The compressed string "score: "
                                                   U¬      :  Split U to an array of characters
                                                      V    :   Pass each character X at index Y through function V
                                                     x     :   Reduce by addition
                                                 G=        :   Assign the result to variable G
                                                        ¸  :Join with spaces
                               Np                          :Push to N (initially an empty array)
  #d                                                       :100
    Æ                                                      :Generate the range [0,100) and pass each through a function
     £                                                     :  Map over each character X in U
      20ö                                                  :    Generate a random number in the range [0,20), which has a 5% chance of being 0 (falsey)
          ?X                                               :    If thruthy, return X
            :Cö                                            :    Else return a random character from C
               Ã                                           :  End mapping
                Ã                                          :End function
                 ñ_                                        :Sort by passing each through a function
                   ¬                                       :  Split to an array of characters
                     V                                     :  Pass each character X at index Y through function V
                    x                                      :  Reduce by addition
                      Ã                                    :End sorting
                       o                                   :Pop the last element
 =                      )                                  :Reassign to U
                         Ê                                 :Length
                          ¶G                               :Equal to G
Zottelig
quelle
2

Perl 5 , 219 Bytes

$_="METHINKS IT IS LIKE A WEASEL";sub r{(A..Z,$")[rand 27]};sub t{~~grep/$t[$-++%28]/,pop=~/./g}$}.=r for@t=/./g;printf"%3d: %s -- score: %d
",$i++,(($})=sort{t($b)<=>t$a}map s/./rand>.05?$&:r/ger,($})x100),t$}until/$}/

Probieren Sie es online!

Dom Hastings
quelle
1

Rubin - 410

#!/usr/bin/env ruby
C,RC=[32]+(65..90).to_a,->{C[rand(27)].chr}
T,CO,CH,OU,s,sc,a,aa,z,TR="METHINKS IT IS LIKE A WEASEL",->x{a=0;(0...28).each{|z|a+=1 if x[z]==T[z]};a},->{a[aa.rindex(sc)]},->x,y{print x;print " Score: ";puts y},(0...28).map{RC[]}.join,0,[0],[0],0,->{rand(20)==0}
until sc==28
a=[s]*100;aa=[0]*100;(0...100).each{|x|(0...28).each{|y|a[x][y]=RC[] if TR[]};z=CO[a[x]];aa[x]=CO[a[x]];OU[a[x],z]};sc=aa.max;s=CH[] end

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
1

Python 284

from random import*
C=choice
A=map(chr,range(65,91)+[32])
s=[C(A)for i in[0]*28]
N=x=0
while N!=28:N,s=max((len([i for i,j in zip(X,"METHINKS IT IS LIKE A WEASEL")if i==j]),X)for X in[[c if random()<.95 else C(A)for c in s]for i in[0]*100]);print`x`+":",''.join(s),"-- score:",N;x+=1
Sudharsan Mohan
quelle
1

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:

for(r=Math.random,R=function(){return'METHINKS CODZAWFLBUGYQRXVJP'[~~(r()*27)]},_=[],_.$=n=0,D=function(s){for(c=[],c.$=i=0;i<28;){c[i]=s&&r()<.95?s[i]:R();_=(c.$+=c[i]=='METHINKS IT IS LIKE A WEASEL'[i++])>_.$?c:_};return c},D();_.$<28;){for(j=0;j++<1e2;)D(_);console.log(n+++': '+_.join('')+' -- score: '+_.$)}
rory
quelle
1

Java: 557 534

enum W{W;public static void main(String[]a){char[]c=new char[28],h,d[];int i,k,e,s=W.s(c);for(i=0;i<28;i++)c[i]=W.r();for(i=0;;){W.p(i++,h=c,s);if(s>27)break;d=new char[100][28];for(char[]b:d){for(k=0;k<28;k++)b[k]=Math.random()<.05?W.r():h[k];if((e=W.s(b))>s){s=e;c=b;}}}}int s(char[]c){int s=0,k;for(k=0;k<28;k++)if(c[k]=="METHINKS IT IS LIKE A WEASEL".charAt(k))s++;return s;}void p(int i,char[]c,int s){System.out.println(i+": "+new String(c)+" -- score: "+s);}char r(){int i=(int)(Math.random()*27);return(char)(i==26?32:i+65);}}

Ausgepackt:

enum W {
    W;

    public static void main(String[] a) {
        char[] c = new char[28], h, d[];

        int i, k, e, s = W.s(c);

        for(i = 0; i < 28; i++)
            c[i] = W.r();

        for(i = 0;;) {
            W.p(i++, h = c, s);

            if(s > 27)
                break;

            d = new char[100][28];

            for(char[] b : d) {
                for(k = 0; k < 28; k++)
                    b[k] = Math.random() < .05 ? W.r() : h[k];

                if((e = W.s(b)) > s) {
                    s = e;
                    c = b;
                }
            }
        }
    }

    int s(char[] c) {
        int s = 0, k;
        for(k = 0; k < 28; k++)
            if(c[k] == "METHINKS IT IS LIKE A WEASEL".charAt(k))
                s++;

        return s;
    }

    void p(int i, char[] c, int s) {
        System.out.println(i + ": " + new String(c) + " -- score: " + s);
    }

    char r() {
        int i = (int)(Math.random() * 27);
        return (char)(i == 26 ? 32 : i + 65);
    }
}
Radiodef
quelle
1

PHP 429 426 421 415

<? function t(){$a="ABCDEFGHIJKLMNOPQRSTUVWXYZ ";return $a{rand(0,26)};}$c='';$j=$g=0;$i=28;while($i--)$c.=t();function r($s){$i=28;while($i--)!rand(0,19)&&$s{$i}=t();return $s;}function s($s,&$r){$c="METHINKS IT IS LIKE A WEASEL";$i=28;$r=0;while($i--)$r+=$s{$i}==$c{$i};}while($g<28){$n='';$v=0;$i=100;while($i--){s($t=r($c),$a);($a>$v)&&($v=$a)&($n=$t);}($v>$g)&&($g=$v)&($c=$n);echo $j++.": $c -- score: $g\n";}

hübscher Druck

<?php 
function t(){
    $a="ABCDEFGHIJKLMNOPQRSTUVWXYZ ";
    return $a{rand(0,26)};
}
$c='';
$j=$g=0;
$i=28;
while($i--)
    $c.=t();
function r($s){
    $i=28;
    while($i--)
        !rand(0,19)&&$s{$i}=t();
    return $s;
}
function s($s,&$r){
    $c="METHINKS IT IS LIKE A WEASEL";
    $i=28;
    $r=0;
    while($i--)
        $r+=+($s{$i}==$c{$i});
}
while($g<28){
    $n='';
    $v=0;
    $i=100;
    while($i--){
        s($t=r($c),$a);
        ($a>$v)&&($v=$a)&($n=$t);
    }
    ($v>$g)&&($g=$v)&($c=$n);
    echo $j++.": $c -- score: $g\n";
}

Ich werde beim nächsten Mal eine weniger ausführliche Sprache brauchen

Einacio
quelle
kürzeste php antwort bisher gut gemacht!
Noelkd
könnte besser sein, aber ich sollte arbeiten
Einacio
Sie können jederzeit zurückkehren und Ihre Antwort aktualisieren
Noelkd
1

Python 2.7 - 319 Bytes

Sicher ist es nicht das kleinste, aber es hat Spaß gemacht, es zu programmieren.

from random import*
a=map(chr,range(65,91))+[' ']
c,i,y=choice,0,{}
s=[c(a)for i in[0]*28]
while 1:
 for j in[0]*100:v=[c(a)if .05>random()else x for x in s];y[sum(1if'METHINKS IT IS LIKE A WEASEL'[k]==v[k]else 0for k in range(28))]=v
 v=max(y.keys());s=y[v];print"%d: %s -- score: %d"%(i,''.join(y[v]),v);i+=1
 if v==28:break

Verwendet eine rekursive Funktion, sodass sie die maximale Rekursionstiefe erreichen kann, wenn die Zeichenfolge eine seltsame Abweichung aufweist.

ubuntu@ubuntu-OptiPlex-980:~$ python weasel.py
0: VPBHBSPWFTOG HAXSESCDNFPKWYE -- score: 1
1: VABHBSPWFTOG HAXSESCDNWPKWYE -- score: 2
2: VAWHBSPWFTOGIHAXSESSDNWPKWYE -- score: 3
3: VAWHBSPWFTOGIHAXSEFSGNWPKWYL -- score: 4
4: XAWHBSPYFTOGIHAXSEFSGNWPKWYL -- score: 4
5: XAWHBSKYFTOGIHAXSEFSGNWPKWYL -- score: 5
6: XAWHBSKYFTOGIHAXSEF GNWPKWYL -- score: 6
7: XAWHBSKYFTOGIHALSEF ANWPKWYL -- score: 8
8: XAKHBSKYFTTGIHALSEY ANWPKWYL -- score: 9
9: XAKHISKYFTTGIHALSEE ANWPKWYL -- score: 11
10: XAKHISKSFTTGIHALSEE ANWPKWYL -- score: 12
11: XAKHISKSFTTGIHALSBE ANWPKWKL -- score: 12
12: XAQHISKSFRT IHALSBE ANWPKWKL -- score: 13
13: XAQHISKSFIT IHALSBE ANWPKWKL -- score: 14
14: XAQHISKSFIT IHALSBE ANWPKWKL -- score: 14
15: XAQHISKSFIT IHALSBE ANWPKWKL -- score: 14
16: XALHISKSFIT ISALSBE ANWPKWKL -- score: 15
17: JALHISKSFIT ISALSBE ANWPAWKL -- score: 16
18: JALHISKSFIT ISALIBE ANWPAWKL -- score: 17
19: JALHISKSFIT ISALIBE ANWPAWKL -- score: 17
20: JALHISKSFIT ISALIBE ANWPAWKL -- score: 17
21: JALHISKSFIT ISALIKE ANWPAWYL -- score: 18
22: JALHISKSFIT IS LIKE ANWPAWYL -- score: 19
23: JALHISKSFIT IS LIKE ANWEAWYL -- score: 20
24: JALHISKSFIT IS LIKE ANWEAWYL -- score: 20
25: JALHISKSFIT IS LIKE ANWEAWZL -- score: 20
26: JALHISKS IT IS LIKE ANWEAAZL -- score: 21
27: JACHISKS IT IS LIKE ANWEASZL -- score: 22
28: JACHISKS IT IS LIKE ANWEASZL -- score: 22
29: MACHISKS IT IS LIKE ANWEASZL -- score: 23
30: MACHISKS IT IS LIKE ANWEASZL -- score: 23
31: MACHISKS IT IS LIKE AUWEASZL -- score: 23
32: MACHISKS IT IS LIKE AUWEASZL -- score: 23
33: MACHISKS IT IS LIKE AJWEASZL -- score: 23
34: MACHISKS IT IS LIKE A WEASZL -- score: 24
35: MACHISKS IT IS LIKE A WEASZL -- score: 24
36: MACHINKS IT IS LIKE A WEASZL -- score: 25
37: MACHINKS IT IS LIKE A WEASZL -- score: 25
38: MACHINKS IT IS LIKE A WEASZL -- score: 25
39: MBCHINKS IT IS LIKE A WEASZL -- score: 25
40: MBCHINKS IT IS LIKE A WEASZL -- score: 25
41: MBCHINKS IT IS LIKE A WEASZL -- score: 25
42: MBCHINKS IT IS LIKE A WEASZL -- score: 25
43: MBCHINKS IT IS LIKE A WEASZL -- score: 25
44: MBCHINKS IT IS LIKE A WEASZL -- score: 25
45: MECHINKS IT IS LIKE A WEASCL -- score: 26
46: MECHINKS IT IS LIKE A WEASCL -- score: 26
47: MECHINKS IT IS LIKE A WEASCL -- score: 26
48: MECHINKS IT IS LIKE A WEASCL -- score: 26
49: MECHINKS IT IS LIKE A WEASCL -- score: 26
50: MECHINKS IT IS LIKE A WEASCL -- score: 26
51: MEQHINKS IT IS LIKE A WEASCL -- score: 26
52: MEQHINKS IT IS LIKE A WEASCL -- score: 26
53: MEQHINKS IT IS LIKE A WEASCL -- score: 26
54: MEQHINKS IT IS LIKE A WEASCL -- score: 26
55: MEQHINKS IT IS LIKE A WEASCL -- score: 26
56: MEQHINKS IT IS LIKE A WEASCL -- score: 26
57: METHINKS IT IS LIKE A WEASCL -- score: 27
58: METHINKS IT IS LIKE A WEASCL -- score: 27
59: METHINKS IT IS LIKE A WEASCL -- score: 27
60: METHINKS IT IS LIKE A WEASCL -- score: 27
61: METHINKS IT IS LIKE A WEASCL -- score: 27
62: METHINKS IT IS LIKE A WEASCL -- score: 27
63: METHINKS IT IS LIKE A WEASCL -- score: 27
64: METHINKS IT IS LIKE A WEASCL -- score: 27
65: METHINKS IT IS LIKE A WEASEL -- score: 28

Ein großes Dankeschön an Sp3000 für die Hilfe beim Golfen.

Beta-Zerfall
quelle
1

Julia, 281 Bytes

Golf gespielt:

r=n->['A':'Z',' '][rand(1:27,n)]
s=a->sum(a.=="METHINKS IT IS LIKE A WEASEL".data)
p=(z,a,s)->println(z,": ",join(a)," -- score: ",s)
a = r(28)
b = s(a)
z = 0
p(z,a,b)
while b<28
c=b
d=a
for i=1:100
e=[rand()<.95?i:r(1)[1]for i=a]
f=s(e)
if(f>c)
c=f
d=e
end
end
a=d
b=c
p(z,a,b)
z+=1
end

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:

randchar = n -> ['A':'Z',' '][rand(1:27,n)]
score = a -> sum(a.=="METHINKS IT IS LIKE A WEASEL".data)
myprint = (z,a,s) -> println(z,": ",join(a)," -- score: ",s)
currentarray = randchar(28)
currentscore = score(currentarray)
z = 0
myprint(z,currentarray,currentscore)
while currentscore < 28
    bestscore = currentscore
    bestarray = currentarray
    for i = 1:100
        temparray = [rand()<.95?i:randchar(1)[1]for i=currentarray]
        tempscore = score(temparray)
        if(tempscore > bestscore)
            bestscore = tempscore
            bestarray = temparray
        end
    end
    currentarray = bestarray
    currentscore = bestscore
    myprint(z,currentarray,currentscore)
    z+=1
end
kevinsa5
quelle