루비, 272 바이트
g
가독성을 높이기 위해 중첩 함수의 양쪽에 불필요한 줄 바꿈 두 개가 코드에 추가됩니다 . 이들은 점수에서 제외됩니다. f=
익명 함수를 변수에 할당하는 문자 도 제외됩니다.
출력 형식은 Ruby의 기본 및 대신에 질문에 따라 0
또는 1
입니다 . 공백이 아닌 개행 문자는 부울과 단어를 구분하는 데 사용됩니다. 내 이해는 이것이 출력 요구 사항에 대한 수용 가능한 해석이지만 그렇지 않은 경우 바이트 수에 미치는 영향은 적을 것입니다.true
false
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
}