โปรแกรมการเล่นกอล์ฟพังพอน


65

ริชาร์ดว์คินส์ในหนังสือของเขาตาบอดนาฬิกาอธิบายโปรแกรมพังพอน อัลกอริทึมสามารถอธิบายได้ดังนี้

  1. เริ่มต้นด้วยสตริงสุ่ม 28 ตัวอักษร อักขระที่ถูกต้องคือตัวอักษรตัวพิมพ์ใหญ่และเว้นวรรค

  2. ทำสำเนา 100 ของสตริงนั้นโดยมีโอกาส 5% ต่อตัวละครของตัวละครนั้น ๆ ที่ถูกแทนที่ด้วยตัวอักษรแบบสุ่ม

  3. เปรียบเทียบแต่ละสตริงใหม่กับเป้าหมาย "วิธีการมันเหมือนพังพอน" และให้คะแนนแต่ละคะแนนตามจำนวนตัวอักษรในสตริงที่ถูกต้องและอยู่ในตำแหน่งที่ถูกต้อง

  4. หากสตริงใหม่ใด ๆ มีคะแนนสมบูรณ์แบบ (28) ให้หยุด

  5. เลือกสตริงที่ให้คะแนนสูงสุดจากขั้นตอนที่ 3 วิธีการผูกเน็คไทล์ของคุณนั้นขึ้นอยู่กับคุณ แต่อาจเลือกได้เพียงหนึ่งสาย ใช้สตริงที่เลือกและไปที่ขั้นตอนที่ 2

ผู้ชนะจะเป็นข้อมูลโค้ดสั้นที่สุดเพื่อไปยังคำตอบที่ถูกต้องในขณะที่พิมพ์สตริงที่ให้คะแนนสูงสุดของแต่ละรุ่นในรูปแบบต่อไปนี้:

โปรดตอบในรูปแบบนี้

หากคนสามารถช่วยได้โดยการตรวจสอบคำตอบของคนอื่น ๆ จะเป็นประโยชน์มาก!


4
อนุญาตให้ใช้ตัวอักขระใด Unicode? ตัวพิมพ์เล็ก?
Oriol

4
อ่าฉันรักดอว์คินส์ ความงามและความเป็นไปได้ของวิวัฒนาการที่แสดงในอัลกอริทึมง่าย ๆ
Cruncher

ขั้นตอนที่ 4 อาจถูกแทนที่ด้วย "ขั้นตอนที่ 1.5) หากสตริงใหม่มีคะแนนสมบูรณ์แบบ (28), หยุด" และ "ขั้นตอนที่ 4) ใช้สตริงการให้คะแนนสูงสุดและไปที่ขั้นตอน 1.5" นั่นคือถ้าสตริงสุ่มเริ่มต้นเป็นผู้ชนะต้องการให้เราเปล่งออกมาหรือไม่
Rob Starling

1
ฉันสับสนเล็กน้อยตามคำสั่งของการดำเนินการที่นี่ ความตั้งใจที่เราจะสร้าง 100 สายใหม่ขึ้นอยู่กับสายเดิม? หรือมันคือ 100 สายใหม่ที่มีสายแรกจะขึ้นอยู่กับต้นฉบับและสตริงที่ตามมาแต่ละครั้งขึ้นอยู่กับสตริงก่อนหน้า? คำอธิบายอัลกอริทึมดูเหมือนจะบ่งบอกถึงอดีตในขณะที่ผลลัพธ์ตัวอย่างจะเป็นของหลัง
Iszi

2
คำแนะนำค่อนข้างชัดเจน แต่จะเกิดอะไรขึ้นถ้าสตริงเดิมคือเป้าหมาย
Christian Palmstierna

คำตอบ:


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

