गोल्फ एक वैसल कार्यक्रम


65

रिचर्ड डॉकिंस ने अपनी पुस्तक द ब्लाइंड वॉचमेकर में , एक वेसल कार्यक्रम का वर्णन किया है । एल्गोरिथ्म को निम्नानुसार वर्णित किया जा सकता है:

  1. 28 अक्षरों के एक यादृच्छिक स्ट्रिंग के साथ शुरू करें। मान्य वर्ण सभी अपरकेस अक्षर और स्थान हैं।

  2. उस स्ट्रिंग की 100 प्रतियां बनाएं, जिसमें उस चरित्र के 5% मौका के साथ यादृच्छिक चरित्र के साथ प्रतिस्थापित किया जा रहा है।

  3. प्रत्येक नए स्ट्रिंग की तुलना "METHINKS IT IS LIKE A WEASEL" लक्ष्य के साथ करें, और प्रत्येक को स्ट्रिंग में अक्षरों की संख्या के अनुसार स्कोर दें जो सही और सही स्थिति में हैं।

  4. यदि नए स्ट्रिंग्स में से किसी का भी पूर्ण स्कोर (28) है, तो रोकें।

  5. चरण 3 से उच्चतम स्कोरिंग स्ट्रिंग चुनें। आप कैसे टाई करते हैं यह आपके ऊपर है, लेकिन केवल एक स्ट्रिंग को चुना जा सकता है। चुना हुआ स्ट्रिंग लें और चरण 2 पर जाएं।

विजेता निम्नलिखित प्रारूप में प्रत्येक पीढ़ी के उच्चतम स्कोरिंग स्ट्रिंग को प्रिंट करते हुए सही उत्तर पाने के लिए सबसे छोटा कोड स्निपेट होगा:

कृपया इस प्रारूप में उत्तर दें

अगर लोग अन्य लोगों के जवाबों की जाँच करके मदद कर सकते हैं तो बहुत मददगार साबित होगा!


4
कौन से वर्णों की अनुमति है? यूनिकोड? छोटे?
ओरिऑल

4
आह, मुझे डॉकिंस से प्यार है। सौंदर्य, और एक साधारण एल्गोरिथ्म में दिखाए गए विकास की व्यवहार्यता।
क्रंचर

हो सकता है कि चरण 4 को "चरण 1.5) के साथ बदल दिया जाए। यदि नए तार में पूर्ण स्कोर (28), पड़ाव" और "चरण 4) उच्चतम स्कोरिंग स्ट्रिंग लें, और चरण 1.5 पर जाएं?" यही है, अगर प्रारंभिक यादृच्छिक स्ट्रिंग एक विजेता है, तो हमें बाहर पंखे की आवश्यकता है?
राब स्टारिंग

1
मैं यहाँ संचालन के क्रम में थोड़ा भ्रमित हूँ। क्या मूल स्ट्रिंग के आधार पर हम 100 नए तार बनाने का इरादा रखते हैं? या यह 100 नए तार है, पहला तार मूल पर आधारित होने के साथ, और प्रत्येक बाद के तार पिछले स्ट्रिंग पर आधारित है? एल्गोरिथ्म का वर्णन पूर्व का अर्थ लगता है, जबकि नमूना आउटपुट बाद का प्रतीत होता है।
इस्जि

2
निर्देश बहुत स्पष्ट हैं, लेकिन क्या होगा अगर मूल स्ट्रिंग लक्ष्य है?
क्रिश्चियन पामस्टीरना

जवाबों:


27

एपीएल (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⍴⊂⍵: की १०० प्रतियां बनाएँ । इनमें से प्रत्येक के लिए ...
      • 9≠?28/20: 1 से 20 तक 28 यादृच्छिक संख्याओं का चयन करें। एक बिटमास्क बनाएं जहां प्रत्येक का 1अर्थ है कि यादृच्छिक संख्या के बराबर नहीं था 9। (इसका मतलब 5% मौका है 0)।
      • ⍵{⍵:⍺⋄C[?27]}¨: प्रत्येक अक्षर के लिए , यदि संबंधित बिट था 1, तो उस पत्र को रखें, अन्यथा इसे बेतरतीब ढंग से चुने गए तत्व से बदलें C
    • 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
स्पष्टीकरण? यह वर्णमाला सूप जैसा दिखता है! :)
टोस्टमैलो

