Mà tetromino này là?


54

Với một số nguyên N không dấu 16 bit , nhiệm vụ của bạn là xác định xem biểu diễn nhị phân của nó được ánh xạ bên trong ma trận 4x4 có khớp với hình dạng tetromino hay không , và nếu vậy, nó có hình dạng như thế nào.

Ma trận

Mỗi bit của N được ánh xạ bên trong một ma trận 4 x 4, từ trái sang phải và từ trên xuống dưới, bắt đầu bằng một ma trận quan trọng nhất.

Ví dụ :

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

Hình dạng Tetromino

Hình dạng cơ sở

Có 7 hình dạng tetromino, được xác định bằng các chữ cái O , I , S , Z , L , JT :

tetrominoes

Xoay và dịch

Nếu một hình dạng được dịch và / hoặc xoay trong ma trận 4x4, nó vẫn được coi là một biến thể hợp lệ của cùng một tetromino. Ví dụ: 17600, 1136, 2272 và 1604 nên được xác định là tetrominoes J :

ví dụ J hợp lệ

Đừng quấn!

Tuy nhiên, các hình dạng không thể bao quanh hoặc bị dịch chuyển ra ngoài bất kỳ ranh giới nào của ma trận. Chẳng hạn, không nên xác định 568 hay 688 là tetrominoes J (huống chi là bất kỳ hình dạng nào khác):

ví dụ J không hợp lệ

Làm rõ và quy tắc

  • Bạn có thể lấy đầu vào dưới dạng số nguyên hoặc trực tiếp dưới 16 chữ số nhị phân ở bất kỳ định dạng hợp lý nào, chẳng hạn như mảng 2D, mảng phẳng hoặc chuỗi phân cách.
  • Đầu vào được đảm bảo là một số nguyên 16 bit không dấu (hoặc biểu diễn tương đương của nó dưới dạng một mảng hoặc một chuỗi).
  • Khi một hình dạng hợp lệ được xác định, bạn phải in hoặc trả lại chữ cái xác định hình dạng, bằng chữ thường hoặc chữ hoa.
  • Nếu không có hình dạng nào được xác định, bạn phải in hoặc trả về giá trị không khớp với bất kỳ chữ tetromino nào. Bạn cũng có thể chọn không trả lại bất cứ điều gì cả.
  • Để được coi là hợp lệ, ma trận phải chứa hình dạng tetromino chính xác mà không có bất kỳ ô bổ sung nào (xem 1911 và 34953 trong các trường hợp thử nghiệm).
  • Đây là , vì vậy câu trả lời ngắn nhất bằng byte sẽ thắng!

Các trường hợp thử nghiệm

Bạn có thể theo liên kết này để lấy các trường hợp thử nghiệm dưới dạng mảng 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'

Thật thú vị, tôi đã làm việc với một vấn đề cực kỳ tương tự vào ngày khác trước khi tôi bị phân tâm khi tạo ra một kỹ thuật sử dụng chuỗi chức năng func1 . func2 . func3trong JS: P
ETHproductions

Tôi có thể nhận đầu vào là bốn hàng được nối với 0, tức là 1111011110111101111cho 65535không?
Sản xuất ETH

@ETHproductions Điều đó có vẻ tốt. Tôi đã chỉnh sửa thử thách với định dạng đầu vào hơi thoải mái.
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
Kỹ sư Toast

^ Được tạo bằng câu trả lời Python 3 của Lynn vì nó có các định dạng đầu vào / đầu ra thuận tiện.
Kỹ sư Toast

Câu trả lời:


6

Thạch ,  54 43 42  41 byte

-1 byte nhờ Erik the Outgolfer (di chuyển chuyển bên trong chuỗi lặp lại)

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

Một liên kết đơn âm lấy một mảng số nguyên 2D ( 1s và 0s) và trả về một chữ cái viết thường oiszljtcho tetromino tương ứng hoặc wnếu không hợp lệ.

Hãy thử trực tuyến! hoặc xem bộ thử nghiệm .

Cũng xem chương trình này liệt kê tất cả 1820 mảng nhị phân 2D có thể có với bốn bit được đặt chính xác cùng với các đầu ra của chúng, được sắp xếp theo các đầu ra đó.

Làm sao?

Điều này đầu tiên có tất cả bốn vòng quay của đầu vào. Sau đó, nó dịch chuyển các bit đã đặt của từng cái sang bên phải và sau đó càng về phía dưới càng tốt và chuyển đổi kết quả thành số nhị phân. Sau đó, nó tìm kiếm kết quả tối thiểu trong một danh sách các biểu diễn tối thiểu như vậy của mỗi tetromino hợp lệ và sử dụng kết quả giảm dần để lập chỉ mục cho hai từ trong từ điển ghép nối zoist+ jowl, cho kết quả wkhi không tìm thấy kết quả khớp.

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', ...)

