모호한 위치


11

4 개의 거리 센서가있는 작은 로봇이 있습니다. 방의 레이아웃을 알고 있지만 그리드 방향에 고정 할 수있는 것 외에는 방향 감각이 없습니다. 로봇이 판독 값을 기반으로하는 위치를 찾을 수 있지만 센서가 제한되어있어 모호 할 수 있습니다.

도전 설명

당신은 당신과 벽 사이의 세포의 수를 제공하는 방 배치와 4 개의 시계 방향 거리 판독 값이 주어질 것입니다. 방 중앙에 벽이있을 수 있으며 그리드의 가장자리도 벽입니다. 로봇은 벽 위에 놓을 수 없습니다.

당신의 목표는 주어진 판독 값을 줄 로봇이있을 수있는 방 안의 모든 위치를 나열하는 것입니다. 로봇의 방향 감각이 없어야합니다 (그리드에서 90도 각도로 고정되어 있지 않아야합니다. 즉, 로봇은 대각선이나 다른 기울기 각도로 방향이 지정되지 않습니다). 따라서 [1, 2, 3, 예를 들어, 4]는 [3, 4, 1, 2]를 읽는 것과 동일합니다.

이 예제의 경우 셀 좌표는 왼쪽 상단 셀에서 0- 인덱스 (x, y) 쌍으로 제공됩니다. 판독 값은 시계 방향으로 대괄호로 표시됩니다. 레이아웃은 벽 및 기타 문자 (일반적으로 점)에 파운드 기호를 사용하여 빈 셀을 나타냅니다.

사례 1

. . . .
. . . .
. . # .
. . . .
  • [1, 0, 2, 3] ==> (1, 0), (3, 1)
  • [0, 0, 3, 3] ==> (0, 0), (3, 0), (0, 3), (3, 3)
  • [2, 1, 1, 0] ==> (0, 2), (2, 1)
  • [1, 1, 2, 2] ==> (1, 1)

사례 2

# a . # a .
a # . . # a
. . # . . #
# . . # . .
a # . . # a
. a # . a #
  • [0, 0, 1, 1] ==> 점인 그리드의 모든 위치
  • [1, 0, 0, 0] ==> 그리드의 모든 a

사례 3

.
  • [0, 0, 0, 0] ==> (0, 0)

사례 4

. # #
. . .
  • [1, 2, 0, 0] ==> (0, 1)
  • [0, 1, 2, 0] ==> (0, 1)
  • [0, 0, 1, 0] ==> (0, 0)
  • [1, 0, 1, 0] ==> (1, 1)
  • [0, 1, 0, 1] ==> (1, 1)

사례 5

. # . .
. . . .
. . # .
. . . .
  • [2, 1, 1, 0] ==> (0, 2), (2, 1)
  • [0, 2, 2, 1] ==> (1, 1)
  • [1, 0, 2, 2] ==> (1, 1)
  • [0, 3, 0, 0] ==> (0, 0)
  • [1, 0, 1, 1] ==> (1, 2)

다른 규칙

  • 입력은 편리한 형식 일 수 있습니다. 입력은 벽과 공간의 격자이며 시계 방향으로 4 개의 거리 목록입니다.
  • 출력은 판독을 만족시키는 모든 셀의리스트이거나 어느 셀이 판독을 만족 하는지를 나타내는 그리드의 수정 된 버전 일 수있다. 합리적이고 일관된 출력의 정확한 형식은 중요하지 않습니다. 유효한 출력 형식 은 다음과 같습니다 .
    • 각 셀 좌표에 대한 선을 정렬 된 쌍으로 인쇄
    • 인쇄 그리드와 ., #그리고 !각각의 공간, 벽 및 가능한 위치에 대한있다.
    • 정렬 된 쌍의 목록 반환
    • 인덱스리스트 반환
    • 공간, 벽 및 가능한 위치에 대해 서로 다른 값을 사용하여 목록 목록 반환
    • 판독 값이 발생하는 셀을 나타 내기 위해 1을 사용하여 0과 1의 행렬을 반환 / 인쇄합니다. (벽을 포함 할 필요는 없습니다)
    • 다시 한 번,이 목록은 전체가 아니므로 다른 표현은 일관되고 가능한 모든 유효한 위치를 그리드 또는 목록에 표시하는 한 유효합니다. 확실하지 않은 경우 의견을 남겨 주시면 기꺼이 설명해 드리겠습니다.
  • 판독 값이 그리드의 하나 이상의 위치에 해당한다고 가정 할 수 있습니다.
  • 입력 격자의 크기가 1x1 이상이고 빈 공간이 하나 이상 있다고 가정 할 수 있습니다.
  • 입력 그리드가 각 차원에서 256 셀보다 크지 않다고 가정 할 수 있습니다.
  • 입력 그리드가 항상 완벽한 직사각형이고 들쭉날쭉하지 않다고 가정 할 수 있습니다.
  • 프로그램이 유효하지 않은 입력에 대해 제정신 출력을 제공하는 경우 벌금이나 보너스가 없습니다.
  • 이것은 코드 골프이므로 가장 짧은 코드가 승리합니다.