2
@ToastyMallows: जोड़ा स्पष्टीकरण
मारीनस

1
सबसे अच्छा जवाब अब तक, इसके साथ एक व्याख्या करने के लिए बहुत अच्छा है।
Noelkd

1
@marinus क्या आप एक जादूगर हैं?
toastyMallows 13

3
Bullcrap, तो आप सिर्फ एमएस वर्ड और इस्तेमाल किया Wingdings फ़ॉन्ट खोला
ठनी लूट का माल

11

गणितज्ञ - २३hem २३६ २२५

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

पायथन (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

के, 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

पायथन: 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
आपको भाषा को स्पष्ट रूप से बताना चाहिए और चूंकि प्रश्न को कोड-गोल्फ टैग किया गया है, इसलिए आपको एक चरित्र गणना प्रदान करनी चाहिए।
टिम सेगिन

करेंगे, युक्तियाँ टिम के लिए धन्यवाद।
Noelkd

इसके अलावा, आपको वर्ण संख्या को और कम करने के लिए सभी एक अक्षर के चर नामों का उपयोग करना चाहिए।
दरवाज़े

कुछ और नीचे उतरने के लिए बाद में इंतजार करना, फिर भी कुछ आसान जीत मिली। धन्यवाद।
Noelkd

1
क्या यह वास्तव में सभी समान अक्षरों से शुरू होना चाहिए? :)
जोकिम इसकसन 18

5

जावास्क्रिप्ट, 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। यह गलत मूल्य एक तार्किक-या झरना का कारण बनता है c(540) || h, इसलिए मूल mapमूल्य hका उपयोग किया जाता है (यानी, कोई प्रतिस्थापन नहीं होता है)।

  • स्कोर-संक्षेप आपरेशन करता है f+=h=="METHINKS IT IS LIKE A WEASEL"[p], जो कहते हैं, "जोड़ने trueके लिए fहै, तो वर्तमान mapचरित्र hसे मेल खाता pवें weasel स्ट्रिंग के चरित्र"। संख्या से अधिक बूलियन अलावा बूलियन परिणाम coerces के लिए या तो 0या 1, जिसका अर्थ है कि fवृद्धि की जाती है वह भी तब, लक्ष्य weasel स्ट्रिंग के खिलाफ एक मैच है।


आपको vकोड में क्यों कहा गया है? इसका उल्लेख कहीं और नहीं है। आप अपने आप को 2 वर्ण बचा सकते हैं।?
वैलेस्ट वेस्ट

1
@ Eliseod'Annunzio vमें संग्रहीत तीर कार्य करने के लिए एक तर्क है c: c = (v => ...)। यदि आप बिना तर्क के एक तीर फ़ंक्शन को परिभाषित करना चाहते हैं , तो ()=>...इसके बजाय एक के बजाय दो वर्णों की लागत होती है v=>..., इसलिए बेहतर होगा कि इसका अप्रयुक्त तर्क हो।
अप्सिलर्स

कोड का चतुर उपयोग!
वैलीवेस्ट

अच्छी चाल के साथ k=s=[28]और ++, मुझे नहीं पता था!
डोम हेस्टिंग्स

5

आर ( 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: ...यदि आप पहली बार आपको 1 catवेतन वृद्धि के cलिए आमंत्रित करते हैं, तो आप अपनी पहली पंक्ति कैसे प्राप्त करेंगे ? (+1 im एक घंटे के बाद से कोशिश कर रहा है फिर भी रूप में कुछ कम करने के लिए और मैं अभी भी नहीं कर सकते हैं :))
plannapus

@plannapus यह सच है, एक पुराने संस्करण से था (जो कुछ लंबा था)। या तो मैं इसे शुरुआत में -1 में बदल देता हूं, या पहली पंक्ति में 1 का उपयोग करता हूं ...
हेनरिक

