점을 따라


22

도전

문자의 직사각형 그리드가 주어짐

에이 비 씨 디이
FGHIJ
KLMNO
PQRST

점과 공간이 같은 격자

. . .
  . . .
  . .  
  . . .  

왼쪽 상단에서 시작하여 그리드를 통해 점을 따라 생성 된 문자열을 출력합니다. 이 예는ABGLQRSNIJE

노트

  • 입력 그리드를 여러 줄 문자열 대신 2D 배열 또는 언어에서 가장 가까운 대안으로 사용할 수 있습니다.
  • 공백 대신 언어의 NULL 값을 사용할 수 있습니다. 그러나 경로를 표시하려면 점을 사용해야합니다.
  • 공백이있는 동일한 선의 점을 분리 할 필요는 없습니다. 가독성을 위해 방금 추가했습니다.
  • 가능한 가장 작은 그리드의 크기는 1x1입니다.
  • 시작점과 끝점에는 이웃이 하나뿐입니다. 그들 사이의 점은 항상 정확히 두 개의 수직 또는 수평 이웃을 갖습니다. 이렇게하면 경로가 확실하게 보장됩니다.
  • 경로는 대각선으로 가지 않습니다.
  • 그리드의 문자 [a-z]는 가장 편리한 범위의 모든 대문자 또는 소문자 입니다.
  • 경로는 항상 왼쪽 상단에서 시작됩니다.

규칙

  • 기능 또는 전체 프로그램이 허용됩니다.
  • 입 / 출력의 기본 규칙 .
  • 표준 허점이 적용됩니다.
  • 이것은 이므로 바이트 수가 가장 적습니다. Tiebreaker는 이전에 제출되었습니다.

테스트 사례

그리드 # 1

ABCABCW
DEFGHUQ
XLUSDQZ
아 수키
우 코아이
아이오 아이 우프
. .          
  . . .      
      .      
. . . .      
.            
.            
=> ABEFGSKUSAWA
. . . . . . .
            .
. . . .
. . . .
. .
. . . . . . .
=> ABCABCWQZIMPUOIAIAWAXLUUK

그리드 # 2

첫 번째와 두 번째 예의 두 번째 줄에있는 트리플 공간에 주목하십시오.

AB
CD
.  
   
=> A
. .
   
=> AB
.  
. .
=> ACD

그리드 # 3

에이
.
=> A

행복한 코딩!


Grid # 1의 두 번째 테스트 사례가 올바른지 확인 하시겠습니까? 나는 출력이 있어야한다고 생각한다 ABCABCUQXIUOIAIAWAXLUUK.
vaultah

@vaultah Thaks는 힌트로 수정했습니다. 그리드의 점이 왼쪽에서 한 열 더 멀리 떨어졌습니다.
Denker

여기에서와 같이 다른 모든 문자에 공백을 입력해야합니까, 아니면 문자와 줄 바꿈이 될 수 있습니까 (도트 매트릭스에 공백이 없어야합니까)?
msh210

@ msh210 도전에서 언급했듯이 공백 대신 어떤 종류의 NULL 값을 사용할 수 있습니다. 물론 입력을 2D 배열로 가져옵니다.
덴커

전혀 null 바이트가 아님을 의미했습니다.
msh210

답변:


4

APL, 63 바이트

{⍺[(⊂1 1){×≢⍵:⍺,(V/⍵)∇⍵/⍨~V←(+=⌊/)+/¨2*⍨⍺-⍵⋄⍺}1↓(,⍵='.')/,⍳⍴⍵]}

이것은 문자 행렬을 왼쪽 인수로, 점 그리드를 오른쪽 인수로 두 개의 문자 행렬 (행렬이어야 함)을 취하는 함수입니다. 도트 매트릭스는 문자 매트릭스보다 작을 수 있습니다.