คำอธิบาย:

  • 0{... }⊃∘(C←27↑⎕A)¨?28/27: ตั้งค่าCเป็นตัวพิมพ์ใหญ่ 27 ตัวแรก มีเพียง 26 ดังนั้นองค์ประกอบที่ 27 จะเป็นช่องว่าง เลือก 28 Cรายการที่สุ่มจาก นี้จะเป็นครั้งแรก ครั้งแรก(รุ่น) 0จะ

  • ⍵≢T←'METHINKS IT IS LIKE A WEASEL: ตั้งสตริงT 'METHINKS IT IS LIKE A WEASEL'ตราบใดที่ไม่เท่ากับT:

    • {... }¨100⍴⊂⍵: Make 100 ชุดของ สำหรับแต่ละเหล่านี้ ...
      • 9≠?28/20: เลือก 28 ตัวเลขสุ่มจาก 1 ถึง 20 ทำให้ bitmask ที่แต่ละหมายความว่าจำนวนสุ่มไม่เท่ากับ1 9(ซึ่งหมายถึงโอกาส 5% ของ a 0)
      • ⍵{⍵:⍺⋄C[?27]}¨เพราะแต่ละตัวอักษรในถ้าบิตที่สอดคล้องกันคือให้ตัวอักษรที่มิฉะนั้นแทนที่ด้วยองค์ประกอบที่สุ่มเลือกจาก1C
    • c←: เก็บ 100 cสายกลายพันธุ์ใน
    • G←{+/⍵=T}¨cสำหรับองค์ประกอบในแต่ละcคำนวณคะแนน (จำนวนตัวอักษรที่ตรงT) Gและเก็บคะแนนใน
    • s←⌈/G: sหาคะแนนสูงสุดและเก็บในที่
    • c←⊃c/⍨G=s: เลือกรายการแรกcที่มีคะแนนเท่ากับs(สูงสุด) แล้วเก็บไว้cอีกครั้ง
    • ⎕←(⍕⍺),':'c'-- score:',s: พิมพ์การสร้างในรูปแบบที่กำหนด ( เป็นรุ่นcปัจจุบันเป็นสตริงที่ดีที่สุดในปัจจุบันsคือคะแนน)
    • c∇⍨1+⍺: เพิ่มการสร้างและเรียกใช้การกลายพันธุ์อีกครั้งโดยใช้สตริงที่ดีที่สุดในปัจจุบัน ( c) เป็นอินพุต

5
คำอธิบาย? ดูเหมือนว่าซุปตัวอักษร! :)
ToastyMallows

2
@ToastyMallows: เพิ่มคำอธิบาย
marinus

1
คำตอบที่ดีที่สุดจนถึงตอนนี้มีคำอธิบายที่ดี
Noelkd

1
@marinus คุณเป็นพ่อมดหรือไม่?
ToastyMallows

3
Bullcrap คุณเพิ่งเปิด MS Word และใช้แบบอักษร 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],]

ตัวอย่างผลลัพธ์

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 ตัวอักษรไม่มีเครื่องหมายทวิภาคกึ่ง

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 กับ:

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
คุณควรระบุภาษาอย่างชัดเจนและเนื่องจากคำถามถูกติดแท็กโค้ดกอล์ฟคุณควรระบุจำนวนตัวอักษร
Tim Seguine

จะทำอย่างไรขอบคุณสำหรับเคล็ดลับทิม
Noelkd

นอกจากนี้คุณควรใช้ชื่อตัวแปรตัวอักษรหนึ่งตัวเพื่อลดจำนวนตัวอักษรต่อไป
ลูกบิดประตู

รอจนถึงภายหลังเพื่อเล่นกอล์ฟต่อไปอีกยังคงได้รับชัยชนะง่าย ๆ ขอบคุณ
Noelkd

1
มันควรที่จะเริ่มต้นด้วยตัวอักษรเดียวกันทั้งหมดหรือไม่? :)
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))

(ต้องการการสนับสนุนฟังก์ชั่นลูกศรเพิ่มการเยื้องเพื่อให้สามารถอ่านได้เท่านั้น)

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

อย่าลังเลที่จะเปลี่ยนalertเป็นconsole.logถ้าคุณต้องการประสบการณ์การดำเนินการที่น่าพอใจมากขึ้น

