이것은 어떤 테트로 미노입니까?


54

부호없는 16 비트 정수 N이 주어지면, 4x4 행렬 내에 매핑 된 이진 표현이 tetromino shape 와 일치 하는지, 그렇다면 어떤 모양인지 확인해야합니다.

매트릭스

N의 각 비트 는 가장 중요한 것부터 시작하여 왼쪽에서 오른쪽으로 그리고 위에서 아래로 4x4 매트릭스 안에 매핑됩니다.

예 :

N = 17600
binary representation: 0100010011000000
matrix: [ [ 0, 1, 0, 0 ],
          [ 0, 1, 0, 0 ],
          [ 1, 1, 0, 0 ],
          [ 0, 0, 0, 0 ] ]

테트로 미노 모양

기본 도형

문자 O , I , S , Z , L , J 및 T로 식별되는 7 개의 테트로 미노 모양이 있습니다 .

테트로 미노

회전 및 번역

4x4 매트릭스 내에서 형태가 변환 및 / 또는 회전되는 경우에도 동일한 테트로 미노의 유효한 변형으로 간주됩니다. 예를 들어 17600, 1136, 2272 및 1604는 모두 J 테트로 미노 로 식별되어야합니다 .

유효한 J 예제

포장하지 마십시오!

그러나 도형이 줄 바꿈되거나 매트릭스의 경계를 넘어 이동할 수는 없습니다. 예를 들어, 어느 쪽도 568 도 688로 확인되어서는 안 J의 (혼자 다른 모양을 보자) tetrominoes :

잘못된 J 예제

설명 및 규칙

  • 2D 배열, 플랫 배열 또는 구분 된 문자열과 같은 적절한 형식으로 정수 또는 16 진수로 16 진수를 입력 할 수 있습니다.
  • 입력은 부호없는 16 비트 정수 (또는 배열 또는 문자열과 동등한 표현)임을 보증합니다.
  • 유효한 도형이 식별되면 소문자 또는 대문자로 도형을 식별하는 문자를 인쇄하거나 반환해야합니다 .
  • 모양이 식별되지 않으면 테트로 미노 문자와 일치하지 않는 값을 인쇄하거나 반환해야합니다. 아무것도 반환하지 않을 수도 있습니다.
  • 유효한 것으로 간주 되려면 매트릭스에 추가 세포가없는 정확한 테트로 미노 모양이 포함되어야합니다 (테스트 사례의 1911 및 34953 참조).
  • 이것은 이므로 바이트 단위의 최단 답변이 이깁니다!

테스트 사례

이 링크 를 따라 테스트 사례를 2D 배열로 가져올 수 있습니다 .

0      -> false
50     -> false
51     -> 'O'
1911   -> false
15     -> 'I'
34952  -> 'I'
34953  -> false
1122   -> 'S'
3168   -> 'Z'
785    -> 'L'
1136   -> 'J'
568    -> false
688    -> false
35968  -> 'T'
19520  -> 'T'

흥미롭게도, 나는 func1 . func2 . func3JS에서 함수 체인을 사용하는 기술을 만드는 데 방해가되기 전에 며칠 전에 매우 비슷한 문제에 대해 작업하고있었습니다 . P
— ETHproductions

네 개의 행과 결합으로 내가 입력을 할 수 0즉, 1111011110111101111위해 65535?
— ETHproductions

@ETHproductions 괜찮아 보인다. 약간 편안한 입력 형식으로 도전 과제를 편집했습니다.
— Arnauld

3
I : 15,240,3840,4369,8738,17476,34952,61440J : 71,113,142,226,275,550,802,1100,1136,1604,1808,2272,3208,3616,4400,8800,12832,17600,18176,25664,28928,36352,51328,57856L : 23,46,116,232,368,547,736,785,1094,1570,1856,2188,3140,3712,5888,8752,11776,12560,17504,25120,29696,35008,50240,59392O : 51,102,204,816,1632,3264,13056,26112,52224S : 54,108,561,864,1122,1728,2244,8976,13824,17952,27648,35904T : 39,78,114,228,305,562,610,624,1124,1220,1248,1824,2248,3648,4880,8992,9760,9984,17984,19520,19968,29184,35968,58368Z는 :99,198,306,612,1224,1584,3168,4896,9792,19584,25344,50688
— 토스트 엔지니어