설명:

  • (,⍵='.')/,⍳⍴⍵: 점의 위치를 ​​행 열 순서로 가져옵니다.
  • 1↓: 첫 번째 것을 삭제하십시오 (에있는 것으로 알려져 있음 1 1)
  • (⊂1 1){... }:에서 시작 1 1하여 경로를 따르는 다음 함수를 실행하십시오 (왼쪽 인수는 현재 위치이고 오른쪽 인수는 방문하지 않은 위치입니다). 매번 가장 가까운 방문하지 않은 점을 선택하여 작동합니다. (질문의 가정이 유효하면 이것이 맞습니다.)
    • ×≢⍵:: 아직 방문하지 않은 위치가있는 경우 :
      • +/¨2*⍨⍺-⍵: 각 위치와 현재 위치 사이의 맨해튼 거리 찾기
      • V←(+=⌊/): 각 위치에 대해 거리가 가장 작은 거리와 같은지 확인한 후에 저장하십시오 V.
      • ⍵/⍨~: 그렇지 않은 모든 위치를 선택하십시오. 다음은 방문 할 필드입니다.
      • (V/⍵): 사례 있는 위치를 찾으면 다음 필드가됩니다.
      • :이 새로운 인수로 함수를 다시 실행하십시오.
      • ⍺,: 결과는 현재 위치이며, 나머지 목록에 대해이 작업을 수행 한 결과
    • ⋄⍺: 그렇지 않으면, 현재 위치를 반환하고 중지하십시오 (마지막 위치입니다)
  • ⍺[... ]: 각 위치에 대해 문자 그리드에서 해당 요소를 선택하십시오.

테스트 사례 :

      f←{⍺[(⊂1 1){×≢⍵:⍺,(V/⍵)∇⍵/⍨~V←(+=⌊/)+/¨2*⍨⍺-⍵⋄⍺}1↓(,⍵='.')/,⍳⍴⍵]}
      ⍝ example
      g0  ← 4 5⍴'ABCDEFGHIJKLMNOPQRST'
      d0  ← 4 5⍴'..  . . .. . .  ... '
      ⍝ test case 1
      g1  ← 6 7⍴'ABCACBWDEFGHUQXLUSDQZASUKWXIWUKOAIMAIAIOUP'
      d1a ← 6 7⍴'..      ...      .   ....   .      .      '
      d1b ← 6 7⍴'.......      ....   .. ..  ..     ........'
      ⍝ test case 2
      g2  ← 2 2⍴'ABCD'
      d2a ← 1 1⍴'.'
      d2b ← 1 2⍴'..'
      d2c ← 2 2⍴'. ..'
      ⍝ test case 3
      g3  ← 1 1⍴'A'
      d3  ← 1 1⍴'.'

      g0 f d0
ABGLQRSNIJE
      (⊂g1) f¨ d1a d1b
┌────────────┬─────────────────────────┐
│ABEFGSKUSAWA│ABCACBWQZIMPUOIAIAWAXLUUK│
└────────────┴─────────────────────────┘
      (⊂g2) f¨ d2a d2b d2c
┌─┬──┬───┐
│A│AB│ACD│
└─┴──┴───┘
      g3 f d3
A

3

자바 스크립트 (ES6), 122 바이트

c=>g=>c[l=~c.search`
`,i=p=0]+[...g].map(_=>i|!p?c[i=(d=n=>g[i-n-p?i-n:c]>" "&&(p=i)-n)(1)||d(-1)||d(l)||d(-l)]:"").join``

설명

그리드를 여러 줄로 만듭니다.

괜찮은 시도처럼 느껴지지만 골프를 타는 동안 시간이 부족하여 아마 향상 될 수 있습니다.

var solution =

c=>g=>
  c[                            // add the starting letter to the output
    l=~c.search`
`,                              // l = line length
    i=p=0                       // i = current index, p = previous index
  ]+
  [...g].map(_=>                // loop
    i|!p?                       // if we have not finished yet
      c[i=                      // find the next index and return it's letter
        (d=n=>                  // d = function to check for a dot at offset n
          g[
            i-n-p?i-n           // if i - n != p, get the character at index i - n
            :c                  // else get index "c" (will return undefined, not a dot)
          ]>" "                 // if the character is a dot
          &&(p=i)-n             // set p to i and return i - n
        )
        (1)||d(-1)||d(l)||d(-l) // search for the next adjacent dot
      ]
    :""                         // if we have finished, return no letter
  )
  .join``                       // output all the returned letters
<textarea id="Characters" rows="6" cols="30">ABCABCW
DEFGHUQ
XLUSDQZ
ASUKWXI
WUKOAIM
AIAIOUP</textarea>
<textarea id="Grid" rows="6" cols="30">.......
      .
...   .
. ..  .
.     .
.......</textarea><br />
<button onclick="result.textContent=solution(Characters.value)(Grid.value)">Go</button>
<pre id="result"></pre>


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