족제비 프로그램 골프


65

Richard Dawkins 는 자신의 저서 The Blind Watchmaker 에서 족제비 프로그램에 대해 설명합니다 . 알고리즘은 다음과 같이 설명 될 수 있습니다.

  1. 28 자의 임의 문자열로 시작하십시오. 유효한 문자는 모두 대문자와 공백입니다.

  2. 해당 캐릭터의 캐릭터 당 5 % 확률로 임의의 캐릭터로 교체하여 해당 문자열을 100 부 복사하십시오.

  3. 각각의 새 문자열을 대상 "Weasel과 같은 방법"과 비교하고 문자열의 글자 수에 따라 올바른 위치에 정확한 점수를 부여하십시오.

  4. 새 줄 중 하나에 완벽한 점수 (28)가 있으면 중단합니다.

  5. 3 단계에서 가장 높은 스코어링 문자열을 선택하십시오. 선택한 문자열을 가져 와서 2 단계로 이동하십시오.

우승자는 각 형식의 최고 점수 문자열을 다음 형식으로 인쇄하면서 정답을 얻는 가장 짧은 코드 스 니펫입니다.

이 형식으로 답변하십시오

사람들이 다른 사람들의 답변을 확인하여 도움을 줄 수 있다면 매우 도움이 될 것입니다!


4
어떤 문자가 허용됩니까? 유니 코드? 소문자?
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⍴⊂⍵: 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
설명? 이것은 알파벳 수프처럼 보입니다! :)
ToastyMallows

2
@ToastyMallows : 추가 설명
marinus

1
지금까지 가장 좋은 대답은 설명이 잘되어 있습니다.
Noelkd

1
@marinus 당신은 마법사입니까?
ToastyMallows

3
Bullcrap, 방금 MS Word를 열고 WingDings 글꼴을 사용했습니다
Embattled Swag

11

티카 - 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

파이썬 (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

파이썬 : 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
언어를 명시 적으로 명시해야하며 질문에 code-golf 태그가 지정되므로 문자 수를 제공해야합니다.
Tim Seguine

팁, 팀 감사합니다.
Noelkd

또한 문자 수를 더 줄이려면 하나의 문자 변수 이름을 모두 사용해야합니다.
Doorknob

나중에 골프를 좀 더 내리기까지 기다렸지 만 여전히 쉬운 승리를 거두었습니다. 감사.
Noelkd

1
실제로 같은 글자로 시작해야합니까? :)
Joachim Isaksson

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

변경 자유롭게 alertconsole.log당신이보다 쾌적한 실행 경험을합니다.

여기에 멋진 골프 비트가 있습니다.

  • 이 함수 c는 알파벳 문자열에서 임의의 문자를 반환합니다 " ABC...". 이 함수는 임의의 인덱스 선택에 대한 상한으로 사용할 인수를 사용합니다. 기본 문자열을 생성 할 때을 사용 27하므로 함수가 정상적으로 작동합니다.

    그러나 540 in의 임의의 상한을 요구하여이 동작을 남용합니다 h = c(540) || h. 시간의 5 %만이 c실제로 문자열을 반환합니다 (540 * .05 = 27이기 때문에). 시간의 다른 95 %에서 무작위로 선택한 인덱스가 문자열의 길이를 넘어서므로 함수는을 반환합니다 undefined. 이 잘못된 값으로 인해 논리 OR 캐스케이드가 발생 c(540) || h하므로 원래 maph이 사용됩니다 (즉, 대체가 발생하지 않음).

  • 수행 점수-합산 동작을 f+=h=="METHINKS IT IS LIKE A WEASEL"[p]말한다, "추가 truef현재의 경우 map문자가 h일치하는 p 족제비 문자열의 문자를". 수 플러스 부울 첨가 부울 결과 강제 변환에 하나 0또는 1그 의미는, f대상 문자열 족제비에 대한 일치가 존재하는 경우에만 증가된다.


v코드에 왜 언급 했습니까? 다른 곳에서는 언급되지 않았습니다. 당신은 2 문자를 저장할 수 있습니다.?
WallyWest

1
@ Eliseod'Annunzio는 v저장 화살표 함수의 인수이다 c: c = (v => ...). 인수없이 화살표 함수를 정의하려면 ()=>...하나 대신 두 개의 문자 v=>...가 필요하므로 사용하지 않는 인수를 갖는 것이 좋습니다.
apillers

영리한 코드 사용!
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: ...처음 호출 catc때 1로 증가 하면 첫 번째 줄을 얻는 방법은 무엇입니까? (그러나 그럼에도 불구하고 더 짧은 일을하기 위해 한 시간 이후 노력했지만 메신저는 여전히 :))
plannapus

