입방체를 걸어 개미가 단어를 철자 할 수 있습니까?


10

양의 정수 n 과 단어 목록 이라는 두 가지 매개 변수를 취하는 함수를 작성하십시오 .

n x n x n 단위 의 큐브가 주어지면 각 표면 단위에 임의의 문자 (AZ)를 할당하십시오. (3x3x3 큐브의 경우 각면에 9 개의 표면 단위가 있습니다.)

그런 다음 개미가 표면을 따라 걷는 것이 가능한지 (얼굴을 교차 할 수있는 능력이 있는지) 제공된 단어 각각을 철자가 가능한지 결정하십시오. 단어를 철자하려면 글자가 위 / 아래 또는 왼쪽 / 오른쪽에 있어야하지만 반드시 같은 얼굴에 있어야하는 것은 아닙니다. [ 명확성을 위해 편집 : 개미는 경로를 반대로 바꾸고 글자를 두 번 이상 사용할 수 있습니다. 각 표면 단위는 하나의 문자로 계산되므로 개미가 반복되는 문자 (예 : "참조")로 단어의 철자를 쓰려면 개미가 인접한 3 개의 단위를 방문해야합니다.]

이 함수는 다음 두 가지를 출력해야합니다.

1) 토폴로지를 유추 할 수있는 방식으로 각 얼굴의 각 문자. 예를 들어 2x2x2 큐브의 경우 허용되는 출력은 다음과 같습니다.

   QW
   ER
TY OP UI
DF JK XC
   AS
   GH
   LZ
   VB

2) 개미가 입방체의 표면을 따라 걸어서 단어의 철자를 쓸 수 있는지 여부를 나타내는 부울과 함께 각 단어. 예를 들어 :

1 ask
0 practical
1 pure
0 full

보너스 챌린지 (재미만으로는 점수를 고려하지 않음) : n 은 큐브의 크기 만 나타내는 대신 n 도 모양의 차원을 나타냅니다. 따라서 n 이 2이면 2x2 제곱이됩니다. N 3은 3x3x3 큐브를 얻을 것이다 및 N 4는 4x4x4x4의 정팔 포체를 얻을 것이다.


1
큐브 출력 방법에 대한 추가 사양을 제공해야한다고 생각합니다. 예를 들어, 모든 문자를 한 줄에 배치 할 수 있습니까? 문자 배열을 항상 알고 있다면?
Doorknob

1
토폴로지를 유추 할 수있는 한 문자의 출력 방법에 대한 추가 제한을 적용하고 싶지 않습니다. 설명에서 내 여러 줄 예제는 설명이 아니라 예시 적이었습니다.
jawns317

3
개미가 방향을 바꿀 수있는 것처럼 보입니다. 명시 적으로 언급해야합니다. 180도 회전 할 수 있고 같은 문자를 두 번 연속 사용할 수 있습니까? 다시 말해, 큐브 를 찾 qwq거나 qq예제에서 찾을 수 있습니까?
Zgarb

3
또한 개미는 편지를 두 번 이상 사용할 수 있습니까?
lirtosiast

1
임의의 문자를 배포하는 규칙은 무엇입니까? 귀하의 예는 반복되는 문자를 보여주지 않지만 각 문자가 26 가지 가능성 중에서 독립적으로 선택되는 간단한 알고리즘을 사용하면 반복 횟수가 0 일 가능성이 거의 없습니다. 분명히 N> 2에서는 반복이 필요합니다. 누군가 큐브 전체에 무작위로 분포 된 두 개의 다른 문자로 큐브를 시도하는 경우이를 더 명확하게 지정해야합니다.
Level River St

답변:


3

루비, 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공유하는 CANC왼쪽에 배치 라운드.

....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
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.