에 대한 테스트 사례가 Case 5옳지 않은 것 같습니다. 내가 얻을 (0,2),(2,1), (1,3), (1,3),와 nothing.
TFeld

@TFeld 감사합니다. 결정된.
Beefster

1
@Arnauld는 나에게 합리적인 것 같습니다. 이것을 이미 완전하지 않은 목록에 추가하겠습니다.
Beefster

답변:


3

자바 스크립트 (ES6)  130 128 126  125 바이트

(미디엄)()미디엄01

1

m=>l=>m.map((r,y)=>r.map((v,x)=>v&!!([...'3210321'].map(d=>(g=X=>(m[Y+=~-d%2]||0)[X+=(d-2)%2]?1+g(X):0)(x,Y=y))+g).match(l)))

온라인으로 사용해보십시오! (가독성을 위해 후 처리 출력)

댓글

m => l =>                         // m[] = layout matrix; l[] = list of distances
  m.map((r, y) =>                 // for each row r[] at position y in m[]:
    r.map((v, x) =>               //   for each cell v at position x in r[];
      v &&                        //     yield 0 if v = 0
      !!(                         //     otherwise, test whether we can find l[] within a
        [...'3210321']            //     list containing twice the results of the sensors
        .map(d =>                 //       for each direction d:
          (g = X => (             //         g = recursive function taking X
              m[Y += ~-d % 2]     //         add dy[d] to Y
              || 0                //         use a dummy object if we're out of the board
            )[X += (d - 2) % 2] ? //         add dx[d] to X; if (m[Y] || 0)[X] is equal to 1:
              1 +                 //           add 1 to the final result
              g(X)                //           and do a recursive call
            :                     //         else:
              0                   //           yield 0 and stop recursion
          )(x, Y = y)             //         initial call to g with X = x and Y = y
        )                         //       end of map() over directions
        + g                       //       coerce the result to a comma-separated string,
                                  //       followed by harmless garbage
      ).match(l)                  //     test whether l[] can be found in this string
                                  //     (l[] is implicitly coerced to a string as well)
    )                             //   end of map() over r[]
  )                               // end of map() over m[]


1

, 42 바이트

PθFθ¿⁼¶ι⸿¿№E⁴E⁴⊖⌕⁺⪫KD⊕⌈η✳§⟦→↓←↑⟧⁺κμω#¦#η!ι

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 숯은 어떤 이유로 출력에 약간의 패딩을 추가하는 것 같습니다. 나는 그것이 숯의 버그라고 가정합니다. 설명:

Pθ

커서를 움직이지 않고지도를 인쇄하십시오.

Fθ

맵의 각 문자를 반복합니다.

¿⁼¶ι⸿

줄 바꿈 인 경우 커서를 다음 줄의 시작 부분으로 이동하십시오.

⊖⌕⁺⪫KD⊕⌈η✳§⟦→↓←↑⟧⁺κμω#¦#

방향으로 벽까지의 거리를 찾으십시오 k+m.

¿№E⁴E⁴...η!ι

네 개의 시작 방향을 모두 반복하고 네 k개의 시계 방향을 모두 들여다 m보고 결과에 두 번째 입력이 포함되어 있으면 !현재 문자를 인쇄하십시오.

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