मुझे आपके कोड में दो समस्याएं दिख रही हैं। सबसे पहले, यह ifelse(…,h(f,1),…)सभी चयनित पदों को समान यादृच्छिक वर्ण के साथ बदलता है। आप इस दिशा में नियमों की व्याख्या कर सकते हैं, लेकिन ऐसा लगता है कि उन्हें झुकना होगा इसलिए मैं कम से कम इसका उल्लेख करूंगा। दूसरा, आप लूप के s=zभीतर प्रतिस्थापित 1:100करते हैं, इसलिए आप एक ही स्ट्रिंग की 100 प्रतियां नहीं बना रहे हैं, लेकिन कभी-कभी एक कॉपी की नकल करते हैं। यह एक नियम को तोड़ने की तरह लगता है, केवल झुकने के लिए नहीं।
एमवीजी

5

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

सरल तीन छोरों, आरंभीकरण, माता-पिता से नए तार की पीढ़ी और एक ही बयान द्वारा गणना की गई स्कोर। यह इंडेंटेशन के साथ भी बहुत पठनीय नहीं है।

सी 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 से (बराबर) स्ट्रिंग को प्रिंट करता है, लेकिन यह या तो अंतिम स्ट्रिंग प्रिंट नहीं था। मैं स्टम्प्ड हूं कि इसे आकार में विस्फोट किए बिना इसे कैसे ठीक किया जाए। मैं इसे प्रेरणा के लिए वैसे भी पोस्ट कर रहा हूं।

सी 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 बार स्ट्रिंग को पुन: उत्पन्न करते हैं और आसान नकल के लिए संरचना असाइनमेंट का उपयोग करते हैं। प्रारंभिक -1 पर "100 बार दोहराएं" काउंटर शुरू करके और रणनीतिक रूप से चुने गए वेतन वृद्धि के बाद इसे सावधानी से संभाल कर किया जाता है। बहुत अलग दृष्टिकोण के बावजूद यह पहले प्रयास के समान ही समाप्त होता है - 256 अक्षर।


4

सी # - 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);}}}}

यह टूट गया है। आपको सिस्टम का उपयोग करने की आवश्यकता है; या मैन्युअल रूप से योग्यता प्रणाली।
इट्नोटली।

नहीं, तुम नहीं। ideone.com/4alNSi
टिया

बहुत सुंदर। एक खेद के रूप में NS घोषणा को देखा।
इट्नोटली।

3

लुआ 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

ईमानदारी से भले ही यह निश्चित रूप से नहीं जीतेगा, मुझे इस समस्या के लिए उचित समाधान खोजने और उसे कम करने में खुशी हुई! (यथोचित जोर): पी


3

एसएएस - 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

लाइनब्रेक / इंडेंट / टिप्पणियों के साथ:

%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

आर्ट सॉल्यूशन जितना अच्छा नहीं है, लेकिन यहाँ सी समाधान पर मेरा (नौसिखिया) प्रयास है। 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;}}

संपादित करें: यह उन लोगों के लिए मूल, असंयमित कोड है, जो यह जानने में रुचि रखते हैं कि "गोल्फिंग" कैसे किया गया था। जब GW के साथ संकलित और 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% मौका के बजाय एक यादृच्छिक चरित्र के साथ प्रतिस्थापित किया जा रहा है", मैंने एकल यादृच्छिक चरित्र की अनुमति दी थी। ठीक कर देंगे।
रोब स्टारिंग

तय किया और थोड़ा छंटनी की!
रोब स्टारिंग

scala में 2.10, में println("%2d: %s -- score: %d".format(i,a,s(a))बदल सकते हैं println(f"$i%2d: $a%s -- score: ${s(a)}%d"), जिससे 4 वर्ण बच सकते हैं!
रोब स्टारिंग

((('A'to'Z') toSeq): + '') == "ABCDEFGHIJKLMNOPQRSTUVWXYZ", और 2% s मुद्रण स्ट्रिंग के लिए आवश्यक नहीं हैं, 9 वर्णों की बचत
क्रिस

@ क्रिस किस संस्करण के तहत आप चला था? def c=(' '+:('A'to'Z'))(r(27))मुझे देता हैerror: type mismatch; found : Int required: scala.collection.generic.CanBuildFrom[scala.collection.immutable.IndexedSeq[Char],Char,?]
रॉब स्टारिंग

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एक और चार के लिए
Einacio

मुझे यह पसंद है, यह वास्तव में पठनीय है। मुझे आपके r()और s()कार्यों में कुछ संभावित सुधार मिले हैं । यहाँ टिप्पणियों के साथ परिवर्तन हैं: ideone.com/4ecZQc
श्री लामा

ओह, और आपके प्रिंटफ़ स्टेटमेंट को छोटा किया जा सकता है। %sहमेशा एक ही लंबाई है और %dउचित है ताकि आप के बजाय निम्न का उपयोग कर सकते छोड़ दिया है,:printf("%2d: $s -- score: $l\n",$i);
श्री लामा

2

जावा (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;}}