มีบิตกอล์ฟที่ดีอยู่ที่นี่:

  • ฟังก์ชั่นส่งกลับเป็นตัวละครที่สุ่มจากสตริงตัวอักษรc " ABC..."ฟังก์ชันรับอาร์กิวเมนต์เพื่อใช้เป็นขอบเขตสูงสุดสำหรับการเลือกดัชนีแบบสุ่ม เมื่อสร้างสตริงฐานเราใช้27ดังนั้นฟังก์ชันจะทำงานตามปกติ

    อย่างไรก็ตามเราละเมิดพฤติกรรมนี้โดยขอสุ่มขอบเขตบนของ 540 h = c(540) || hใน มีเพียง 5% เท่านั้นที่จะcส่งคืนสตริง (เนื่องจาก 540 * .05 = 27) อีก 95% undefinedของเวลาที่ดัชนีสุ่มเลือกตกเกินกว่าความยาวของสตริงเพื่อให้ผลตอบแทนที่ฟังก์ชั่น ค่าเท็จนี้ทำให้เกิดตรรกะหรือ OR น้ำตกเข้าc(540) || hดังนั้นจึงใช้mapค่าดั้งเดิมh(กล่าวคือไม่มีการแทนที่เกิดขึ้น)

  • การดำเนินการคะแนน-ข้อสรุปไม่f+=h=="METHINKS IT IS LIKE A WEASEL"[p]ซึ่งบอกว่า "เพิ่มtrueไปfถ้าปัจจุบันmapตัวละครที่hตรงกับpวันที่ตัวละครของสตริงอีเห็น" การเพิ่มตัวเลขบวก - บูลีนจะรวมผลลัพธ์บูลีนเข้าด้วยกัน0หรือ1ซึ่งหมายความว่าfจะเพิ่มขึ้นเฉพาะเมื่อมีการจับคู่กับสตริง WEASEL เป้าหมาย


ทำไมคุณถึงได้vระบุไว้ในรหัส? ไม่มีการพูดถึงที่อื่นในนั้น คุณสามารถบันทึก 2 ตัวอักษร?
WallyWest

1
@ Eliseod'Annunzio vเป็นอาร์กิวเมนต์ฟังก์ชั่นที่ลูกศรที่เก็บไว้ใน:c c = (v => ...)หากคุณต้องการกำหนดฟังก์ชั่นลูกศรโดยไม่มีข้อโต้แย้งมันมีค่าใช้จ่ายอักขระสองตัว()=>...แทนที่จะเป็นหนึ่งv=>...ดังนั้นจะเป็นการดีกว่าถ้าคุณมีอาร์กิวเมนต์ที่ไม่ได้ใช้
apsillers

การใช้รหัสอย่างชาญฉลาด!
WallyWest

นิสัยดีด้วยk=s=[28]และ++ฉันก็ไม่รู้เลย!
Dom Hastings

5

R ( 245 239 238 ตัวอักษร)

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

ให้:

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

วิธีรับบรรทัดแรกของคุณ0: ...อย่างไรถ้าครั้งแรกที่catคุณเพิ่มขึ้นcเป็น 1 (+1 กระนั้นเป็น im พยายามตั้งแต่ชั่วโมงที่จะทำอะไรบางอย่างที่สั้นลงและฉันยังคงไม่สามารถ :))
plannapus

@plannapus นั่นเป็นความจริงมาจากเวอร์ชั่นเก่า (ซึ่งค่อนข้างนานกว่า) ไม่ว่าฉันจะเปลี่ยนมันเป็น -1 ในการเริ่มต้นหรือใช้ 1 ในบรรทัดแรก ...
เฮนริก

ฉันเห็นปัญหาสองประการเกี่ยวกับรหัสของคุณ ครั้งแรกนี้ifelse(…,h(f,1),…)จะแทนที่ตำแหน่งที่เลือกทั้งหมดด้วยถ่านแบบสุ่มที่เหมือนกัน คุณสามารถตีความกฎในทิศทางนี้ได้ แต่มันให้ความรู้สึกเหมือนงอพวกเขาดังนั้นอย่างน้อยฉันก็จะพูดถึงมัน ประการที่สองคุณแทนที่s=zภายใน1:100ลูปดังนั้นคุณไม่ได้สร้าง 100 สำเนาของสตริงเดียวกัน แต่บางครั้งก็อปปี้ ดูเหมือนว่าจะเป็นการละเมิดกฎสำหรับฉันไม่ใช่เพียงแค่ก้มเท่านั้น
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;}

