루비, 272 바이트
g가독성을 높이기 위해 중첩 함수의 양쪽에 불필요한 줄 바꿈 두 개가 코드에 추가됩니다 . 이들은 점수에서 제외됩니다. f=익명 함수를 변수에 할당하는 문자 도 제외됩니다.
출력 형식은 Ruby의 기본 및 대신에 질문에 따라 0또는 1입니다 . 공백이 아닌 개행 문자는 부울과 단어를 구분하는 데 사용됩니다. 내 이해는 이것이 출력 요구 사항에 대한 수용 가능한 해석이지만 그렇지 않은 경우 바이트 수에 미치는 영향은 적을 것입니다.truefalse
f=->n,l{c=''
x=[p=6*n,1,-p,-1]
(m=3*p*n).times{|i|c<<(5+i/n%6-i/n/p&6==6?65+rand(26):i%p==p-1?10:46)}
q=m+3*n
puts c
g=->w,i,d{w==''?$r=1:c[i]<?A?g[w,(i+x[d])%q,d^1]:w[0]==c[i]&&4.times{|j|g[w[1..-1],(i+x[j])%q,j^1]}}
l.each{|w|$r=0
m.times{|i|c[i]>?@&&g[w,i,0]}
puts $r,w}}
산출
다음과 같이 약 50 번의 호출 후 :
f[4,['PPCG','CODE','GOLF','ANT','CAN','CUBE','WORD','WALK','SPELL']]
나는 마침내 2 타격으로 다음과 같은 결과를 얻었다. ANT일수록 우측 하단이며,이 AN공유하는 CAN와 C왼쪽에 배치 라운드.
....KCAAXRHT...........
....ALRZXRKL...........
....NDDLCMCT...........
....ETQZHXQF...........
........FYYUSRZX.......
........CFNPAUVX.......
........ZTJVHZVQ.......
........AUWKGVMC.......
............XWKSDWVZ...
............DPLUVTZF...
............DMFJINRJ...
............ZRXJIAFT...
0
PPCG
0
CODE
0
GOLF
1
ANT
1
CAN
0
CUBE
0
WORD
0
WALK
0
SPELL
설명
선택된 큐브의 특정 전개는 그리기의 용이성, 주로 검색의 용이성으로 부분적으로 선택되었습니다.
알파벳이 아닌 문자 (각 줄의 끝에 점과 개행 문자)는 개미가 걷는 곳에서 중요한 부분입니다.
검색은 함수 g에 중첩 된 재귀 함수에 의해 수행됩니다 f. 전달 된 단어가 빈 문자열이면 검색이 완료되고 1 $r로 설정됩니다. 개미가 단어의 첫 문자에 해당하는 문자 사각형에 있으면 검색이 네 방향으로 계속 진행됩니다. 함수가 다시 호출됩니다. 첫 글자를 제거하여 단어를 줄였습니다. 이 경우 방향 매개 변수는 무시됩니다. 이동은 다음의 값으로 변경된 셀 인덱스를 재귀 적으로 호출하여 수행됩니다 x.. 즉, 맨 아래 줄이 올바른 가로 오프셋을 사용하여 위쪽으로, 그 반대로 줄 바꿈됩니다.
개미가 문자가 아닌 사각형에 있으면 문자 사각형을 찾을 때까지 계단으로 지그재그로 움직여야합니다. 그녀는 남동쪽 또는 북서 방향으로 zizag합니다. d이동을 추적하기 위해 매번 1 씩 매개 변수가 XOR 되는 재귀 호출로 시뮬레이션됩니다 . 그녀가 다음 문자 사각형에 도달 할 때까지 입력 단어가 단축되지 않습니다. 편리하게, 이것은 문자가있는 영역에서 검색 할 때 사용되는 것과 동일한 재귀로 수행 할 수 있습니다. 차이점은 문자 영역의 4와 달리 개미가 공백 영역에있을 때 재귀에는 하나의 분기 만 있다는 것입니다.
주석이 달린 코드
->n,l{ #n=square size, l=list of words to search
c='' #empty grid
x=[p=6*n,1,-p,-1] #offsets for south, east, north, west. p is also number of characters per line
(m=3*p*n).times{|i| #m=total cells in grid. for each cell
c<<(5+i/n%6-i/n/p&6==6? #apppend to c (according to the formula)
65+rand(26): #either a random letter
i%p==p-1?10:46) #or a "whitespace character" (newline, ASCII 10 or period, ASCII 46)
}
q=m+3*n #offset for vertical wraparound = grid size plus half a row.
puts c #print grid
g=->w,i,d{ #search function. w=word to search for, i=start index in grid, d=direction
w==''? #if length zero, already found,
$r=1: #so set flag to 1. Else
c[i]<?A? #if grid cell is not a letter
g[w,(i+x[d])%q,d^1]: #recursively call from the cell in front, with the direction reflected in NW-SE axis
w[0]==c[i]&& #else if the letter on the grid cell matches the start of the word
4.times{|j| #for each direction (iterate 4 times, each time a different direction is "in front")
g[w[1..-1],(i+x[j])%q,j^1]} #recursively call from the cell in front. Chop first letter off word.
} #Direction parameter is XORed (reflected in NW-SE axis) in case ant hits whitespace and has to zigzag.
l.each{|w| #for each word in the list
$r=0 #set global variable $r to zero to act as a flag
m.times{|i|c[i]>?@&&g[w,i,0]} #call g from all cells in the grid that contain a letter
puts $r,w} #output flag value and word
}