Golf A Weasel Program


65

Richard Dawkins dalam bukunya The Blind Watchmaker , menjelaskan program Weasel . Algoritme dapat dijelaskan sebagai berikut:

  1. Mulailah dengan string acak 28 karakter. Karakter yang valid adalah semua huruf besar, dan spasi.

  2. Buat 100 salinan string itu, dengan peluang 5% per karakter dari karakter itu diganti dengan karakter acak.

  3. Bandingkan setiap string baru dengan target "METHINKS IT IS LIKE A WEASEL", dan berikan skor masing-masing sesuai dengan jumlah huruf dalam string yang benar dan di posisi yang benar.

  4. Jika salah satu string baru memiliki skor sempurna (28), berhentilah.

  5. Pilih string dengan skor tertinggi dari langkah 3. Cara Anda membuat dasi tergantung pada Anda, tetapi hanya satu string yang dapat dipilih. Ambil string yang dipilih dan lanjutkan ke langkah 2.

Pemenang akan menjadi potongan kode terpendek untuk mendapatkan jawaban yang benar saat mencetak string skor tertinggi dari setiap generasi dalam format berikut:

tolong jawab dalam format ini

Jika orang dapat membantu dengan memeriksa jawaban orang lain akan sangat membantu!


4
Karakter mana yang diizinkan? Unicode? Huruf kecil?
Oriol

4
Ah, aku suka Dawkins. Keindahan, dan kelayakan evolusi ditunjukkan dalam algoritma sederhana.
Cruncher

Semoga langkah 4 lebih baik diganti dengan "langkah 1.5) Jika string baru memiliki skor sempurna (28), hentikan" dan "langkah 4) Ambil string skor tertinggi, dan lanjutkan ke langkah 1.5."? Artinya, jika string acak awal adalah pemenang, perlukah kita menyebar?
Rob Starling

1
Saya agak bingung dengan urutan operasi di sini. Apakah maksud kita membuat 100 string baru, berdasarkan string asli? Atau apakah 100 string baru, dengan string pertama didasarkan pada yang asli, dan setiap string berikutnya berdasarkan pada string sebelumnya? Deskripsi algoritma tampaknya menyiratkan yang pertama, sedangkan output sampel tampaknya berasal dari yang terakhir.
Iszi

2
Petunjuknya cukup jelas, tetapi bagaimana jika string asli adalah target?
Christian Palmstierna

Jawaban:


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

Penjelasan:

  • 0{... }⊃∘(C←27↑⎕A)¨?28/27: disetel Cke 27 huruf kapital pertama. Hanya ada 26, jadi elemen ke-27 adalah spasi. Pilih 28 item acak dari C. Ini akan menjadi yang pertama . (Generasi) pertama adalah 0.

  • ⍵≢T←'METHINKS IT IS LIKE A WEASEL: diatur Tke string 'METHINKS IT IS LIKE A WEASEL'. Selama tidak sama dengan T:

    • {... }¨100⍴⊂⍵: Buat 100 salinan dari . Untuk masing-masing ...
      • 9≠?28/20: pilih 28 angka acak dari 1 hingga 20. Buat bitmask di mana masing-masing 1berarti bahwa angka acak tidak sama dengan 9. (Ini berarti peluang 5% dari a 0).
      • ⍵{⍵:⍺⋄C[?27]}¨: untuk setiap huruf dalam , jika bit yang sesuai adalah 1, simpan surat itu, jika tidak gantilah dengan elemen yang dipilih secara acak C.
    • c←: menyimpan 100 string yang termutasi dalam c.
    • G←{+/⍵=T}¨c: untuk setiap elemen dalam c, hitung skor (jumlah karakter yang cocok T) dan simpan skor dalam G.
    • s←⌈/G: temukan skor maksimum dan simpan di s.
    • c←⊃c/⍨G=s: pilih item pertama dari cyang nilainya sama dengan s(maksimum), dan simpan ckembali.
    • ⎕←(⍕⍺),':'c'-- score:',s: cetak generasi dalam format yang diberikan ( adalah generasi saat ini, cadalah string terbaik saat ini, sadalah skor)
    • c∇⍨1+⍺: Tambahkan generasi dan jalankan mutasi lagi menggunakan string terbaik saat ini ( c) sebagai input.

5
Penjelasan? Ini terlihat seperti sup alfabet! :)
ToastyMallows

2
@ToastyMallows: penjelasan tambahan
marinus

1
Jawaban terbaik sejauh ini, bagus untuk menjelaskannya.
Noelkd

1
@marinus Apakah Anda penyihir?
ToastyMallows