Simple สามลูป, การเริ่มต้น, การสร้างสตริงใหม่จากพาเรนต์และคะแนนที่คำนวณโดยคำสั่งเดียวกัน มันไม่สามารถอ่านได้แม้จะมีการเยื้อง

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

หนึ่งลูปโดยมีหนึ่งอาเรย์ถือสาย 101 ทั้งหมด

รุ่นที่สองนี้แบ่งกฎเนื่องจากจะพิมพ์สตริงจาก (เทียบเท่า) ขั้นตอนที่ 1 แต่มันเป็นอย่างนั้นหรือไม่พิมพ์สตริงสุดท้าย ฉันนิ่งงันวิธีแก้ไขโดยไม่ขยายขนาด ฉันโพสต์ไว้เพื่อเป็นแรงบันดาลใจ

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

วิธีการที่แตกต่างกันแทนที่จะสร้างอาเรย์เพื่อเก็บสตริง 101 เพียงแค่สร้างสตริงใหม่ 100 ครั้งและใช้การกำหนด struct สำหรับการคัดลอกได้ง่าย การเริ่มต้นทำได้โดยเริ่มจากตัวนับ "ซ้ำ 100 ครั้ง" ที่ -1 และจัดการอย่างระมัดระวังโดยการเพิ่มภายหลังการเลือกอย่างมีเทคนิค แม้จะมีวิธีที่แตกต่างกันมาก แต่มันก็จบลงเหมือนกับความพยายามครั้งแรก - 256 ตัวอักษร


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

นี่มันหัก คุณต้องใช้ระบบ หรือระบบที่ผ่านการรับรองด้วยตนเอง
It'sNotALie

ไม่คุณทำไม่ได้ ideone.com/4alNSi
tia

อ่าดี มองว่าการประกาศ NS เป็นการใช้คำขอโทษ
It'sNotALie

3

Lua 5.1 (502)

เวอร์ชันย่อเล็กสุด:

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

และเวอร์ชันที่อ่านง่ายขึ้น (พร้อมความคิดเห็น!):

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

พูดตามตรงถึงแม้ว่ามันจะไม่ชนะแน่นอนฉันก็ดีใจที่ได้พบและลดวิธีแก้ปัญหาสั้น ๆ ที่สมเหตุสมผลสำหรับปัญหานี้! (เน้นที่เหตุผล): 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

ด้วย linebreaks / เยื้อง / ความคิดเห็น:

%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

ไม่ดีเท่ากับโซลูชันของ Art แต่นี่คือความพยายาม (มือใหม่) ของฉันในการแก้ปัญหา C 361 ตัวอักษรหากคุณลบบรรทัดใหม่และแท็บ

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

แก้ไข: กำจัดลูปที่ซ้อนกันและใช้อาร์เรย์ 1D หวังว่ามันจะสร้างความแตกต่างที่ยิ่งใหญ่กว่า แต่มันช่วยฉันได้แค่ 30 ตัวอักษรเท่านั้น นี่คือรหัส:

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

แก้ไข: นี่เป็นรหัสดั้งเดิมที่ไม่ได้รับการดัดแปลงสำหรับผู้ที่สนใจที่จะรู้ว่า "กอล์ฟ" เสร็จสิ้นแล้ว รหัสจะไม่มีคำเตือนเมื่อคอมไพล์ด้วย GCC ที่เปิดใช้งาน -Wall และ C99 บางทีคุณอาจเป็นนักกอล์ฟมือใหม่อย่างฉันหรือมือใหม่อย่างฉันหรือบางทีคุณแค่อยากรู้อยากเห็น :) https://gist.github.com/cpx/97edbce4db3cb30c306a


3

สกาล่า 347 341 337 ตัวอักษร:

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

อุ่ย ฉันเข้าใจอัลกอริธึมและแทนที่จะเป็น "โอกาส 5% ต่อตัวละครของตัวละครนั้นที่ถูกแทนที่ด้วยตัวละครแบบสุ่ม" ฉันได้อนุญาตตัวละครแบบสุ่มตัวเดียว จะแก้ไข
Rob Starling

แก้ไขและตัดแต่งเล็กน้อย!
Rob Starling

