Diberikan bilangan bulat 16-bit unsigned N , tugas Anda adalah menentukan apakah representasi binernya yang dipetakan di dalam matriks 4x4 cocok dengan bentuk tetromino , dan jika demikian, bentuk apa itu.
Matriks
Setiap bit N dipetakan di dalam matriks 4x4, dari kiri ke kanan dan dari atas ke bawah, dimulai dengan yang paling signifikan.
Contoh :
N = 17600
binary representation: 0100010011000000
matrix: [ [ 0, 1, 0, 0 ],
[ 0, 1, 0, 0 ],
[ 1, 1, 0, 0 ],
[ 0, 0, 0, 0 ] ]
Bentuk tetromino
Bentuk dasar
Ada 7 bentuk tetromino, yang diidentifikasi oleh huruf O , I , S , Z , L , J dan T :
Rotasi dan terjemahan
Jika bentuk diterjemahkan dan / atau diputar dalam matriks 4x4, itu masih dianggap sebagai variasi yang valid dari tetromino yang sama. Misalnya, 17600, 1136, 2272 dan 1604 semuanya harus diidentifikasi sebagai J tetromino:
Jangan dibungkus!
Namun, bentuk tidak dapat membungkus atau digeser melampaui batas matriks apa pun. Misalnya, baik 568 maupun 688 tidak boleh diidentifikasi sebagai J tetromino (apalagi bentuk lain):
Klarifikasi dan aturan
- Anda dapat mengambil input sebagai integer, atau langsung sebagai 16 digit biner dalam format yang masuk akal, seperti array 2D, array datar atau string yang dibatasi.
- Input dijamin menjadi integer 16-bit yang tidak ditandatangani (atau representasi yang setara sebagai array atau string).
- Ketika bentuk yang valid diidentifikasi, Anda harus mencetak atau mengembalikan surat yang mengidentifikasi bentuk, baik dalam huruf kecil atau huruf besar.
- Jika tidak ada bentuk yang diidentifikasi, Anda harus mencetak atau mengembalikan nilai yang tidak cocok dengan huruf tetromino. Anda juga dapat memilih untuk tidak mengembalikan apa pun.
- Agar dianggap valid, matriks harus mengandung bentuk tetromino yang tepat tanpa sel tambahan (lihat 1911 dan 34953 dalam kasus uji).
- Ini kode-golf , jadi jawaban tersingkat dalam byte menang!
Uji kasus
Anda dapat mengikuti tautan ini untuk mendapatkan test case sebagai array 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'
sumber
func1 . func2 . func3
di JS: P0
, yaitu1111011110111101111
untuk65535
?15,240,3840,4369,8738,17476,34952,61440
J:71,113,142,226,275,550,802,1100,1136,1604,1808,2272,3208,3616,4400,8800,12832,17600,18176,25664,28928,36352,51328,57856
L:23,46,116,232,368,547,736,785,1094,1570,1856,2188,3140,3712,5888,8752,11776,12560,17504,25120,29696,35008,50240,59392
O:51,102,204,816,1632,3264,13056,26112,52224
S:54,108,561,864,1122,1728,2244,8976,13824,17952,27648,35904
T:39,78,114,228,305,562,610,624,1124,1220,1248,1824,2248,3648,4880,8992,9760,9984,17984,19520,19968,29184,35968,58368
Z:99,198,306,612,1224,1584,3168,4896,9792,19584,25344,50688
Jawaban:
Jelly ,
54 43 4241 byte-1 byte berkat Erik the Outgolfer (pindahkan transpos di dalam rantai berulang)
Tautan monadik yang mengambil array bilangan bulat 2D (
1
s dan0
s) dan mengembalikan huruf keciloiszljt
untuk masing-masing tetromino atauw
jika tidak valid.Cobalah secara Online! atau lihat test suite .
Lihat juga program ini yang mencantumkan semua 1820 kemungkinan array biner 2D dengan tepat empat bit yang diset bersama dengan outputnya, diurutkan berdasarkan output tersebut.
Bagaimana?
Ini pertama kali mengambil keempat rotasi input. Kemudian ia menggeser set bit masing-masing sejauh ke kanan dan kemudian sejauh ke bawah sebanyak mungkin dan mengubah hasilnya ke angka biner. Kemudian mencari hasil minimum dalam daftar representasi minimal seperti itu dari setiap tetromino yang valid dan menggunakan hasil yang dikurangi untuk mengindeks ke dalam dua kata kamus gabungan
zoist
+jowl
, menghasilkanw
ketika tidak ditemukan kecocokan.Metode sebelumnya (54 byte)
Tautan monadik yang mengambil array bilangan bulat 2D (
1
s dan0
s) dan mengembalikan huruf keciloiszljt
untuk masing-masing tetromino atauw
jika tidak valid.Cobalah online!
Ini memeriksa setidaknya ada tiga baris kosong (baris + kolom) dan bahwa pola bit tertentu tidak ada di setiap baris (khususnya angka 5,9,10,11, dan 13), ini bersama-sama memastikan langkah berikutnya tidak akan menghasilkan salah-positif. Itu kemudian meratakan dan kemudian menggeser-geser angka biner (dengan menelusur angka nol sebelum konversi) dari masing-masing dari empat rotasi, dan mencari hasil minimal dalam daftar angka, menggunakan hasil yang dikurangi untuk mengindeks ke dalam dua kata kamus yang digabungkan.
zoist
+jowl
, menghasilkanw
ketika tidak ada kecocokan yang ditemukan.sumber
zoistjowl
biasanya tidak cocok untuk string sebaliknya: p)...Ṁị“LZOISTJW
itu)ZU$3С
: pPython 3 , 124 byte
Cobalah online!
Mengharapkan bilangan bulat n yang mewakili matriks biner 4 × 4. Melempar jika tidak ada tetromino yang ditemukan.
Baris 2 menggeser bentuk ke kanan sampai angka 1 berada di kolom paling kanan. (4369
0001 0001 0001 0001
dalam biner.) Baris 3 menurunkan bentuk sampai 1 berada di baris bawah. Bersama-sama ini berubah misalnya:Kemudian kami mencari indeks
n
dalam daftar ini:Setiap kolom indeks setara modulo 7 sesuai dengan bentuk tetromino. 64 (
@
) digunakan sebagai nilai padding karenan
tidak dapat 64 pada saat ini dalam kode.NB. Pengecualian diberikan untuk input
0
dengan menghitungn/n
alih-alih1
.sumber
print("ÿ")
, byte yang ditulis adalahc3 bf 0a
, tidakff 0a
, dan gambar PPM berubah menjadi sampah.APL (Dyalog) ,
9594938987 byte-2 Terima kasih kepada Zacharý
Membutuhkan
⎕IO←0
yang default pada banyak sistem. Membawa matriks Boolean (dalam bentuk apa pun!) Sebagai argumen. Tidak menghasilkan apa-apa jika jumlah bit yang diberikan bukan empat, dan garis kosong jika keempat bit yang diberikan tidak membentuk tetromino.Cobalah online!
Bekerja dengan membuat keempat rotasi input, lalu mencari setiap tetromino di setiap rotasi.
{
...}
fungsi anonim di mana argumen diwakili oleh⍵
:,⍵
ravel (meratakan) argumen+/
jumlahkan itu4=
Apakah empat sama dengan itu?:
jika demikian, maka (tidak ada yang kembali):⍳4
empat penemuan pertama;[0,1,2,3]
⍵∘{
...}¨
terapkan fungsi berikut pada masing-masing, menggunakan input sebagai argumen kiri tetap⍺
argumen kiri yaitu input⊢⍺
hasilkan itu (terpisah⍵
dari⍺
)⌽∘⍉⍣⍵
mirror dan transpose (yaitu memutar 90 °)⍵
kali(
...)∘.⍷
luar "produk", tetapi menggunakan Find *, dari daftar berikut dan rotasi:3↑1
ambil tiga elemen dari satu, padding dengan nol;[1,0,0]
K←
simpan itu sebagaiK
⍪
tabel (dibuat menjadi vektor kolom);[[1],[0],[0]]
1,
tambahkan satu;[[1,1],[1,0],[1,0]]
("J")J←
simpan sebagaiJ
(
...)⊖¨⊂
putar seluruh J secara vertikal, masing-masing dari sejumlah langkah berikut:⍳3
tiga ɩ ntegers pertama;[0,1,2]
kami punya
[[[1,1],[1,0],[1,0]],[[1,0],[1,0],[1,1]],[[1,0],[1,1],[1,0]]]
("J", "L," T ")(
...),
tambahkan daftar berikut:2⊖J
putarJ
dua langkah secara vertikal;[[1,0],[1,1],[1,0]]
("T")K⌽
putar baris-barisnya masing-masing sebesar 1, 0, dan 0;[[0,1],[1,1],[1,0]]
("Z")0 1⌽¨⊂
putar seluruh larik secara vertikal, tidak ada waktu dan sekali;[[[0,1],[1,1],[1,0]],[[1,0],[1,1],[0,1]]]
("Z", "S")(
...),
tambahkan daftar berikut:(2 2)4⍴¨1
membentuk kembali satu menjadi masing-masing matriks 2 × 2 dan daftar 4-elemen;[[[1,1],[1,1]],[1,1,1,1]]
("O", "I")1∊¨
untuk masing-masing, apakah satu anggota?∨/
reduksi horizontal ATAU (mis. melintasi rotasi; satu Boolean untuk setiap bentuk)'OIZSLJT'/⍨
gunakan itu untuk menyaring string* Find mengembalikan array Boolean dengan bentuk yang sama dengan argumen kanannya, dengan yang menunjukkan sudut kiri atas semua subarrays yang identik dengan argumen kiri.
sumber
{4=+/,⍵:'OIZSJLT'/⍨∨/1∊¨(((2 2)4⍴¨1),(0 1⌽¨⊂K⌽2⊖J),(⍳3)⊖¨⊂J←1,⍪K←3↑1)∘.⍷⍵∘{⌽∘⍉⍣⍵⊢⍺}¨⍳4}
JavaScript (ES6),
242212172164 byteSeharusnya hanya untuk menggulirkan bola, tapi aku sedikit terlambat untuk itu ¯ \ _ (ツ) _ / ¯
Mengambil string bit, dengan baris yang dipisahkan oleh
0
s ('0001000110001000000'
mewakili0001 0011 0010 0000
) dan mengembalikan array yang berisi karakter yang mewakili tetromino, atau array yang tidak mengandung apa-apa.Ini bekerja dengan memeriksa setiap rotasi tetromino untuk melihat apakah input pada titik mana pun mengandung tetromino, dikelilingi seluruhnya oleh nol di kedua sisi. Setiap tetromino diwakili oleh satu atau lebih angka biner:
Jadi untuk memeriksa apakah input mengandung tetromino S, kita cukup memeriksa apakah input tersebut berisi representasi biner dari salah satu ,
51
atau2145
hanya dengan0
s di kedua sisi.Beberapa tetromino memiliki 4 orientasi. Jika Anda melihat representasi biner dari ini, masing-masing memiliki 2 representasi yang hanya merupakan cermin dari dua lainnya. Untuk menghemat ruang, representasi biner dibangun maju dan mundur bersamaan dengan
C
fungsi rekursif , memungkinkan kita untuk hanya memasukkan dua orientasi dan menyiratkan dua lainnya.Pendekatan alternatif dengan kode karakter:
sumber
Retina , 125 byte
Cobalah online! Tautan mencakup test case plus header untuk mengkonversi dari bilangan bulat ke matriks 4 × 4. Penjelasan:
Hapus input jika mengandung 5
1
s.Periksa semua rotasi input (lihat di bawah). Jika input berisi empat berturut-turut
1
, ini adalahI
.Jika itu berisi tiga berturut-turut
1
ditambah satu1
pada baris berikutnya di bawah salah satu dari tiga, kemudian memetakan jumlah karakter menengah ke huruf hasil yang sesuai.Demikian pula untuk dua
1
s yang berdekatan berbatasan dengan dua1
s yang berdekatan pada baris berikutnya.Tetapi juga tetap menghitung jumlah rotasi menggunakan
0
s jika tidak digunakan .Dan menyerah jika terlalu banyak rotasi telah dilakukan.
Transpos dan balikkan array, sehingga memutarnya.
sumber
MATL , 60 byte
Input adalah array biner 4 × 4 (matriks), menggunakan
;
sebagai pemisah baris. Ouput adalah huruf atau kosong tanpa tetromino.Cobalah online! Atau verifikasi semua kasus uji (output memiliki titik ditambahkan untuk memungkinkan mengidentifikasi hasil kosong).
Penjelasan
Kode membangun 4 rotasi input 4 × 4 array dalam langkah 90 derajat. Setiap array yang diputar diisi dengan 2 nol ke atas dan ke bawah, yang mengubahnya menjadi array 8 × 4. Keempat array secara vertikal digabungkan menjadi array 32 × 4. Keempat array yang diputar dalam array bersambung ini "terisolasi" berkat zero-padding.
Masing-masing dari 7 pola yang mungkin diuji untuk melihat apakah ada dalam array 32 × 4. Loop digunakan untuk ini. Setiap pola didefinisikan oleh dua angka, yang dinyatakan dalam biner memberikan topeng 0/1 yang sesuai. Misalnya, angka
3
,6
tentukan bentuk "S".7 set 2 angka disusun menjadi matriks 2 × 7, dari mana loop akan memilih setiap kolom secara berurutan. Matriks didefinisikan dengan mendorong semua angka ke stack, mengontrasasinya menjadi vektor, dan membentuk kembali menjadi matriks 2-baris. Karena bentuk "I" didefinisikan oleh angka 15 diikuti oleh 0, menempatkannya pada akhirnya memungkinkan 0 untuk secara implisit diisi oleh fungsi pembentukan kembali.
Topeng kemudian diisi dengan 3 nol di empat arah. Ini diperlukan untuk mendeteksi nilai yang tidak diinginkan dalam input.
Untuk melihat apakah topeng hadir dalam array 32 × 4, yang terakhir ditransformasikan ke bentuk bipolar (yaitu /11/1 alih-alih 0/1) dan berbelit-belit dengan topeng. Karena topeng memiliki 4 yang, pencocokan terjadi jika beberapa entri dalam hasil konvolusi sama dengan 4.
Pada akhir loop, 7 hasil salah / benar telah diperoleh, paling banyak salah satunya adalah benar. Ini digunakan untuk mengindeks ke dalam string yang berisi kemungkinan surat keluaran.
sumber
Jelly , 53 byte
Cobalah online!
Program lengkap. Mengambil 4x4. Mencetak
m
jika bukan tetromino, sebaliknya mencetak huruf kecil.sumber
Perl 5 , 197 +1 (-p) = 198 byte
Cobalah online!
Mengambil string 16 bit sebagai input. Tidak menghasilkan apa-apa jika input bukan tetromino tunggal.
Bagaimana?
Dua pergantian "memindahkan" bentuk input ke sudut kanan bawah. Bit string yang dihasilkan dikonversi ke integer, kemudian diperiksa dalam hash integer yang valid.
sumber
APL (Dyalog) , 66 byte
{'TIOJSLZ-'[(¯51 144 64,,∘+⍨12J96 ¯48J64)⍳×/(+/-4×⊢)⍵/,0j1⊥¨⍳4 4]}
Cobalah online!
Arg adalah vektor boolean.
Menghitung jarak titik-titik yang telah ditandatangani ke pusat gravitasi mereka sebagai bilangan kompleks (bagian nyata dan imajiner adalah ,x, ∆y) dan mengalikan bilangan kompleks bersama-sama. Ini ternyata menjadi invarian yang cukup baik untuk membedakan antara tetromino.
sumber