Chương trình đánh golf


65

Richard Dawkins trong cuốn sách The Blind Watchmaker , mô tả một chương trình Weasel . Thuật toán có thể được mô tả như sau:

  1. Bắt đầu với một chuỗi ngẫu nhiên gồm 28 ký tự. Các ký tự hợp lệ là tất cả các chữ cái upppercase và dấu cách.

  2. Tạo 100 bản sao của chuỗi đó, với 5% cơ hội cho mỗi ký tự của nhân vật đó được thay thế bằng một ký tự ngẫu nhiên.

  3. So sánh từng chuỗi mới với mục tiêu "PHƯƠNG PHÁP NÓ LÀ NHƯ VẬY" và cho mỗi điểm theo số lượng chữ cái trong chuỗi đúng và đúng vị trí.

  4. Nếu bất kỳ chuỗi nào mới có điểm hoàn hảo (28), hãy dừng lại.

  5. Chọn chuỗi điểm cao nhất từ ​​bước 3. Cách bạn tạo ra một chiếc cà vạt tùy thuộc vào bạn, nhưng chỉ có thể chọn một chuỗi. Lấy chuỗi đã chọn và chuyển sang bước 2.

Người chiến thắng sẽ là đoạn mã ngắn nhất để có câu trả lời đúng trong khi in chuỗi điểm cao nhất của mỗi thế hệ theo định dạng sau:

câu trả lời ở định dạng này xin vui lòng

Nếu mọi người có thể giúp đỡ bằng cách kiểm tra câu trả lời của người khác sẽ rất hữu ích!


4
Những nhân vật được phép? Unicode? Chữ thường?
Oriol

4
À, tôi yêu Dawkins. Vẻ đẹp, và tính khả thi của sự tiến hóa thể hiện trong một thuật toán đơn giản.
Cruncher

Bước 4 có thể được thay thế tốt hơn bằng "bước 1.5) Nếu chuỗi mới có điểm hoàn hảo (28), tạm dừng" và "bước 4) Lấy chuỗi điểm cao nhất và chuyển sang bước 1.5."? Đó là, nếu chuỗi ngẫu nhiên ban đầu là một người chiến thắng, chúng ta có cần fan hâm mộ không?
Rob Starling

1
Tôi hơi bối rối về thứ tự các hoạt động ở đây. Là ý định mà chúng tôi tạo ra 100 chuỗi mới, dựa trên chuỗi ban đầu? Hoặc là 100 chuỗi mới, với chuỗi đầu tiên được dựa trên chuỗi ban đầu và mỗi chuỗi tiếp theo dựa trên chuỗi trước đó? Mô tả thuật toán dường như ngụ ý cái trước, trong khi đầu ra mẫu dường như là cái sau.
Iszi

2
Các hướng dẫn khá rõ ràng, nhưng nếu chuỗi ban đầu là mục tiêu thì sao?
Christian Palmstierna

Câu trả lời:


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

Giải trình:

  • 0{... }⊃∘(C←27↑⎕A)¨?28/27: được đặt thành C27 chữ cái in hoa đầu tiên. Chỉ có 26, vì vậy yếu tố thứ 27 sẽ là một khoảng trắng. Chọn 28 mục ngẫu nhiên từ C. Đây sẽ là người đầu tiên . Đầu tiên (thế hệ) sẽ là 0.

  • ⍵≢T←'METHINKS IT IS LIKE A WEASEL: đặt thành Tchuỗi 'METHINKS IT IS LIKE A WEASEL'. Miễn là không bằng T:

    • {... }¨100⍴⊂⍵: Tạo 100 bản sao . Đối với mỗi ...
      • 9≠?28/20: chọn 28 số ngẫu nhiên từ 1 đến 20. Tạo một bitmask trong đó mỗi số 1có nghĩa là số ngẫu nhiên không bằng 9. (Điều này có nghĩa là 5% cơ hội của a 0).
      • ⍵{⍵:⍺⋄C[?27]}¨: cho mỗi chữ cái trong , nếu bit tương ứng là 1, giữ chữ cái đó, nếu không thay thế nó bằng một phần tử được chọn ngẫu nhiên từ C.
    • c←: lưu trữ 100 chuỗi đột biến trong c.
    • G←{+/⍵=T}¨c: cho mỗi yếu tố trong c, tính điểm (số lượng ký tự trùng khớp T) và lưu điểm vào G.
    • s←⌈/G: tìm điểm tối đa và lưu trữ trong đó s.
    • c←⊃c/⍨G=s: chọn mục đầu tiên từ cđiểm có giá trị bằng s(tối đa) và lưu clại mục đó.
    • ⎕←(⍕⍺),':'c'-- score:',s: in thế hệ theo định dạng đã cho ( là thế hệ hiện tại, clà chuỗi tốt nhất hiện tại, slà điểm số)
    • c∇⍨1+⍺: Tăng thế hệ và chạy lại đột biến bằng cách sử dụng chuỗi tốt nhất hiện tại ( c) làm đầu vào.