ใน scala 2.10 println("%2d: %s -- score: %d".format(i,a,s(a))สามารถเปลี่ยนเป็นprintln(f"$i%2d: $a%s -- score: ${s(a)}%d")ประหยัดได้ 4 ตัวอักษร!
Rob Starling

((('A'to'Z') toSeq): + '') == "ABCDEFGHIJKLMNOPQRSTUVWXYZ" และ 2% s ไม่จำเป็นสำหรับการพิมพ์สตริงประหยัด 9 ตัวอักษร
Chris

@ Chris สกาล่ารุ่นใดที่คุณใช้งานภายใต้ def c=(' '+:('A'to'Z'))(r(27))ให้ฉันerror: 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;
}

ลบช่องว่างพิเศษออกหลังจากif\forนั้นคือที่ 436 คุณสามารถตรวจสอบ$n>90ตัว
ละคร

ฉันชอบสิ่งนี้มันสามารถอ่านได้จริง ฉันพบการปรับปรุงที่เป็นไปได้บางอย่างสำหรับคุณr()และs()ฟังก์ชั่น นี่คือการเปลี่ยนแปลงที่มีความคิดเห็น: ideone.com/4ecZQc
Mr. Llama

โอ้และคำสั่ง printf ของคุณสามารถสั้นลงได้ %sอยู่เสมอระยะเวลาเดียวกันและ%dที่เหลือเป็นธรรมเพื่อให้คุณสามารถใช้ต่อไปนี้แทน:printf("%2d: $s -- score: $l\n",$i);
นาย 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 เป็นภาษา verbose เช่น .. :(


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)

รุ่นที่อ่านได้:

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)

ตัวอย่างผลลัพธ์:

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

แก้ไข: ลบอักขระไม่กี่ตัวตามคำตอบของ AMK และ Timtechs


2
sum(1for c in range(28)if n[c]==t[c])อาจย่อให้เหลือsum(n[c]==t[c] for c in range(28))(-3 ตัวอักษร)
AMK

1
บันทึก 5 ตัวอักษรเปลี่ยนimport random as rเป็นfrom random import*แล้วลบอินสแตนซ์ทั้งสามของr.
Timtech

1
ขอโทษฉันไม่พูด Python บรรทัดศูนย์ในผลลัพธ์ตัวอย่างของคุณเป็นเพียงเรื่องบังเอิญหรือสคริปต์ของคุณเริ่มต้นด้วยทุกสิ่งSหรือไม่ ความท้าทายต้องเริ่มต้นด้วยสตริงอักขระแบบสุ่ม
Iszi

มันเริ่มต้นด้วย 28 ตัวอักษรแบบสุ่ม แต่มันก็เหมือนกันเสมอ
PsHegger

@ Iszi Lol มันไม่เคยพูดว่าตัวละครแต่ละตัวต้องสุ่ม! PsHegger: ฮ่า ๆ เริ่มต้นด้วย S's เหมาะสมสำหรับชื่อภาษาของคุณ;)
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);

รุ่นที่อ่านได้:

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

เครดิตการเพิ่มประสิทธิภาพ (319):

เครดิตการเพิ่มประสิทธิภาพ (312):

  • @ ความคิดเห็นของ Einacio

ฉันชอบตัวสร้างข้อต่อ + randomizer
Einacio

คุณสามารถเปลี่ยนทั้งforสำหรับ$f=N;while($f--){3 ถ่านแต่ละ และตัว$n=rand(0,26);[...]chr($n?$n+64:32)
ละคร

การคำนวณ Generator + Randomizer + คะแนน :) ขอบคุณฉันใช้การเพิ่มประสิทธิภาพของคุณ
พี่ชาย Filip

2

ทับทิม, 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

ตัวอย่างการรัน

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

ทับทิม - 225 202 203 198 ตัวอักษร

ดูเหมือนว่าทับทิมจะอยู่ภายใต้การท้าทายนี้ดังนั้นฉันคิดว่าฉันจะลองดู! ยินดีต้อนรับการปรับปรุง

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

ในการส่งออกของคุณ "รุ่น #" เริ่มต้นที่แต่ระบุคำถาม1 0หากคุณเริ่มต้นด้วยg=-1ก็ไม่เป็นไร อาจมีวิธีที่ชาญฉลาด แต่ฉันทำอย่างนั้น ไชโยเพื่อน RubyGolfer
Darren Stone