Phương thức trước đó (54 byte)

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

Một liên kết đơn âm lấy một mảng số nguyên 2D ( 1s và 0s) và trả về một chữ cái viết thường oiszljtcho tetromino tương ứng hoặc wnếu không hợp lệ.

Hãy thử trực tuyến!

Kiểm tra này có ít nhất ba dòng trống (hàng + cột) và các mẫu bit nhất định không có trong bất kỳ dòng nào (cụ thể là các số 5,9,10,11 và 13), các số này cùng nhau đảm bảo bước tiếp theo sẽ không mang lại dương tính giả. Sau đó, nó làm phẳng và sau đó chuyển số nhị phân (bằng cách tách các số 0 ở cuối trước khi chuyển đổi) của mỗi bốn phép quay và tìm kiếm kết quả tối thiểu trong một danh sách các số, sử dụng kết quả giảm dần để lập chỉ mục cho hai từ trong từ điển được nối zoist+ jowl, cho năng suất wkhi không tìm thấy kết quả khớp.


Và tôi biết có một cách tốt hơn là mã hóa ...
Erik the Outgolfer

btw Tôi nghĩ rằng mã này phụ thuộc vào một sự trùng hợp ngẫu nhiên (bởi vì, zoistjowlthông thường , sẽ không phù hợp với một chuỗi khác: p)
Erik the Outgolfer

Bạn có ý nghĩa gì "phụ thuộc vào một sự trùng hợp"? (tra cứu từ điển chỉ lưu một byte hơn ...Ṁị“LZOISTJWdù sao)
Jonathan Allan

Hmm ... vâng tôi biết điều này sẽ không tồn tại lâu ... btw Tôi nghĩ rằng bạn đã đánh cắp của tôi ZU$3С: p
Erik the Outgolfer

Tôi đã cố gắng làm phương pháp tương tự ngày hôm qua sau khi gửi cái trước đó nhưng nghĩ rằng tôi hơi mệt.
Jonathan Allan

28

Python 3 , 124 byte

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]

Hãy thử trực tuyến!

Yêu cầu một số nguyên n đại diện cho ma trận nhị phân 4 × 4. Ném nếu không tìm thấy tetromino.

Dòng 2 trượt hình bên phải cho đến khi 1 ở cột ngoài cùng bên phải. (4369 0001 0001 0001 0001ở dạng nhị phân.) Dòng 3 làm giảm hình dạng cho đến khi 1 ở hàng dưới cùng. Cùng nhau lần lượt này, vd:

    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