5
Giải trình? Điều này trông giống như súp bảng chữ cái! :)
ToastyMallows

2
@ToastyMallows: thêm lời giải thích
marinus

1
Câu trả lời tốt nhất cho đến nay, thật tuyệt khi có một lời giải thích với nó.
Noelkd

1
@marinus Bạn có phải là phù thủy?
ToastyMallows

3
Bullcrap, bạn vừa mở MS Word và sử dụng phông chữ
WingDings

11

Toán học - 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],]

Ví dụ đầu ra

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

9

Con trăn (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 ký tự không có dấu hai chấm

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 với:

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
Bạn nên nói rõ ngôn ngữ và vì câu hỏi được gắn thẻ mã golf, bạn nên cung cấp số lượng ký tự.
Tim Seguine

Sẽ làm, cảm ơn cho lời khuyên thời gian.
Noelkd

Ngoài ra, bạn nên sử dụng tất cả các tên biến một chữ cái để giảm số lượng ký tự hơn nữa.
Doorknob

Đợi đến sau để đánh golf thêm một số, vẫn có một số chiến thắng dễ dàng. Cảm ơn.
Noelkd

1
Có thực sự phải bắt đầu với tất cả các chữ cái? :)
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))

(yêu cầu hỗ trợ chức năng mũi tên; chỉ thụt lề để dễ đọc)

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

Cảm thấy tự do để thay đổi alertđể console.lognếu bạn muốn có một kinh nghiệm thực hiện dễ chịu hơn.

Có một số bit golf tiện lợi ở đây:

  • Hàm ctrả về một ký tự ngẫu nhiên từ chuỗi bảng chữ cái " ABC...". Hàm lấy một đối số để sử dụng làm giới hạn trên cho lựa chọn chỉ mục ngẫu nhiên. Khi tạo chuỗi cơ sở, chúng ta sử dụng 27, do đó hàm hoạt động bình thường.

    Tuy nhiên, chúng tôi lạm dụng hành vi này bằng cách yêu cầu giới hạn trên ngẫu nhiên là 540 in h = c(540) || h. Chỉ 5% thời gian cthực sự sẽ trả về một chuỗi (vì 540 * .05 = 27); 95% còn lại, chỉ số được chọn ngẫu nhiên nằm ngoài độ dài của chuỗi, do đó hàm trả về undefined. Giá trị falsey này gây ra một tầng logic-HOẶC c(540) || h, do đó, mapgiá trị ban đầu hđược sử dụng (nghĩa là không có sự thay thế nào xảy ra).

  • Hoạt động tính tổng điểm f+=h=="METHINKS IT IS LIKE A WEASEL"[p], có nghĩa là "thêm truevào fnếu mapký tự hiện tại hkhớp với ký tự pthứ của chuỗi WEASEL". Việc bổ sung số-cộng-boolean cưỡng ép kết quả boolean để một trong hai 0hoặc 1, có nghĩa là fđược tăng lên chỉ khi có một trận đấu với chuỗi mục tiêu chồn.


Tại sao bạn đã vnêu trong mã? Nó không được đề cập ở bất cứ nơi nào khác trong đó. Bạn có thể tự cứu mình 2 ký tự.?
WallyWest