@DarrenStone โทรดีขอบคุณ! ราคาตัวละคร แต่ฉันไม่สามารถคิดวิธีที่ดีกว่า
Paul Prestidge

1
โดยการย้ายรหัสลงในสตริงคุณสามารถรับได้ถึง 198 ตัวอักษร: (สองบรรทัดแรกเหมือนกันจากนั้นส่วนที่เหลือ)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

โทรดี! ฉันจะแก้ไขมัน
Paul Prestidge

2

ทับทิม, 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

บรรทัดแรกเป็นเพียงวิธีแฟนซีเพื่อกำหนดq=-2, และi=-1 R=(0..27).to_aงานทั้งหมดทำในบรรทัดที่ 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 ดีใจที่คุณชอบสไตล์การแสดงความคิดเห็น
Justin

2

Japt v2.0a0, 112 108 ไบต์

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

ลองออนไลน์!

-4 ไบต์ขอบคุณ @ETHproductions

เอาออกแล้วมันทำงานอย่างไร

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 ไบต์พร้อมสวิตช์เป็น v1.4.5
Shaggy

2

Japt -R , 94 ไบต์

วิธีการที่แตกต่างกันไป แต่มีแรงบันดาลใจเล็ก ๆ น้อย ๆ จากการแก้ปัญหาของ Bubbler

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

ทดสอบ (หรือลองออนไลน์ )


คำอธิบาย

บรรทัด 1

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

บรรทัด 2

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

บรรทัดที่ 3

ผลลัพธ์ของบรรทัดนี้ถูกรวมเข้ากับ newlines และ output โดยปริยาย

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


1

ทับทิม - 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

แก้ไข * ขณะนี้ล้มเหลว (ด้วยเหตุผลบางอย่าง [ใด ๆ ] กำลังถูกตั้งค่าเป็น 0 (type => fixnum)) อย่างไรก็ตามการออกแบบที่แท้จริงนั้นถูกต้องฉันแค่ต้องพบข้อผิดพลาดที่ทำให้สิ่งนี้เกิดขึ้น (มันลึกลับมาก)


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

มีวิธีแก้ปัญหา JS ที่สั้นกว่าข้างต้นอยู่แล้ว แต่ใช้ฟังก์ชันตัวชี้แบบทดลองดังนั้นฉันคิดว่าฉันจะใช้วิธีอื่นที่ทำงานในสภาพแวดล้อม JS:

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

ยังไม่ได้เปิด:

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

พิมพ์สวย

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

ฉันจะต้องการภาษา verbose น้อยลงในครั้งต่อไป


คำตอบ PHP สั้นที่สุดทำได้ดีมาก!
Noelkd

น่าจะดีกว่านี้ แต่ฉันอยากทำงาน
Einacio

คุณสามารถกลับมาและอัปเดตคำตอบของคุณได้ตลอดเวลา
Noelkd

1

Python 2.7 - 319 ไบต์

แน่นอนว่ามันไม่ได้เล็กที่สุด แต่ก็สนุกกับการเขียนโปรแกรม

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

ใช้ฟังก์ชั่นการเรียกซ้ำดังนั้นมันอาจจะถึงความลึกการเรียกซ้ำสูงสุดหากมีการเบี่ยงเบนแปลก ๆ บางอย่างกับสตริง

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

ต้องขอบคุณ Sp3000 อย่างมากสำหรับความช่วยเหลือในการเล่นกอล์ฟ


1

จูเลีย 281 ไบต์

แข็งแรงเล่นกอล์ฟ:

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

อัลกอริทึมนั้นไม่ฉลาดมาก แต่ก็มีบิตเด็ด ๆ อยู่ที่นี่ รวมหลากหลายตัวละครที่มีตัวละครอื่นแล้วทำดัชนีลงไปในมัน['A':'Z',' '][rand(1:27,n)]และการรวมของอาร์เรย์ของ booleans นั้น (เหมือนกัน sum(a.=="METHINKS IT IS LIKE A WEASEL".data)แต่ฉันยังคงรักความคิด): ดีใจที่ฉันได้ต่ำกว่า 300!

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.