삼각 격자에 정렬


18

6 각형 그리드는 최근 2 차원 데이터에 대한 도전으로 상당히 인기가 있습니다. 그러나 똑같이 흥미로운 삼각 격자는 지금까지 크게 무시 된 것으로 보입니다. 오히려 간단한 도전으로 그것을 수정하고 싶습니다.

먼저 삼각형 격자를 어떻게 표현합니까? 다음 예제를 고려하십시오 (현재 올바른 다이어그램은 무시).

여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오

셀은 깔끔하게 규칙적인 격자에 떨어집니다 (일반 격자와의 차이점은 인접한 셀만 고려됩니다).

1234567
89abcde
fghijkl
mnopqrs

이제 오른쪽 다이어그램에서 볼 수 있듯이 삼각형 격자에는 세 개의 주요 축이 있습니다 : 가로 및 두 개의 대각선.

ASCII 그리드에서 이들을 강조 :

AVAVAVA
VAabcAV
fVAiAVl
mnVAVrs

도전

삼각형 격자 (왼쪽 위 모서리가 위쪽을 가리키는 삼각형)를 나타내는 직사각형 문자열이 제공됩니다. 가있는 대부분의 셀은 다음 .과 같지만 정확히 두 개의 셀은 다음 #과 같습니다.

....#
.#...
.....

#개가 그리드의 세 축 중 하나를 따라 정렬 되는지 여부를 결정합니다 (즉, 위에 강조 표시된 세 방향 중 하나의 행에 있는지). 이 예에서 답은 "아니오"입니다.

STDIN (또는 가장 가까운 대안), 명령 행 인수 또는 함수 인수를 통해 입력을 받고 STDOUT (또는 가장 가까운 대안), 함수 리턴 값 또는 함수 (out) 매개 변수를 통해 결과를 출력하는 프로그램 또는 함수를 작성할 수 있습니다.

입력은 줄 바꿈 또는 기타 편리한 문자 또는 문자열 목록으로 구분 된 단일 문자열 일 수 있습니다. .및 대신에 두 개의 (일관된) 인쇄 가능한 ASCII 문자를 사용할 수 있습니다 #.

강조 표시된 셀이 정렬되면 출력이 값 이어야 하고 그렇지 않으면 거짓이어야 합니다.

표준 규칙이 적용됩니다.

테스트 사례

Truthy 그리드 :

.#..#.

#
#

...........
...#.......
...........
...........
...........
.......#...
...........

...........
.......#...
...........
...........
...........
...#.......
...........

.#.........
...........
...........
...........
...........
.......#...
...........

...........
...#.......
...........
...........
...........
...........
.......#...

.........#.
...........
...........
...........
...........
...#.......
...........

...........
.......#...
...........
...........
...........
...........
...#.......

...........
.#.....#...
...........
...........
...........

거짓 그리드 :

#.....
.....#

.....#
#.....

...#.......
...........
...........
...........
...........
.......#...
...........

...........
...#.......
...........
...........
...........
...........
.........#.

.......#...
...........
...........
...........
...........
...#.......
...........

...........
.......#...
...........
...........
...........
...........
.#.........

답변:


3

달팽이 , 40 39 바이트