1
@ Eliseod'Annunzio vlà một đối số cho hàm mũi tên được lưu trữ trong c: c = (v => ...). Nếu bạn muốn xác định một hàm mũi tên không có đối số, thì phải trả hai ký tự ()=>..., thay vì một ký tự , vì v=>...vậy tốt hơn hết là bạn nên sử dụng một đối số không sử dụng.
apsillers

Khéo léo sử dụng mã!
WallyWest

Thủ thuật tốt với k=s=[28]++, tôi không có ý tưởng!
Dom Hastings

5

R ( 245 239 238 ký tự)

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

Cung cấp:

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

Làm thế nào để bạn có được dòng đầu tiên 0: ...nếu lần đầu tiên bạn gọi catbạn tăng clên 1? (Tuy nhiên +1 là tôi đang cố gắng kể từ một giờ để làm điều gì đó ngắn hơn và tôi vẫn không thể :))
plannapus

@plannapus Đó là sự thật, là từ một phiên bản cũ (có phần dài hơn). Hoặc là tôi thay đổi nó thành -1 lúc đầu hoặc sử dụng 1 trong dòng đầu tiên ...
Henrik

Tôi thấy hai vấn đề với mã của bạn. Đầu tiên, điều này ifelse(…,h(f,1),…)thay thế tất cả các vị trí được chọn với cùng một char ngẫu nhiên. Bạn có thể diễn giải các quy tắc theo hướng này, nhưng cảm giác như uốn cong chúng vì vậy ít nhất tôi sẽ đề cập đến nó. Thứ hai, bạn thay thế s=ztrong 1:100vòng lặp, do đó bạn không tạo ra 100 bản sao của cùng một chuỗi, nhưng đôi khi là bản sao của một bản sao. Điều này có vẻ như phá vỡ một quy tắc để mee, không chỉ đơn thuần là uốn cong nó.
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;}

Ba vòng đơn giản, khởi tạo, tạo chuỗi mới từ cha và điểm được tính theo cùng một câu lệnh. Nó không dễ đọc lắm ngay cả khi thụt.

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

Một vòng lặp, với một mảng chứa tất cả 101 chuỗi.

Phiên bản thứ hai này phá vỡ các quy tắc vì nó in chuỗi từ (tương đương) bước 1, nhưng đó là hoặc không in chuỗi cuối cùng. Tôi đã bối rối làm thế nào để sửa nó mà không phát nổ kích thước. Dù sao tôi cũng đang đăng nó để lấy cảm hứng.

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

Cách tiếp cận khác nhau, thay vì tạo một mảng để giữ 101 chuỗi, chỉ cần tạo lại chuỗi 100 lần và sử dụng phép gán cấu trúc để sao chép dễ dàng. Việc khởi tạo được thực hiện bằng cách bắt đầu bộ đếm "lặp lại 100 lần" ở -1 và xử lý cẩn thận bằng cách tăng sau được chọn một cách chiến lược. Mặc dù một cách tiếp cận rất khác nhau, nó kết thúc giống hệt như lần thử đầu tiên - 256 ký tự.


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

Nó bị hỏng. Bạn cần sử dụng Hệ thống; hoặc hệ thống đủ điều kiện thủ công.
Đó là NÓI.

Không, bạn không. ideone.com/4alNSi .
tia

À Nhìn vào tuyên bố NS là sử dụng xin lỗi.
Đó là NÓI.

3

Lua 5.1 (502)

Phiên bản thu nhỏ:

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

và phiên bản dễ đọc hơn (có ý kiến!):

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

Thành thật mà nói mặc dù điều này chắc chắn sẽ không thắng, tôi chỉ vui mừng khi tìm và giảm thiểu một giải pháp hợp lý ngắn cho vấn đề này! (nhấn mạnh vào hợp lý): p


3

SÀI GÒN - 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

Với ngắt dòng / thụt lề / nhận xét:

%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

Không tốt như giải pháp của Art, nhưng đây là nỗ lực của tôi (người mới) với giải pháp C. 361 ký tự nếu bạn xóa dòng mới và tab.

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

Chỉnh sửa: Loại bỏ vòng lặp lồng nhau và sử dụng mảng 1D. Hy vọng nó sẽ tạo ra sự khác biệt lớn hơn, nhưng nó chỉ giúp tôi tiết kiệm được 30 ký tự. Đây là mã:

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

