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


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 , JT로 식별되는 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⌽¨⊂K2J),(⍳3)⊖¨⊂J1,⍪K31)∘.⍷⍵∘{⌽∘⍉⍣⍵⊢⍺}¨⍳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 개가 포함되어있는 경우 입력 값 1I입니다.

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.