이 트라이앵글 트라이얼


17

길이가 양의 삼각 숫자 (1, 3, 6, 10, 15 ...) 인 문자열은 공백과 줄 바꾸기를 추가하고 동일한 읽기 순서로 유지하여 "등변 텍스트 삼각형"으로 배열 할 수 있습니다.

예를 들어, 길이 10 문자열 ABCDEFGHIJ은 다음과 같습니다.

   A
  B C
 D E F
G H I J

이러한 문자열을받는 프로그램이나 함수를 작성하십시오 . 단, 문자 0및 만 포함됩니다 1. 입력이 유효하다고 가정 할 수 있습니다.

결과 "등변 텍스트 삼각형"의 경우, 표시되는 대칭 유형을 나타내는 네 개의 숫자 중 하나를 출력 (인쇄 또는 리턴)하십시오.

  • 2삼각형에 양방향 대칭이있는 경우 출력 합니다. 즉, 한쪽 모서리에서 반대쪽의 중간 점까지 대칭 선이 있습니다.

    예 :

     0
    1 1
    
     1
    0 1
    
      0
     0 1
    0 1 0
    
       1
      1 1
     1 0 1 
    0 1 1 1
    
  • 3삼각형에 회전 대칭이있는 경우 출력 합니다. 즉, 시각적 변화없이 120 ° 회전 할 수 있습니다.

    예 :

       0
      1 0
     0 1 1
    0 1 0 0
    
       0
      0 1
     1 0 0
    0 0 1 0
    
        1
       0 1
      1 1 1
     1 1 1 0
    1 0 1 1 1
    
         1
        0 1
       0 0 1
      1 0 0 0
     1 0 0 0 0
    1 0 0 1 1 1
    
  • 6삼각형이 양방향 및 회전 대칭을 모두 갖는 경우 출력 됩니다 . 즉, 그것은 모두를 출력하기위한 조건과 일치 23.

    예 :

    0
    
    1
    
     0
    0 0
    
      1
     0 0
    1 0 1
    
       0
      0 0
     0 1 0
    0 0 0 0
    
  • 1삼각형에 양방향 또는 회전 대칭이없는 경우 출력 됩니다.

    예 :

      1
     1 0
    0 0 0
    
      0
     0 1
    1 0 1
    
       1
      1 0
     1 1 1 
    1 1 1 1
    
        1
       1 1
      1 1 1 
     0 0 0 1
    1 1 1 1 1
    

바이트 단위의 가장 짧은 코드가 이깁니다. Tiebreaker가 이전 답변입니다.

선택적인 후행 줄 바꿈 외에 입력 문자열에는 공백 / 줄 바꿈 또는 구조가 없을 수 있습니다. 이는 일반 0및 이어야합니다 1.

원하는 경우 및 대신 두 개의 인쇄 가능한 ASCII 문자를 사용할 수 있습니다 .01

테스트 사례

예제에서 직접 가져 왔습니다.

011 -> 2
101 -> 2
001010 -> 2
1111010111 -> 2
0100110100 -> 3
0011000010 -> 3
101111111010111 -> 3
101001100010000100111 -> 3
0 -> 6
1 -> 6
000 -> 6
100101 -> 6
0000100000 -> 6
110000 -> 1
001101 -> 1
1101111111 -> 1
111111000111111 -> 1

입력을 120 °로 "회전"하면 물론 동일한 출력이됩니다.


그 제목은 단지 고통 ......
Rɪᴋᴇʀ

9
@ EᴀsᴛᴇʀʟʏIʀᴋ 그냥 트라이 무시합니다.
Calvin 's Hobbies

@HelkaHomba 왜 ... 왜 ...
clismique

답변:


9

CJam, 37 29 28 27 바이트

3 바이트를 절약 한 Sp3000에 감사합니다.

q{T):T/(\s}h]{z_Wf%_}3*])e=

테스트 스위트.

이것은 이 도전 에서 일부 삼각형 회전 트릭을 재사용합니다 .

이것은 동일한 바이트 수에서도 작동합니다.

q{T):T/(\s}h]3{;z_Wf%_}%)e=

설명

먼저, 위에 링크 된 삼각형 포스트를 간단히 살펴보십시오. 우리는 삼각형을 2D (비정형) 목록으로 나타냅니다.

[[0 1 1]
 [0 0]
 [0]]

삼각형의 대칭 그룹에는 6 개의 요소가 있습니다. 삼각형을 회전하면 길이 3의주기가 있고 어떤 축을 따라 삼각형을 대칭 시키면 2의주기가 있습니다. 편리하게는, 회전은 2 개의 상이한 반사에 대응한다. 우리는 이것을하기 위해 다음의 반사를 사용할 것입니다 :

  1. 목록을 전치한다는 것은 기본 대각선을 따라 목록을 반영한다는 것을 의미하므로 다음과 같이 얻을 수 있습니다.

    [[0 0 0]
     [1 0]
     [1]]
    
  2. 각 행을 뒤집 으면 위쪽 두 모서리가 바뀌는 반사가 나타납니다. 우리가 얻는 조옮김의 결과에 이것을 적용 :

    [[0 0 0]
     [0 1]
     [1]]
    

이 두 가지 변환을 사용하고 중간 결과를 유지하면 입력의 6 가지 대칭을 모두 생성 할 수 있습니다.

추가 참고 사항은 다음과 같은 목록에서 조옮김 동작입니다.

[[0]
 [1 0]
 [1 0 0]
 []]

그것이 입력을 나누고 나면 끝날 것이기 때문입니다. 편리하게 조옮김 후 CJam은 모든 선을 왼쪽으로 플러시합니다. 이것은 실제로 외부를 제거 []하고 위의 두 가지 변환에 유용한 형태로 만듭니다 (모두 반사 대칭을 넘어 삼각형의 실제 레이아웃을 변경하지 않음).

[[0 1 1]
 [0 0]
 [0]]

그 길을 벗어난 코드는 다음과 같습니다.

q       e# Read input.
{       e# While the input string isn't empty yet...
  T):T  e#   Increment T (initially 0) and store it back in T.
  /     e#   Split input into chunks of that size.
  (     e#   Pull off the first chunk.
  \s    e#   Swap with remaining chunks and join them back together
        e#   into a single string.
}h
]       e# The stack now has chunks of increasing length and an empty string
        e# as I mentioned above. Wrap all of that in an array.
{       e# Execute this block 3 times...
  z_    e#   Transpose and duplicate. Remember that on the first iteration
        e#   this gets us a triangle of the desired form and on subsequent
        e#   iterations it adds one additional symmetry to the stack.
  Wf%_  e#   Reverse each row and duplicate.
}3*
        e# The stack now has all 6 symmetries as well as a copy of the
        e# last symmetry.
]       e# Wrap all of them in a list.
)       e# Pull off the copy of the last symmetry.
e=      e# Count how often it appears in the list of symmetries.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.