\#{z|=(ul.ul.`,l~a~)(l.a3|.a|d.ea5}.,\#
\ #, 일치하는 '#'
{
  z | ,, 팔각형 방향으로 회전하거나} 전에 다른 모든 작업을 수행하십시오.
  = (,,이 어설 션이 성공하면 시작 셀은 "상향 삼각형"입니다.
    ul.ul.`, ,, 하나의 셀을 몇 번이나 두 번이나 위로 이동하십시오.
              ,, 이것은 ul.`2 또는 ul.`2 +로 1 바이트 더 짧아야 했습니까? 그러나
              ``의 파싱은 버그가 있습니다.
    l ~ a ~, 우리가 왼쪽에서 북동쪽으로 범위를 벗어남으로써 왼쪽 상단 셀에 있는지 확인하십시오.
  )
  (l.a3 |, 왼쪽으로 한 번 이동 한 다음 방향을 북서쪽으로 설정하십시오. 또는
    .a | ,, 오른쪽 (초기 방향)으로 한 번 이동 한 다음 방향을 북동쪽으로 설정하십시오. 또는
    d.ea5, 한 번 아래로 이동 한 다음 방향을 북서쪽 또는 북동쪽으로 설정
}
.,, 임의의 수의 문자와 일치 (현재 방향으로 이동)
\ #, 일치하는 '#'

2

CJam, 47 바이트

글쎄, 이제 더 짧은 솔루션이 있으므로 더 이상 내 자신을 공유하는 것이 기분이 좋지 않습니다. :) (주로 2D 패턴 일치 언어가없는 경우에도 이것이 어렵지 않음을 보여줍니다 ...)

qN%:eeee::f+:~{S&},2f<:P0f=P::+Xf|P::-Xf|]::=:|

이것은 대신 공간을 사용 #하고 실제로 다른 것을 사용합니다 ..

모든 테스트 사례를 온라인으로 실행하십시오.

나는 복제를 정말로 싫어 P::+Xf|P::-Xf|하지만 지금까지 나는 그것을 없애기 위해 아무것도 만들지 않았다.

설명

스스로 해결책을 찾으려면 계속 읽으십시오.

먼저, 지루한 부분 : 입력 그리드에서 두 공간의 두 좌표 쌍을 얻는 것 :

qN%   e# Read input and split into lines.
:ee   e# Enumerate the characters in each line. I.e. turn each character 'x into a pair
      e# [N 'x] where N is its horizontal 0-based index.
ee    e# Enumerate the lines themselves, turning each line [...] into [M [...]] where M
      e# is its vertical 0-based index.
::f+  e# This distributes the vertical index over the individual lines, by prepending it
      e# to each pair in that line. So now we've got a 2-D array, where each character 'x
      e# has been turned into [M N 'x].
:~    e# Flatten the outermost dimension, so that we have a flat list of characters with
      e# their coordinates.
{S&}, e# Filter only those lists that contain a space.
2f<   e# Truncate the two results to only their first two elements.
:P    e# Store the result in P.

이제 흥미로운 부분은 좌표가 정렬되어 있는지 여부를 확인하는 방법입니다. 내 코드는 세 축을 모두 별도로 계산합니다.

  • 가로축은 사소합니다. 수직 좌표가 일치하는지 확인하십시오.
  • 북동 대각선을 보자. ASCII 그리드에는 각 트라이 그리드 대각선에 속하는 두 개의 대각 대각선이 항상 있습니다.

    ....AV..
    ...AV...
    ..AV....
    

    xy좌표를 합산하여 현재 대각 대각선을 식별 할 수 있습니다 .

    01234567
    12345678
    23456789
    

    우리는 싶어 그래서 01뿐만 아니라, 같은 대각선에 속 2하고 3,과 45등등. 즉, 반 대각선 색인을 가지면 다음 홀수로 올림하려고합니다. 다시 말해, 우리는 비트 OR을 사용 1합니다. (또한 비트 단위 AND를 사용하여 다음 짝수로 반올림 할 수 -2있지만 코드가 더 비쌉니다.)

  • 이제 남동쪽 대각선 :

    .VA.....
    ..VA....
    ...VA...
    

    대각선에게 인덱스를 제공하기 위해, 우리는 빼기x으로부터 y좌표 (문자로 나타내는 음수) :

    0abcdefg
    10abcdef
    210abcde
    

    이 경우, 우리는 싶어 0하고 1뿐만 아니라, 같은 대각선에 속 -1하고 -2, 나 2하고 3. 다시 한 번 다음 홀수로 올림하고 싶습니다.

그 코드는 다음과 같습니다.

0f=  e# The coordinates are still on the stack. Replace each with its vertical coordinate
     e# to check for the horizontal axis.
P    e# Push the coordinates again.
::+  e# Sum each pair to get an anti-diagonal index.
Xf|  e# OR each index with 1 to round up to the next odd number.
P    e# Push the coordinates again.
::-  e# In each pair, subtract the horizontal coordinate from the vertical, to
     e# get a diagonal index.
Xf|  e# OR each index with 1.
]    e# Wrap all three index pairs in an array.
::=  e# Check equality for each pair.
:|   e# Fold bitwise OR over the results to check if at least one pair of indices
     e# was equal.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.