^ 편리한 입력 / 출력 형식이 있었기 때문에 Lynn의 Python 3 답변을 사용하여 생성 되었습니다.
— 엔지니어 토스트

답변:


6

젤리 ,  54 43 42  41 바이트

Outgolfer Erik 덕분에 -1 바이트 (반복 된 체인 내부에서 조옮김 이동)

T€FṀ⁸ṙ€Zµ⁺F
ZU$3СǀḄṂ“çc3Ð6'G‘i’ị“¥Çıƭ⁵»

정수 ( 1s와 0s) 의 2D 배열을 취하여 oiszljt각각의 테트로 미노에 대해 소문자를 반환 하거나 w유효하지 않은 경우 모나드 링크 .

온라인으로 사용해보십시오! 또는 테스트 스위트를 참조하십시오.

또한 출력과 함께 정확히 4 비트 세트가있는 1820 개의 가능한 2D 이진 배열을 모두 나열한 이 프로그램 을 참조하십시오 .

어떻게?

먼저 입력의 네 회전을 모두 수행합니다. 그런 다음 각 세트의 비트를 오른쪽에서 최대한 아래쪽으로 이동 한 다음 결과를 이진수로 변환합니다. 그런 다음 각 유효한 tetromino의 최소 표현 목록에서 최소 결과를 찾은 다음 감소 된 결과를 사용하여 두 개의 연결된 사전 단어 zoist+ 로 색인화하여 일치하는 항목이 없을 때 jowl산출 w합니다.

T€FṀ⁸ṙ€Zµ⁺F - Link 1, shift set bits right & then down : list of lists of bits          
        µ⁺  - perform the following twice, 1st with x=input, then with x=result of that):
T€          -   truthy indexes of €ach
  F         -   flatten into a single list
   Ṁ        -   maximum (the index of the right-most bit)
    ⁸       -   chain's left argument, x
     ṙ€     -   rotate €ach left by that amount
       Z    -   transpose the result
          F - flatten (avoids an € in the main link moving this into here)

ZU$3СǀḄṂ“çc3Ð6'G‘i’ị“¥Çıƭ⁵» - Main link: list of lists of bits (the integers 0 or 1)
   3С                        - repeat this 3 times collecting the 4 results:
  $                           -   last two links as a monad:
Z                             -     transpose
 U                            -     upend (reverse each) -- net effect rotate 90° CW
      Ç€                      - call the last link as a monad for €ach
        Ḅ                     - convert from binary (vectorises)
         Ṃ                    - minimum (of the four results)
          “çc3Ð6'G‘           - code-page indexes = [23,99,51,15,54,39,71]
                              -   ...the minimal such results for l,z,o,i,s,t,j shapes
                   i          - 1-based index of minimum in there or 0 if not found
                    ’         - decrement
                      “¥Çıƭ⁵» - compressed words: "zoist"+"jowl" = "zoistjowl"
                     ị        - index into (1 indexed & modular, so -1 yields 'w',
                              -             0 yields 'l', 1 yields 'z', ...)

이전 방법 (54 바이트)

Fœr0Ḅ“çc3Ðñ'G‘i
;Z$Ḅ©f“¦µ½¿Æ‘ȯ®¬S>2ȧZU$3СǀṀ’ị“¥Çıƭ⁵»

정수 ( 1s와 0s) 의 2D 배열을 취하여 oiszljt각각의 테트로 미노에 대해 소문자를 반환 하거나 w유효하지 않은 경우 모나드 링크 .

온라인으로 사용해보십시오!