3
Bullcrap, Anda baru saja membuka MS Word dan menggunakan font WingDings
Swag

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

Contoh output

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

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

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

6

Python: 282 karakter tanpa titik koma

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 dengan:

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

4
Anda harus secara eksplisit menyatakan bahasa dan karena pertanyaan ditandai dengan kode-golf, Anda harus memberikan jumlah karakter.
Tim Seguine

Akan lakukan, terima kasih untuk tim kiatnya.
Noelkd

Anda juga harus menggunakan semua nama variabel satu huruf untuk mengurangi jumlah karakter lebih lanjut.
Gagang Pintu

Menunggu sampai nanti untuk golf lagi, masih mendapat beberapa kemenangan mudah. Terima kasih.
Noelkd

1
Apakah ini seharusnya dimulai dengan semua huruf yang sama? :)
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))

(memerlukan dukungan fungsi panah; lekukan ditambahkan hanya untuk keterbacaan)

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

Jangan ragu untuk mengubah alertke console.logjika Anda ingin pengalaman eksekusi lebih menyenangkan.

Ada beberapa potongan golf yang bagus di sini:

  • Fungsi cmengembalikan karakter acak dari string alfabet " ABC...". Fungsi mengambil argumen untuk digunakan sebagai batas atas untuk pemilihan indeks acak. Saat membuat string dasar, kami menggunakan 27, jadi fungsi berperilaku normal.

    Namun, kami menyalahgunakan perilaku ini dengan meminta batas atas acak 540 inci h = c(540) || h. Hanya 5% dari waktu yang cbenar - benar akan mengembalikan string (karena 540 * .05 = 27); 95% lainnya waktu, indeks yang dipilih secara acak jatuh melebihi panjang string, sehingga fungsi kembali undefined. Nilai falsey ini menyebabkan logis-OR kaskade di c(540) || h, jadi aslinya mapnilai hyang digunakan (yaitu, tidak ada pengganti terjadi).

  • Operasi penjumlahan skor dilakukan f+=h=="METHINKS IT IS LIKE A WEASEL"[p], yang mengatakan "tambahkan trueke fjika mapkarakter saat ini hcocok dengan karakter pth dari string WEASEL". Penambahan angka-plus-boolean memaksa hasil boolean menjadi salah satu 0atau 1, yang berarti fditambahkan hanya ketika ada kecocokan dengan string WEASEL target.


Mengapa Anda vdinyatakan dalam kode? Tidak disebutkan di tempat lain di sana. Anda dapat menghemat 2 karakter.
WallyWest

1
@ Eliseod'Annunzio vadalah argumen ke fungsi panah disimpan dalam c: c = (v => ...). Jika Anda ingin mendefinisikan fungsi panah tanpa argumen, harganya dua karakter ()=>..., daripada satu v=>...,, jadi lebih baik hanya memiliki argumen yang tidak digunakan.
apsillers

Penggunaan kode secara cerdas!
WallyWest

Trik yang bagus dengan k=s=[28]dan ++, saya tidak tahu!
Dom Hastings

5

R ( 245 239 238 karakter)

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="")}

Memberi:

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

bagaimana Anda mendapatkan baris pertama Anda 0: ...jika pertama kali Anda meminta catAnda bertambah c1? (+1 tetap sebagai saya mencoba sejak satu jam untuk melakukan sesuatu yang lebih pendek dan saya masih tidak bisa :))
plannapus

@plannapus Itu benar, berasal dari versi lama (yang agak lama). Entah saya mengubahnya menjadi -1 pada awalnya, atau menggunakan 1 pada baris pertama ...
Henrik

Saya melihat dua masalah dengan kode Anda. Pertama, ini ifelse(…,h(f,1),…)menggantikan semua posisi yang dipilih dengan karakter acak yang sama. Anda dapat menafsirkan aturan dalam arah ini, tetapi rasanya seperti menekuknya, jadi saya setidaknya menyebutkannya. Kedua, Anda mengganti s=zdalam 1:100loop, jadi Anda tidak membuat 100 salinan dari string yang sama, tetapi kadang-kadang salinan salinan. Ini sepertinya melanggar aturan bagiku, bukan hanya menekuknya.
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;}

Tiga loop sederhana, inisialisasi, generasi string baru dari orang tua dan skor dihitung dengan pernyataan yang sama. Itu tidak terlalu mudah dibaca bahkan dengan lekukan.

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;}

Satu loop, dengan satu array yang menahan semua 101 string.

Versi kedua ini melanggar aturan karena mencetak string dari (setara dengan) langkah 1, tetapi entah itu mencetak string terakhir atau tidak. Saya bingung bagaimana cara memperbaikinya tanpa meledak dalam ukuran. Saya tetap mempostingnya untuk inspirasi.

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;}