Sau đó, chúng tôi tìm kiếm các chỉ số ntrong danh sách này:

 [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

Mỗi cột của các chỉ số tương đương modulo 7 tương ứng với hình dạng tetromino. 64 ( @) được sử dụng làm giá trị đệm vì nkhông thể là 64 tại thời điểm này trong mã.

Lưu ý Một ngoại lệ được đưa ra cho đầu vào 0bằng máy tính n/nthay vì 1.


Tại sao chuỗi nhị phân của bạn hoạt động? Tôi gặp vấn đề với điều đó trong Python 3, xem bình luận codegolf.stackexchange.com/a/85201/53667
Karl Napf

Python sử dụng UTF-8 làm mã hóa mặc định cho mã nguồn và cho đầu ra văn bản. Nhưng các tệp PPM không được đọc trong UTF-8. Khi bạn chạy print("ÿ"), các byte được ghi là c3 bf 0akhông phải ff 0avà hình ảnh PPM biến thành rác.
Lynn

8

APL (Dyalog) , 95 94 93 89 87 byte

-2 cảm ơn Zacharý

Yêu cầu ⎕IO←0mặc định trên nhiều hệ thống. Lấy ma trận Boolean (có hình dạng bất kỳ!) Làm đối số. Trả về không có gì nếu số bit đã cho không phải là bốn và một dòng trống nếu bốn bit đã cho không tạo thành tetromino.

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

Hãy thử trực tuyến!

Hoạt động bằng cách tạo tất cả bốn vòng quay của đầu vào, sau đó tìm kiếm từng tetromino trong mỗi vòng quay.

{... } chức năng ẩn danh mà lập luận được đại diện bởi :

,⍵ ravel (làm phẳng) đối số

+/ tổng hợp nó

4= bốn bằng với đó?

: nếu vậy, thì (không trả lại gì cả):

  ⍳4 đầu tiên bốn ɩ ndices; [0,1,2,3]

  ⍵∘{Mỗi nhóm  áp dụng các chức năng sau, sử dụng đầu vào làm đối số bên trái cố định

    đối số bên trái tức là đầu vào

   ⊢⍺ mang lại (tách từ )

   ⌽∘⍉⍣⍵ gương và chuyển vị (tức là xoay 90 °) lần

  (... )∘.⍷ bên ngoài "sản phẩm", nhưng sử dụng Find *, trong danh sách sau đây và quay:

   3↑1 lấy ba yếu tố từ một, đệm với số không; [1,0,0]

   K← lưu trữ mà như K

    bảng (tạo thành vectơ cột); [[1],[0],[0]]

   1, trả trước một cái; [[1,1],[1,0],[1,0]]("J")

   J← lưu trữ như J

   (... )⊖¨⊂ xoay toàn bộ J theo chiều dọc, mỗi số sau các bước:

    ⍳3 ba ntegers đầu tiên ;[0,1,2]

   chúng ta có [[[1,1],[1,0],[1,0]],[[1,0],[1,0],[1,1]],[[1,0],[1,1],[1,0]]]("J", "L," T ")

   (... ), thêm vào trước danh sách sau đây:

    2⊖J xoay Jhai bước theo chiều dọc; [[1,0],[1,1],[1,0]]("T")

    K⌽ xoay các hàng đó theo các bước 1, 0 và 0 tương ứng; [[0,1],[1,1],[1,0]]("Z")

    0 1⌽¨⊂ xoay toàn bộ mảng theo chiều dọc, không có lần và một lần; [[[0,1],[1,1],[1,0]],[[1,0],[1,1],[0,1]]] ("Z", "S")

    (... ), thêm vào trước danh sách sau đây:

     (2 2)4⍴¨1 định hình lại một cái thành từng ma trận 2 × 2 và danh sách 4 phần tử; [[[1,1],[1,1]],[1,1,1,1]]("O", "Tôi")

  1∊¨ cho mỗi, là một thành viên?

  ∨/ giảm OR theo chiều ngang (nghĩa là trên các góc quay; một Boolean cho mỗi hình dạng)

  'OIZSLJT'/⍨ sử dụng để lọc chuỗi

* Find trả về một mảng Boolean có cùng hình dạng với đối số bên phải của nó, với các mảng chỉ ra góc trên cùng bên trái của tất cả các chuỗi con giống hệt với đối số bên trái.


Điều này sẽ làm việc? {4=+/,⍵:'OIZSJLT'/⍨∨/1∊¨(((2 2)4⍴¨1),(0 1⌽¨⊂K⌽2⊖J),(⍳3)⊖¨⊂J←1,⍪K←3↑1)∘.⍷⍵∘{⌽∘⍉⍣⍵⊢⍺}¨⍳4}
Zacharý

@ Zacharý Vâng, cảm ơn, đã xong.
Adám

7

JavaScript (ES6), 242 212 172 164 byte

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*$`))

Đáng lẽ chỉ là để bóng lăn, nhưng tôi hơi muộn vì điều đó ¯ \ _ (ツ) _ /

Lấy một chuỗi bit, với các hàng được phân tách bằng 0s ( '0001000110001000000'đại diện 0001 0011 0010 0000) và trả về một mảng chứa ký tự đại diện cho tetromino hoặc một mảng không chứa gì.

Điều này hoạt động bằng cách kiểm tra từng vòng quay của tetromino để xem liệu đầu vào tại bất kỳ điểm nào có chứa tetromino, được bao quanh hoàn toàn bởi các số 0 ở hai bên. Mỗi tetromino được đại diện bởi một hoặc nhiều số nhị phân:

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

Vì vậy, để kiểm tra xem đầu vào có chứa tetromino S hay không, chúng ta chỉ cần kiểm tra xem nó có chứa biểu diễn nhị phân của một trong hai 51hoặc 2145chỉ với 0s ở hai bên.

Một số tetrominoes có 4 hướng. Nếu bạn nhìn vào các biểu diễn nhị phân của các đại diện này, mỗi cái có 2 biểu diễn đơn giản là gương của hai biểu tượng kia. Để tiết kiệm không gian, biểu diễn nhị phân được xây dựng tiến và lùi đồng thời với Chàm đệ quy , cho phép chúng ta chỉ đặt hai trong số các định hướng vào và có hai hàm còn lại.


Cách tiếp cận thay thế với mã hóa:

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

Võng mạc , 125 byte

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#$^`

Hãy thử trực tuyến! Liên kết bao gồm các trường hợp thử nghiệm cộng với một tiêu đề để chuyển đổi từ số nguyên sang ma trận 4 × 4. Giải trình:

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

Xóa đầu vào nếu nó chứa 5 1s.

{s`.*1111.*
I

Kiểm tra tất cả các vòng quay của đầu vào (xem bên dưới). Nếu đầu vào chứa bốn 1s liên tiếp , thì đó là một I.

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

Nếu nó chứa ba 1s liên tiếp cộng với a 1trên dòng tiếp theo bên dưới một trong ba, thì ánh xạ số lượng ký tự trung gian vào chữ cái kết quả thích hợp.

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

Tương tự cho hai 1s liền kề với hai 1s liền kề trên dòng tiếp theo.

T`2-90`S\OZ4-9

Nhưng cũng giữ số lượng các phép quay bằng cách sử dụng 0s không sử dụng .

s`.*4.*

Và bỏ cuộc nếu quá nhiều phép quay đã được thực hiện.

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

Chuyển và đảo ngược mảng, do đó xoay nó.


3

MATL , 60 byte

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

Đầu vào là một mảng nhị phân 4 × 4 (ma trận), sử dụng ;làm dấu tách hàng. Ouput là một chữ cái hoặc trống không có tetromino.

Hãy thử trực tuyến! Hoặc xác minh tất cả các trường hợp kiểm tra (đầu ra có dấu chấm được nối để cho phép xác định kết quả trống).

Giải trình

Mã xây dựng 4 góc quay của mảng 4 × 4 đầu vào theo các bước 90 độ. Mỗi mảng xoay được đệm với 2 số 0 lên xuống, biến nó thành một mảng 8 × 4. 4 mảng được nối theo chiều dọc thành một mảng 32 × 4. Bốn mảng được xoay trong mảng được nối này được "cô lập" nhờ vào phần đệm bằng không.

Mỗi trong số 7 mẫu có thể được kiểm tra để xem liệu nó có trong mảng 32 × 4 không. Một vòng lặp được sử dụng cho việc này. Mỗi mẫu được xác định bởi hai số, được biểu thị bằng nhị phân cho mặt nạ 0/1 thích hợp. Ví dụ: số 3, 6xác định hình dạng "S".

7 bộ 2 số được sắp xếp thành ma trận 2 × 7, từ đó vòng lặp sẽ chọn từng cột theo tuần tự. Ma trận được xác định bằng cách đẩy tất cả các số vào ngăn xếp, ghép chúng thành một vectơ và định hình lại thành ma trận 2 hàng. Vì hình dạng "I" được xác định bởi số 15 theo sau là 0, nên đặt nó ở cuối cho phép 0 được điền đầy đủ bởi chức năng định hình lại.

Mặt nạ sau đó được đệm bằng 3 số không theo bốn hướng. Điều này là cần thiết để phát hiện các giá trị không mong muốn trong đầu vào.

Để xem mặt nạ có mặt trong mảng 32 × 4 hay không, mặt sau được chuyển thành dạng lưỡng cực (tức là /11/1 thay vì 0/1) và được kết hợp với mặt nạ. Vì mặt nạ có 4 cái, sự trùng khớp xảy ra nếu một số mục trong kết quả tích chập bằng 4.

Vào cuối vòng lặp, 7 kết quả sai / đúng đã thu được, nhiều nhất là một trong số đó là đúng. Điều này được sử dụng để lập chỉ mục thành một chuỗi chứa các chữ cái đầu ra có thể.


3

Thạch , 53 byte

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

Hãy thử trực tuyến!

Chương trình đầy đủ. Có một chiếc xe 4 bánh. In mnếu không phải là tetromino, nếu không thì in chữ thường.


Là ... việc lấy một mảng các bit hợp pháp? Điều đó sẽ giúp tôi tiết kiệm được 40 byte
ETHproductions

@ETHproductions Bạn có thể lấy đầu vào là một số nguyên hoặc trực tiếp dưới dạng một mảng 2D gồm các chữ số nhị phân 4 x 4 hoặc một mảng phẳng gồm 16 chữ số nhị phân.
Erik the Outgolfer

Huh, phục vụ tôi ngay để lướt qua câu hỏi ...
ETHproductions

1

Perl 5 , 197 + 1 (-p) = 198 byte

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".$_)}

Hãy thử trực tuyến!

Lấy một chuỗi 16 bit làm đầu vào. Đầu ra không có gì nếu đầu vào không phải là một tetromino.

Làm sao?

Hai thay thế "di chuyển" hình dạng đầu vào vào góc dưới bên phải. Chuỗi bit kết quả được chuyển đổi thành một số nguyên, sau đó được kiểm tra trong hàm băm của các số nguyên hợp lệ.


1

APL (Dyalog) , 66 byte

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

Hãy thử trực tuyến!

Các arg là một vector boolean.

Tính khoảng cách đã ký của các chấm đến trọng tâm của chúng là các số phức (phần thực và phần ảo là ∆x, ∆y) và nhân các số phức với nhau. Điều này hóa ra là một bất biến đủ tốt để phân biệt giữa các tetrominoes.


Phương pháp thú vị.
Arnauld
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.