이것은 적어도 세 개의 빈 줄 (행 + 열)이 있는지 확인하고 특정 비트 패턴이 어떤 줄 (특히 숫자 5, 9, 10, 11 및 13)에 존재하지 않는지 확인합니다. 위양성. 그런 다음 4 개의 각 회전의 이진 숫자를 변환 한 다음 바닥 이동 (변환 전에 후행 0을 스트라이핑하여) 한 다음 감소 된 결과를 사용하여 숫자 목록에서 최소 결과를 찾아 두 개의 연결된 사전 단어로 색인화합니다. zoist+ jowl, w일치하는 항목이 없을 때 나타납니다.


그리고 하드 코딩보다 더 좋은 방법이 있다는 것을 알았습니다 ...
— Outgolfer Erik

btw 나는이 코드가 우연의 일치에 달려 있다고 생각한다 (왜냐하면 zoistjowl보통 문자열에 맞지 않기 때문이다 . : p)
— Erik the Outgolfer

"우연의 일치"는 무엇을 의미합니까? (사전 조회는 ...Ṁị“LZOISTJW어쨌든 1 바이트 만 절약 합니다)
— Jonathan Allan

흠 ... 그래 내가 BTW 난 당신이 내 훔친 생각 ...이 오래 지속되지 줄 알았 ZU$3СP :
— 에릭 Outgolfer

어제 이전 방법을 제출 한 후 동일한 방법을 시도했지만 조금 피곤하다고 생각합니다.
— Jonathan Allan

28

파이썬 3 , 124 바이트

def f(n):
 while n&4369<n/n:n>>=1
 while n&15<1:n>>=4
 return'TJLZSIO'["rēȣc63ıGtIJȱᄑ@'̢̑@@@@Ȳq".index(chr(n))%7]

온라인으로 사용해보십시오!

4 × 4 이진 행렬을 나타내는 정수 n이 필요 합니다. 테트로 미노를 찾지 못하면 발생합니다.

2 행은 1이 맨 오른쪽 열에 올 때까지 도형을 오른쪽으로 밉니다. (4369는 0001 0001 0001 0001이진수입니다.) 3 행은 1이 맨 아래 행에 올 때까지 모양을 낮 춥니 다. 예를 들면 다음과 같습니다.

    0 1 0 0        0 0 0 0
    1 1 1 0  into  0 0 0 0
    0 0 0 0        0 0 1 0
    0 0 0 0        0 1 1 1

그런 다음 n이 목록에서 의 색인을 찾습니다 .

 [114  275  547   99   54   15   51
  305   71  116  306  561 4369   64
   39  802  785   64   64   64   64
  562  113   23]
#   T    J    L    Z    S    I    O

등가 모듈러스 7의 각 열은 테트로 미노 모양에 해당합니다. 64 ( @)는 n이 코드에서 64가 될 수 없으므로 패딩 값으로 사용됩니다 .

NB. 대신 0에 컴퓨팅 에서 입력 에 대한 예외가 발생합니다 .n/n1


이진 문자열이 왜 작동합니까? 나는 코멘트를 참조 파이썬 3에서 그 문제가 있었다 codegolf.stackexchange.com/a/85201/53667을
— 칼 Napf

Python은 UTF-8을 소스 코드 및 텍스트 출력의 기본 인코딩으로 사용합니다. 그러나 PPM 파일은 UTF-8로 읽히지 않습니다 . 을 실행 print("ÿ")하면 작성된 바이트가 c3 bf 0a아닌 ff 0a이며 PPM 이미지가 가비지로 바뀝니다.
— Lynn

8

APL (Dyalog) , 95 94 93 89 87 바이트

Zacharý 에게 -2 감사합니다

⎕IO←0많은 시스템에서 기본값이 필요합니다 . 부울 행렬 (모든 모양!)을 인수로 사용합니다. 주어진 비트 수가 4가 아닌 경우 아무 것도 반환하지 않으며, 4 개의 지정된 비트가 테트로 미노를 형성하지 않으면 빈 줄을 반환합니다.

{4=+/,⍵:'OIZSJLT'/⍨∨/1∊¨(((2 2)4⍴¨1),(0 1⌽¨⊂K⌽2⊖J),(⍳3)⊖¨⊂J←1,⍪K←3↑1)∘.⍷⍵∘{⌽∘⍉⍣⍵⊢⍺}¨⍳4}