@plannapus 사실은 구버전 (약간 더 길 었음)에서 나왔습니다. 처음에 -1로 바꾸거나 첫 번째 줄에 1을 사용하십시오.
Henrik

코드에 두 가지 문제가 있습니다. 먼저 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;}

간단한 세 개의 루프, 초기화, 부모로부터 새로운 문자열 생성 및 같은 문장으로 계산 된 점수. 들여 쓰기로도 읽기가 쉽지 않습니다.

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 번 재생성하고 쉽게 복사하기 위해 구조체 할당을 사용합니다. 초기화는 -1에서 "100 회 반복"카운터를 시작하고 전략적으로 선택된 사후 증분에 의해 신중하게 처리하여 수행됩니다. 매우 다른 접근 방식에도 불구하고 첫 번째 시도 인 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);}}}}

이 고장입니다. 시스템을 사용해야합니다. 또는 수동 적격 시스템.
NotALie입니다.


아 좋아. NS 선언을 사용하여 죄송합니다.
NotALie입니다.

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

솔직히 말해서 이것이 이길 수는 없지만 이 문제에 대한 합리적으로 짧은 해결책 을 찾아서 최소화하는 것이 기뻤습니다 ! (합리적으로 강조) : 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

줄 바꿈 / 들여 쓰기 / 주석 포함 :

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

편집 : 이것은 "골프"가 어떻게 수행되었는지 알고 싶어하는 사람들을위한 원래의 언 골프 코드입니다. 코드는 -Wall 및 C99가 활성화 된 GCC로 컴파일 될 때 경고를 생성하지 않습니다. 어쩌면 당신은 나와 같은 골프 초보자이거나 나 같은 C 초보자이거나 아마도 궁금 할 것입니다. :) 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 개의 문자가 필요하지 않으므로 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;}

간단히 :

<?
//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
Mr. Llama

아, 그리고 당신의 printf 진술은 단축 될 수 있습니다. 의 %s길이는 항상 동일하고 자리 %d맞추기 때문에 다음을 대신 사용할 수 있습니다.printf("%2d: $s -- score: $l\n",$i);
Mr. Llama

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

편집 : 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 rfrom random import*의 세 개의 인스턴스를 제거 다음과r.
Timtech

1
죄송합니다, 저는 파이썬을 못해요. 샘플 출력의 줄 0은 단지 우연의 일치 S입니까? 아니면 스크립트는 항상 모두로 시작 합니까? 도전 과제는 임의의 문자열로 시작해야합니다.
Iszi

28 개의 임의 문자로 시작하지만 항상 동일합니다.
PsHegger

@ Iszi Lol, 그것은 각 개별 문자가 무작위 여야한다고 말한 적이 없습니다! PsHegger : 모든 S로 시작하는 lol은 귀하의 언어 이름에 적합합니다.;)
Doorknob

2

PHP ( 388197323319312 ) :

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

  • @ 아 이나시오의 의견

나는 공동 생성기 + 무작위
추출기를

당신은 모두 바꿀 수 for에 대한 $f=N;while($f--){3 문자 각각에 대해. 다른 문자 :$n=rand(0,26);[...]chr($n?$n+64:32)
Einacio

생성기 + 무작위 추출기 + 점수 계산. :) 감사합니다. 최적화를 적용했습니다.
형제 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괜찮습니다. 더 똑똑한 방법이있을 수 있지만 그렇게했습니다. 건배, 루비 골퍼
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
저스틴

좋은 전화! 편집 할 것입니다.
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. 모든 작업은 두 번째 줄에서 수행됩니다.

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

온라인으로 사용해보십시오!

@ETHproductions 덕분에 -4 바이트.

포장 풀기 및 작동 방식

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

v1.4.5로 전환되는 106 바이트 .
Shaggy

2

apt -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 호선

결과가 variable에 할당됩니다 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 호선

결과가 variable에 할당됩니다 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 호선

이 줄의 결과는 암시 적으로 줄 바꿈 및 출력과 결합됩니다.

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

편집 * 현재 실패하고 있습니다 (어떤 이유로 a [any]가 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

위에는 더 짧은 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

자바 : 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";
}

다음에는 덜 장황한 언어가 필요합니다


가장 짧은 PHP 답변은 지금까지 잘되었습니다!
Noelkd

더 나을 수는 있지만 일을
마쳤다

항상 돌아와서 답변을 업데이트 할 수 있습니다
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 바이트

골프 :

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 세 이하로 다행입니다.

언 골프 드 :

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.