जावा एक ऐसी क्रिया भाषा है .. :(


2

पायथन ( 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

संपादित करें: AMKs और टिमटेक के उत्तर के आधार पर कुछ वर्ण हटा दिए गए


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 rfrom random import*r.
चार्ट्स

1
क्षमा करें, मैं अजगर नहीं बोलता। क्या आपके सैंपल आउटपुट में लाइन जीरो सिर्फ एक सनकी संयोग है या आपकी स्क्रिप्ट हमेशा सभी के साथ शुरू होती है S? चुनौती को यादृच्छिक पात्रों की एक स्ट्रिंग के साथ शुरू करने की आवश्यकता होती है।
इस्ति

यह 28 यादृच्छिक चरित्र के साथ शुरू होता है, लेकिन वे हमेशा समान होते हैं।
PsHegger

@ इज़ी लोल, यह कभी नहीं कहा कि प्रत्येक व्यक्तिगत चरित्र को यादृच्छिक होना था! PsHegger: सभी एस के साथ शुरू lol अपनी भाषा के नाम के लिए उचित है;)
दरवाज़े

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 की टिप्पणी

मुझे संयुक्त जनरेटर + रैंडमाइज़र पसंद है
Einacio

तुम दोनों को बदल सकता है forके लिए $f=N;while($f--){3 चार से प्रत्येक के लिए। और एक और चार के लिए:$n=rand(0,26);[...]chr($n?$n+64:32)
Einacio

जनरेटर + रैंडमाइज़र + स्कोर गणना। :) धन्यवाद, मैंने आपका अनुकूलन लागू किया।
भाई फिलिप

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तो यह ठीक है। एक होशियार तरीका हो सकता है लेकिन मैंने इसे इस तरह से किया। चीयर्स, साथी रूबीगोल्फ।
डैरेन स्टोन

@DarrenStone अच्छी कॉल, धन्यवाद! एक चरित्र का खर्च आता है लेकिन मैं बेहतर तरीके के बारे में नहीं सोच सकता था।
पॉल प्रेस्टिज

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
जस्टिन

अच्छा निर्णय! मैं इसे संपादित करूँगा।
पॉल प्रेस्टिज

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। सारा काम दूसरी पंक्ति में किया जाता है:

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 आपको टिप्पणी शैली पसंद है
जस्टिन

2

जाप 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 पर स्विच के साथ।
झबरा

2

जाप -R , 94 बाइट्स

एक अलग दृष्टिकोण लेकिन बब्लर के समाधान से थोड़ी प्रेरणा के साथ ।

;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 और आउटपुट के साथ जुड़ा हुआ है।

@=#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 पर सेट किया जा रहा है (टाइप => फिक्सनम))। हालांकि, वास्तविक डिज़ाइन सही है, मुझे बस बग ढूंढने की ज़रूरत है, क्योंकि ऐसा हो सकता है (यह बहुत रहस्यमय है)


1

अजगर 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

जावास्क्रिप्ट - 312

ऊपर एक छोटा जेएस समाधान पहले से ही है, लेकिन यह प्रायोगिक पॉइंटर फ़ंक्शन का उपयोग कर रहा है, इसलिए मैंने सोचा कि मैं किसी अन्य जेएस समाधान में फेंक दूंगा जो किसी भी जेएस समाधान में चल रहा है:

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

जावा: 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

पीएचपी 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";
}

मुझे अगली बार कम वाचाल भाषा की आवश्यकता होगी


अब तक का सबसे अच्छा php उत्तर!
Noelkd

बेहतर हो सकता है, लेकिन मैं काम से दूर
Einacio

आप हमेशा वापस आ सकते हैं और अपना जवाब अपडेट कर सकते हैं
Noelkd

1

पायथन 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 बाइट्स

golfed:

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)]और बूलियनों की एक सरणी का योग लेना (आम, लेकिन मुझे अभी भी विचार पसंद है) 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.