온라인으로 사용해보십시오!

입력의 네 회전을 모두 생성 한 다음 각 회전에서 각 테트로 미노를 찾습니다.

{... } 인수에 의해 표현되는 익명 함수를 ⍵:

 ,⍵ 논쟁을 풀다

 +/ 요약 해

 4= 4와 같습니까?

 : 그렇다면 (아무 것도 반환하지 마십시오) :

  ⍳4 처음 네 개의 오지 ( dicy); [0,1,2,3]

  ⍵∘{… }¨ 입력을 고정 왼쪽 인수로 사용하여 각각에 다음 기능을 적용하십시오.

   ⍺ 왼쪽 인수, 즉 입력

   ⊢⍺ 그 수율 (분리형 ⍵에서 ⍺)

   ⌽∘⍉⍣⍵ 거울과 트랜스 (즉 90 ° 회전) ⍵번

  (… )∘.⍷ 다음 목록과 회전의 외부 "제품"이지만 Find *를 사용합니다.

   3↑1 하나에서 세 개의 요소를 취하여 0으로 채 웁니다. [1,0,0]

   K← 그것을 그대로 저장 K

   ⍪ 테이블 (열 벡터로 만든다); [[1],[0],[0]]

   1, 하나를 추가; [[1,1],[1,0],[1,0]]("제이")

   J← 로 저장 J

   (… )⊖¨⊂ 다음 각 단계 수마다 전체 J를 수직으로 회전시킵니다.

    ⍳3 처음 세 개의 ntegers ;[0,1,2]

   우리는 [[[1,1],[1,0],[1,0]],[[1,0],[1,0],[1,1]],[[1,0],[1,1],[1,0]]]( "J", "L,"T ")

   (… ), 다음 목록을 추가하십시오.

    2⊖JJ두 단계를 세로로  회전 ; [[1,0],[1,1],[1,0]]("티")

    K⌽ 그 행을 각각 1, 0 및 0 단계 씩 회전하십시오. [[0,1],[1,1],[1,0]]("지")

    0 1⌽¨⊂ 전체 어레이를 수직 및 수직으로 회전합니다. [[[0,1],[1,1],[1,0]],[[1,0],[1,1],[0,1]]] ( "Z", "S")

    (… ), 다음 목록을 추가하십시오.

     (2 2)4⍴¨1 하나를 2 × 2 매트릭스 및 4- 요소리스트 각각으로 재구성하고; [[[1,1],[1,1]],[1,1,1,1]]( "O", "I")

  1∊¨ 각각에 대해 하나는 회원입니까?

  ∨/ 수평 OR 축소 (예 : 회전에 걸쳐, 각 모양에 대해 하나의 부울)

  'OIZSLJT'/⍨ 문자열을 필터링하는 데 사용하십시오.

* 찾기는 오른쪽 인수와 동일한 모양의 부울 배열을 반환하며, 하나는 왼쪽 인수와 동일한 모든 하위 배열의 왼쪽 위 모서리를 나타냅니다.


이게 효과가 있을까요? {4=+/,⍵:'OIZSJLT'/⍨∨/1∊¨(((2 2)4⍴¨1),(0 1⌽¨⊂K⌽2⊖J),(⍳3)⊖¨⊂J←1,⍪K←3↑1)∘.⍷⍵∘{⌽∘⍉⍣⍵⊢⍺}¨⍳4}
— Zacharý

@ Zacharý 예, 감사합니다.
— Adám

7

자바 스크립트 (ES6) 242 212 172 164 바이트

x=>[...'OISZLJT'].filter((z,y)=>x.match(`^0*(${'99,33825|15,51|2145,195|561,2115|57,1059|135,71|1073'.split`,`[y].replace(/\d+/g,C=x=>x?x%2+C(x>>1)+x%2:'|')})0*$`))

그냥 공을 굴려야했지만, 조금 늦었습니다. ¯ \ _ (ツ) _ / ¯

행으로 분리 된 비트 스트링 취 0(S '0001000110001000000'표현을 0001 0011 0010 0000)과의 Tetromino을 나타내는 문자 또는 전혀 함유하지 않은 배열을 포함하는 배열을 반환한다.

이것은 어느 지점에서든 입력에 테트로 미노가 포함되어 있는지 확인하기 위해 테트로 미노의 각 회전을 확인하여 작동합니다. 각 테트로 미노는 하나 이상의 이진수로 표시됩니다.

0 0 0 0   -> 0000 0110 1100 0000
0 1 1 0   -> 0000001100110000000
1 1 0 0   -> 110011
0 0 0 0   -> 51

0 1 0 0   -> 0100 0110 0010 0000
0 1 1 0   -> 0100001100001000000
0 0 1 0   -> 100001100001
0 0 0 0   -> 2145

입력에 S tetromino가 포함되어 있는지 확인하려면 이진 표현 중 하나만 포함하는지 51또는 양쪽에 s 2145만 포함되어 있는지 확인하면 됩니다 0.

일부 테트로 미노의 방향은 4 가지입니다. 이진 표현을 보면 각각 2 개의 표현이 있으며 이는 단순히 다른 2 개의 거울입니다. 공간을 절약하기 위해 이진 표현은 재귀 C함수 와 동시에 앞뒤로 구성 되므로 두 방향을 넣고 다른 두 방향을 암시 할 수 있습니다.


문자 코드를 사용한 대체 방법 :

x=>[...'OISZLJT'].filter((z,y)=>x.match(`^0*(${[...'÷,êÿ,óî,ûÝ,ëúüÏ,çöïþ,ßýíÞ'.split`,`[y]].map(c=>(C=n=>n?'1e'+(n%4+2)%5-0+C(n>>2):'')(c.charCodeAt())).join`|`})0*$`))

3

레티 나 , 125 바이트

s`(.*1){5}.*

{s`.*1111.*
I
s`.*111(.{2,4})1.*
$.1
T`234`\LTJ
s`.*11(.{2,4})11.*
$.1
T`2-90`S\OZ4-9
s`.*4.*

O#$`.
$.%`
O#$^`

온라인으로 사용해보십시오! 링크에는 테스트 사례와 정수에서 4 × 4 행렬로 변환하는 헤더가 포함됩니다. 설명:

s`(.*1){5}.*

5 1초가 포함 된 입력을 삭제하십시오 .

{s`.*1111.*
I

입력의 모든 회전을 확인하십시오 (아래 참조). 입력 값에 연속 된 4 개가 포함되어있는 경우 입력 값 1은 I입니다.

s`.*111(.{2,4})1.*
$.1
T`234`\LTJ

세 개의 연속 된 1s와 세 개의 1중 하나 아래의 다음 행에 a 가 포함 된 경우 중간 문자 수를 해당 결과 문자에 매핑하십시오.

s`.*11(.{2,4})11.*
$.1

마찬가지로 인접한 두위한 1두 인접하는 인접의 1다음 행의.

T`2-90`S\OZ4-9

그러나 그렇지 않으면 사용되지 않는 0s를 사용하여 회전 수를 계산하십시오 .

s`.*4.*

너무 많은 회전이 수행되면 포기하십시오.

O#$`.
$.%`
O#$^`

배열을 바꾸고 뒤집어서 회전시킵니다.


3

MATL , 60 바이트

Itt6tIl7tl7H15vHe"4:"G@X!HYa]4$v@BIthYaEqY+4=aa]v'OSZLJTI'w)