Chỉnh sửa: Đây là mã gốc, không có mã, dành cho những người quan tâm muốn biết cách "chơi gôn" được thực hiện. Mã này không tạo ra cảnh báo nào khi được biên dịch với GCC khi bật -Wall và C99. Có thể bạn là một người mới chơi golf như tôi, hoặc một người mới chơi C như tôi, hoặc có thể bạn chỉ tò mò. :) https://gist.github.com/cpx/97edbce4db3cb30c306a


3

Scala, 347 341 337 ký tự:

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

Úi. tôi đã đọc sai thuật toán và thay vì "5% cơ hội cho mỗi ký tự của nhân vật đó được thay thế bằng một ký tự ngẫu nhiên", tôi đã hoán vị một ký tự ngẫu nhiên duy nhất. sẽ sửa chữa.
Rob Starling

cố định và cắt tỉa một chút!
Rob Starling

trong scala 2.10, println("%2d: %s -- score: %d".format(i,a,s(a))có thể thay đổi thành println(f"$i%2d: $a%s -- score: ${s(a)}%d"), tiết kiệm 4 ký tự!
Rob Starling

((('A'to'Z') toSeq): + '') == "ABCDEFGHIJKLMNOPQRSTUVWXYZ" và 2% s không cần thiết để in chuỗi, lưu 9 ký tự
Chris

@Chris phiên bản nào của scala bạn đã chạy nó dưới? def c=(' '+:('A'to'Z'))(r(27))cho tôierror: type mismatch; found : Int required: scala.collection.generic.CanBuildFrom[scala.collection.immutable.IndexedSeq[Char],Char,?]
Rob Starling

2

PHP 438

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

Dễ đọc

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

xóa khoảng trắng thêm sau if\forđó, lúc 436. bạn cũng có thể kiểm tra $n>90một char khác
Einacio

Tôi thích điều này, nó thực sự có thể đọc được. Tôi đã tìm thấy một vài cải tiến có thể cho chức năng r()và của bạn s(). Dưới đây là những thay đổi với nhận xét: ideone.com/4ecZQc
Ông Llama

Oh, và tuyên bố printf của bạn có thể được rút ngắn. Các %sluôn là chiều dài tương tự và %dđược canh hàng trái, vì vậy bạn có thể sử dụng sau đây thay vì:printf("%2d: $s -- score: $l\n",$i);
Ông 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 là một ngôn ngữ dài dòng như vậy .. :(


2

Con trăn ( 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)

Phiên bản dễ đọc:

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)

Ví dụ đầu ra:

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

chỉnh sửa: xóa một vài ký tự dựa trên câu trả lời của AMK và Timtech


2
sum(1for c in range(28)if n[c]==t[c])có thể được rút ngắn thành sum(n[c]==t[c] for c in range(28))(-3 ký tự)
AMK

1
Tiết kiệm 5 ký tự, thay đổi import random as rđến from random import*và sau đó loại bỏ ba trường hợpr.
Timtech

1
Xin lỗi, tôi không nói tiếng Python. Là dòng số 0 trong đầu ra mẫu của bạn chỉ là sự trùng hợp kỳ lạ hay tập lệnh của bạn luôn bắt đầu với tất cả S? Thử thách đòi hỏi bắt đầu với một chuỗi các ký tự ngẫu nhiên.
Iszi

Nó bắt đầu với 28 ký tự ngẫu nhiên, nhưng chúng luôn giống nhau.
PsHegger

@Iszi Lol, nó không bao giờ nói rằng mỗi nhân vật phải là ngẫu nhiên! PsHegger: lol bắt đầu bằng tất cả chữ S phù hợp với tên ngôn ngữ của bạn;)
Doorknob

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

Phiên bản dễ đọc:

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

Tín dụng tối ưu hóa (319):

Tín dụng tối ưu hóa (312):

  • @ Ý kiến ​​của Einacio

tôi thích máy phát điện chung + bộ ngẫu nhiên
Einacio

bạn có thể thay đổi cả forcho $f=N;while($f--){3 char mỗi. và cho một char khác:$n=rand(0,26);[...]chr($n?$n+64:32)
Einacio

Trình tạo + ngẫu nhiên + tính toán điểm. :) Cảm ơn, tôi đã áp dụng tối ưu hóa của bạn.
anh trai 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