Pendekatan yang berbeda, alih-alih membuat array untuk menahan 101 string hanya membuat ulang string 100 kali dan menggunakan penugasan struct untuk menyalin mudah. Inisialisasi dilakukan dengan memulai penghitung "repeat 100 times" pada -1 dan menanganinya dengan hati-hati dengan penambahan pasca-pemilihan yang dipilih secara strategis. Meskipun pendekatan yang sangat berbeda itu berakhir persis sama dengan upaya pertama - 256 karakter.


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);}}}}

Ini rusak Anda perlu menggunakan Sistem; atau Sistem kualifikasi secara manual.
Notalie.

Tidak, tidak. ideone.com/4alNSi .
tia

Ah bagus. Tampak pada deklarasi NS sebagai maaf menggunakan.
Notalie.

3

Lua 5.1 (502)

Versi yang diperkecil:

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

dan versi yang lebih mudah dibaca (dengan komentar!):

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

Sejujurnya meskipun ini pasti tidak akan menang, saya senang menemukan dan meminimalkan solusi yang cukup singkat untuk masalah ini! (Penekanan pada wajar): p


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

Dengan linebreak / indent / komentar:

%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;

3

C 361 331

Tidak sebagus solusi Art, tapi inilah upaya (pemula) saya pada solusi C. 361 karakter jika Anda menghapus baris dan tab baru.

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;}}

Sunting: Singkirkan nested loop dan gunakan larik 1D. Berharap itu akan membuat perbedaan yang lebih besar, tetapi itu hanya menyelamatkan saya 30 karakter. Ini kodenya:

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;}}

Sunting: Ini adalah kode asli, tidak disunat, bagi mereka yang tertarik mengetahui bagaimana "bermain golf" dilakukan. Kode tidak menghasilkan peringatan ketika dikompilasi dengan GCC dengan -Dinding dan C99 diaktifkan. Mungkin Anda seorang pemula golf seperti saya, atau seorang pemula C seperti saya, atau mungkin Anda hanya ingin tahu. :) https://gist.github.com/cpx/97edbce4db3cb30c306a


3

Scala, 347 341 337 karakter:

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

oops. saya salah membaca algoritme dan alih-alih "peluang 5% per karakter dari karakter itu diganti dengan karakter acak", saya telah mengubah karakter acak tunggal. akan memperbaiki.
Rob Starling

diperbaiki dan dipangkas sedikit!
Rob Starling

di scala 2.10, println("%2d: %s -- score: %d".format(i,a,s(a))bisa berubah menjadi println(f"$i%2d: $a%s -- score: ${s(a)}%d"), menghemat 4 karakter!
Rob Starling

((('A'to'Z') toSeq): + '') == "ABCDEFGHIJKLMNOPQRSTUVWXYZ", dan 2% s tidak diperlukan untuk mencetak string, menghemat 9 karakter
Chris

@ Chris versi scala apa yang Anda jalankan di bawah? def c=(' '+:('A'to'Z'))(r(27))memberi sayaerror: 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;
}

menghapus spasi tambahan setelah if\for, itu di 436. Anda juga bisa memeriksa $n>90char lain
Einacio

Saya suka ini, sebenarnya bisa dibaca. Saya telah menemukan beberapa kemungkinan peningkatan pada fungsi r()dan Anda s(). Inilah perubahan dengan komentar: ideone.com/4ecZQc
Tn. Llama

Oh, dan pernyataan printf Anda dapat dipersingkat. The %sselalu sama panjang dan %ddibiarkan dibenarkan, sehingga Anda dapat menggunakan berikut ini sebagai gantinya:printf("%2d: $s -- score: $l\n",$i);
Mr. Llama

2

Jawa (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 adalah bahasa verbose yang seperti itu .. :(


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)

Versi yang dapat dibaca:

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)

Contoh output:

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

sunting: menghapus beberapa karakter berdasarkan jawaban AMK dan Timtech


2
sum(1for c in range(28)if n[c]==t[c])dapat disingkat menjadi sum(n[c]==t[c] for c in range(28))(-3 karakter)
AMK

1
Simpan 5 karakter, ubah import random as rke from random import*lalu hapus tiga contohr.
Timtech

1
Maaf, saya tidak bisa bahasa Python. Apakah garis nol dalam output sampel Anda hanya kebetulan aneh atau apakah skrip Anda selalu dimulai dengan semuanya S? Tantangan mengharuskan dimulai dengan serangkaian karakter acak.
Iszi

Itu dimulai dengan 28 karakter acak, tetapi mereka selalu sama.
PsHegger