입력은 ;행 구분자로 사용되는 이진 4x4 배열 (행렬) 입니다. Ouput은 테트로 미노가없는 문자이거나 비어 있습니다.

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 (출력에는 빈 결과를 식별 할 수 있도록 점이 추가됨).

설명

이 코드는 입력 4 × 4 어레이의 4 회전을 90 도씩 만듭니다. 회전 된 각 배열은 위아래로 2 개의 0으로 채워져 8x4 배열로 변환됩니다. 4 개의 어레이는 수직으로 32 × 4 어레이로 연결된다. 이 연결된 어레이 내에서 회전 된 4 개의 어레이는 제로 패딩으로 인해 "절연"됩니다.

7 개의 가능한 패턴 각각이 32 × 4 어레이에 존재하는지 테스트합니다. 이를 위해 루프가 사용됩니다. 각 패턴은 2 개의 숫자로 정의되며 이진수로 표현되어 적절한 0/1 마스크를 제공합니다. 예를 들어, 숫자 3, 6은 "S"형상을 정의한다.

2 개 숫자의 7 개 세트는 2x7 매트릭스로 배열되며,이 루프에서 각 열이 순차적으로 선택됩니다. 행렬은 모든 숫자를 스택으로 밀고 벡터로 오염시키고 2 행 행렬로 재구성하여 정의됩니다. "I"모양은 숫자 15와 0으로 정의되므로 끝 부분에 넣으면 0이 암묵적으로 재구성 기능으로 채워질 수 있습니다.