chạy ví dụ

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

Hồng ngọc - 225 202 203 198 ký tự

Ruby dường như chưa được đại diện trong thử thách này cho đến nay nên tôi nghĩ tôi sẽ thử! Cải tiến chào mừng.

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

Trong đầu ra của bạn, "thế hệ #" bắt đầu 1nhưng câu hỏi chỉ định 0. Nếu bạn khởi động g=-1thì không sao. Có thể có một cách thông minh hơn nhưng tôi đã làm theo cách đó. Chúc mừng, đồng nghiệp RubyGolfer.
Darren Stone

@DarrenStone Cuộc gọi tốt, cảm ơn! Chi phí cho một nhân vật nhưng tôi không thể nghĩ ra một cách tốt hơn.
Paul Prestidge

1
Bằng cách di chuyển mã vào chuỗi, bạn có thể nhận được 198 ký tự: (cùng hai dòng đầu tiên, sau đó là phần còn lại)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

Cuộc gọi tốt Tôi sẽ chỉnh sửa nó trong.
Paul Prestidge

2

Hồng ngọc, 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

Dòng đầu tiên chỉ đơn giản là một cách ưa thích để xác định q=-2, i=-1R=(0..27).to_a. Tất cả các công việc được thực hiện trong dòng thứ 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 Vui mừng bạn thích phong cách bình luận
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

Hãy thử trực tuyến!

-4 byte nhờ @ETHproductions.

Giải nén & Cách thức hoạt động

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 , với một chuyển đổi sang v1.4.5.
Xù xì

2

Japt -R , 94 byte

Một cách tiếp cận khác nhưng với một chút cảm hứng từ giải pháp của Bubbler .

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

Kiểm tra nó (hoặc dùng thử trực tuyến )


Giải trình

Dòng 1

Kết quả được gán cho biến 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

Dòng 2

Kết quả được gán cho biến 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

Dòng 3

Kết quả của dòng này được kết nối ngầm với dòng mới và đầu ra.

@=#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/$}/

Hãy thử trực tuyến!


1

Hồng ngọc - 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

Chỉnh sửa * Hiện tại nó không thành công (vì một số lý do, [any] đang được đặt thành 0 (loại => fixnum)). Tuy nhiên, thiết kế thực tế là đúng, tôi chỉ cần tìm lỗi khiến điều này xảy ra (nó rất bí ẩn)


1

Con trăn 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

Đã có một giải pháp JS ngắn hơn ở trên nhưng nó đang sử dụng các hàm con trỏ thử nghiệm, vì vậy tôi nghĩ rằng tôi đã ném vào một giải pháp khác đang chạy trong bất kỳ môi trường JS nào:

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

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

Chưa cắt

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

bản in đẹp

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

Tôi sẽ cần một ngôn ngữ ít dài hơn vào lần tới


Câu trả lời php ngắn nhất cho đến nay cũng được thực hiện!
Noelkd

có thể tốt hơn, nhưng tôi sẽ làm việc tốt
Einacio

bạn luôn có thể quay lại và cập nhật câu trả lời của mình
Noelkd

1

Python 2.7 - 319 byte

Chắc chắn nó không phải là nhỏ nhất, nhưng nó rất thú vị để lập trình.

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

Sử dụng một hàm đệ quy, vì vậy nó có thể đạt đến độ sâu đệ quy tối đa nếu có một loại phân tách kỳ lạ với chuỗi.

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

Rất lớn nhờ Sp3000 giúp đỡ chơi golf.


1

Julia, 281 byte

Chơi gôn

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

Thuật toán tự nó không thông minh lắm, nhưng có một số điều thú vị ở đây. Kết hợp một phạm vi ký tự với một ký tự khác, sau đó lập chỉ mục vào nó: ['A':'Z',' '][rand(1:27,n)]và lấy tổng của một mảng booleans (thông thường, nhưng tôi vẫn thích ý tưởng này) : sum(a.=="METHINKS IT IS LIKE A WEASEL".data). Vui vì tôi có dưới 300!

Ung dung:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.