@Iszi Lol, tidak pernah dikatakan bahwa setiap karakter individu harus acak! PsHegger: lol dimulai dengan semua huruf S yang pas untuk nama bahasa Anda;)
Gagang Pintu

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

Versi yang dapat dibaca:

<?
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);

Kredit pengoptimalan (319):

Kredit pengoptimalan (312):

  • Komentar @ Einacio

Saya suka generator gabungan + pengacak
Einacio

Anda bisa mengubah kedua foruntuk $f=N;while($f--){selama 3 Char masing-masing. dan untuk char lainnya:$n=rand(0,26);[...]chr($n?$n+64:32)
Einacio

Penghitung generator + pengacak + skor. :) Terima kasih, saya menerapkan optimasi Anda.
saudara Filip

2

Ruby, 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

contoh lari

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

2

Ruby - 225 202 203 198 karakter

Ruby tampaknya kurang terwakili dalam tantangan ini sejauh ini jadi saya pikir saya akan mencobanya! Perbaikan disambut baik.

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

Dalam output Anda, "generasi #" dimulai pada 1tetapi pertanyaannya menentukan 0. Jika Anda masuk g=-1maka tidak apa-apa. Mungkin ada cara yang lebih pintar tetapi saya melakukannya dengan cara itu. Cheers, sesama RubyGolfer.
Darren Stone

@ DarrenStone Panggilan bagus, terima kasih! Biaya karakter tetapi saya tidak bisa memikirkan cara yang lebih baik.
Paul Prestidge

1
Dengan memindahkan kode ke string, Anda bisa mendapatkan 198 karakter: (dua baris pertama yang sama, lalu sisanya)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

Panggilan bagus! Saya akan mengeditnya.
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

Baris pertama adalah sebuah cara mewah untuk mendefinisikan q=-2, i=-1dan R=(0..27).to_a. Semua pekerjaan dilakukan di baris ke-2:

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

@ZachGates Senang Anda menyukai gaya berkomentar
Justin

2

Japt v2.0a0, 112 108 byte

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

Cobalah online!

-4 byte terima kasih kepada @ETHproductions.

Dibongkar & Cara kerjanya

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

106 byte , dengan beralih ke v1.4.5.
Shaggy

2

Japt -R , 94 byte

Pendekatan yang berbeda tetapi dengan sedikit inspirasi dari solusi Bubbler .

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

Uji (atau Coba Online )


Penjelasan

Baris 1

Hasil akan ditugaskan ke variabel 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

Baris 2

Hasil akan ditugaskan ke variabel 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

Baris 3

Hasil dari baris ini secara implisit bergabung dengan baris baru dan keluaran.

@=#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

2

Perl 5 , 219 byte

$_="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/$}/

Cobalah online!


1

Ruby - 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

Sunting * Saat ini gagal (karena alasan tertentu [ada] sedang diatur ke 0 (type => fixnum)). Namun, desain yang sebenarnya benar, saya hanya perlu menemukan bug yang menyebabkan ini terjadi (ini sangat misterius)


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

1

JavaScript - 312

Sudah ada solusi JS lebih pendek di atas tetapi menggunakan fungsi pointer eksperimental, jadi saya pikir saya akan melempar solusi lain yang berjalan di lingkungan JS apa pun:

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: '+_.$)}

1

Jawa: 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);}}

Tidak dibungkus:

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);
    }
}

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";}

cetak cantik

<?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";
}

Saya akan membutuhkan bahasa yang tidak terlalu banyak bicara lain kali


jawaban php terpendek sejauh ini dilakukan dengan baik!
Noelkd

bisa lebih baik, tetapi saya harus bekerja
Einacio

Anda selalu dapat kembali dan memperbarui jawaban Anda
Noelkd

1

Python 2.7 - 319 byte

Tentu itu bukan yang terkecil, tapi menyenangkan untuk diprogram.

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

Menggunakan fungsi berulang, sehingga dapat mencapai kedalaman rekursi maksimum jika ada semacam devolusi aneh dengan string.

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

Terima kasih banyak kepada Sp3000 untuk bantuan golfnya.


1

Julia, 281 byte

Golf:

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

Algoritme itu sendiri tidak terlalu pintar, tetapi ada beberapa bit keren di sini. Menggabungkan berbagai karakter dengan karakter lain, kemudian mengindeks ke dalamnya: ['A':'Z',' '][rand(1:27,n)]dan mengambil jumlah tersebut array boolean (umum, tapi saya masih mencintai ide): sum(a.=="METHINKS IT IS LIKE A WEASEL".data). Senang saya di bawah 300!

Tidak Disatukan:

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.