그런 다음 마스크는 네 방향으로 3 개의 0으로 채워집니다. 이는 입력에서 원하지 않는 값을 감지하기 위해 필요합니다.

마스크가 32 × 4 어레이에 존재 하는지를보기 위해, 후자는 바이폴라 형태 (즉, 0/1 대신 -1/1)로 변환되고 마스크와 관련된다. 마스크에는 4 개의 마스크가 있으므로 컨벌루션 결과의 일부 항목이 4와 일치하면 일치가 발생합니다.

루프가 끝나면 7 개의 false / true 결과가 얻어졌으며 그 중 최대 1 개가 true입니다. 가능한 출력 문자를 포함하는 문자열로 색인을 작성하는 데 사용됩니다.


3

젤리 , 53 바이트

ZL0ẋW⁸tZµ⁺ZU$3С“©©“œ“Ç¿“¦©¦“ƽ‘;Uḃ2$’¤iЀṀị“÷¶Ė¡µỵỤ»

온라인으로 사용해보십시오!

전체 프로그램. 4x4를 사용합니다. 인쇄 m가 아닌 경우의 Tetromino, 그렇지 않으면 소문자를 인쇄합니다.


... 비트 배열을 합법적으로 취하고 있습니까? 그것은 40 바이트처럼 나를 구할 것입니다
— ETHproductions

@ETHproductions 정수로 입력하거나 4x4 이진수의 2D 배열 또는 16 진수의 16 진 배열로 직접 입력 할 수 있습니다.
— 아웃 골퍼 에릭 14

허, 그 질문에 대한 감추고
— 싶은

1

펄 5 , 197 + 1 (-p) = 198 바이트

s/(0000)*$//;1while s/(...)0(...)0(...)0(...)0/0${1}0${2}0${3}0${4}/;$_={51,O,15,I,4369,I,54,S,561,S,99,Z,306,Z,547,L,23,L,785,L,116,L,275,J,113,J,802,J,71,J,114,T,562,T,39,T,609,T}->{oct("0b".$_)}

온라인으로 사용해보십시오!

16 비트 문자열을 입력으로 사용합니다. 입력이 단일 테트로 미노가 아닌 경우 아무것도 출력하지 않습니다.

어떻게?

두 개의 대체 요소는 입력 모양을 오른쪽 아래 모서리로 "이동"합니다. 결과 비트 문자열은 정수로 변환 된 다음 유효한 정수의 해시에서 확인됩니다.


1

APL (Dyalog) , 66 바이트

{'TIOJSLZ-'[(¯51 144 64,,∘+⍨12J96 ¯48J64)⍳×/(+/-4×⊢)⍵/,0j1⊥¨⍳4 4]}

온라인으로 사용해보십시오!

인수는 부울 벡터입니다.

점의 무게 중심까지의 부호있는 거리를 복소수 (실수 및 허수 부분은 ∆x, ∆y)로 계산하고 복소수를 곱합니다. 이것은 테트로 미노를 구별하기에 충분히 변하지 않는 것으로 밝혀졌다.


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