Cetak Persegi Panjang Pentomino

16

Tulis program atau fungsi yang tidak membutuhkan input selain mencetak atau mengembalikan penggambaran teks persegi panjang konstan yang terbuat dari 12 pentomino berbeda :

12 pentomino

Persegi panjang mungkin memiliki dimensi apa pun dan berada dalam orientasi apa pun, tetapi semua 12 pentomino harus digunakan tepat sekali, sehingga akan memiliki area 60. Setiap pentomino yang berbeda harus terdiri dari karakter ASCII yang dapat dicetak yang berbeda (Anda tidak perlu menggunakan surat dari atas).

Misalnya, jika Anda memilih untuk menampilkan solusi segi empat pentomino 20x3 ini:

Solusi 3x20

Output program Anda mungkin terlihat seperti ini:

00.@@@ccccF111//=---
0...@@c))FFF1//8===-
00.ttttt)))F1/8888=-

Atau, Anda mungkin lebih mudah untuk bermain golf dengan solusi 6 × 10 ini:

000111
203331
203431
22 444
2   46
57 666
57769!
58779!
58899!
5889!!

Solusi persegi panjang apa pun akan dilakukan, program Anda hanya perlu mencetaknya. (Baris baru yang tertinggal di output baik-baik saja.)

Situs web yang hebat ini memiliki banyak solusi untuk berbagai dimensi persegi panjang dan mungkin layak untuk menjelajahinya untuk memastikan solusi Anda sesingkat mungkin. Ini adalah kode-golf, jawaban terpendek dalam byte menang.

Hobi Calvin
sumber
15
Bonus jika itu "quine" di Piet.
mbomb007
@ mbomb007 Itu sangat mustahil dengan hanya 12 blok untuk dimainkan: P
Sp3000
Saya tidak berpikir bahwa ruang harus diizinkan di perbatasan. Tetapi karena memang begitu, bisakah saya menghilangkan spasi tambahan? Apakah saya mendapatkan bonus jika saya mencetak solusi vertikal 5x12 dengan saya keluar dari ruang pada akhirnya?
John Dvorak
@ Sp3000 bagaimana dengan program Piet yang seluruhnya terdiri dari solusi segi empat pentomino?
John Dvorak
@ JanDvorak Anda tidak dapat menghilangkan spasi tambahan jika Anda memilikinya. Mereka adalah karakter seperti sisa ASCII yang dapat dicetak.
Hobi Calvin

Jawaban:

1

Pyth, 37 byte

jc4.HC"&f3ªªwril3:[·)ÌDU[r)ÌDA»

Demonstrasi

Menggunakan pendekatan yang sangat mudah: Gunakan hex byte sebagai angka. Konversi ke nomor hex, 256 basis encode itu. Itu memberi string ajaib di atas. Untuk mendekode, gunakan fungsi decoder 256 basis Pyth, konversi ke hex, dibagi menjadi 4 potongan, dan bergabung di baris baru.

isaacg
sumber
5

CJam (44 byte)

Diberikan dalam format xxd karena berisi karakter kontrol (termasuk tab mentah, yang bermain sangat buruk dengan MarkDown):

0000000: 2202 7e0d 8ef3 570d e085 e168 cf27 092c
0000010: a235 0c22 3235 3662 3562 332f 5f2c 2c2e
0000020: 7b32 2f27 412b 662b 7d7a 4e2a 

yang menerjemahkan ke sesuatu di sepanjang baris

"MAGIC STRING"256b5b3/_,,.{2/'A+f+}zN*

Demo online sedikit ungolfed yang tidak mengandung karakter kontrol dan bermain dengan baik dengan fungsi pustaka decoding perpustakaan URI.

Prinsip dasarnya adalah karena tidak ada bentang yang mencakup lebih dari 5 baris, kita dapat menyandikan offset dari fungsi linier nomor baris secara ringkas (pada basis 5, pada kenyataannya, meskipun saya belum mencoba menentukan apakah ini akan selalu menjadi kasus ).

Peter Taylor
sumber
5

Bash + utilitas Linux umum, 50

xxd -s20 -p -c2 $0
#<30 bytes of binary data>

Untuk membuat ulang ini dari base64 yang disandikan:

base64 -d <<< eHhkIC1zMjAgLXAgLWMyICQwCiMiImaSaZlmkDAAMwSjRKNEqoGogYhRVVF7UXu7d3s= > pent.sh

Karena ada 12 pentomino, warnanya mudah dikodekan dalam hex nybbles.

Keluaran:

$ ./pent.sh
2222
6692
6999
6690
3000
3304
a344
a344
aa81
a881
8851
5551
7b51
7bbb
777b
$ 
digital Trauma
sumber
4

J, 49 byte

u:64++/\|:3#.inv 1377859090 1567813024 1337683230

Anda dapat memilih huruf-huruf sedemikian rupa sehingga peningkatan maksimal antara huruf-huruf yang berdekatan secara vertikal adalah 2. Kami menggunakan fakta ini untuk menyandikan kenaikan vertikal di basis3. Setelah itu kami membuat jumlah berjalan dan menambahkan offset untuk mendapatkan kode ASCII dari surat-surat itu.

Jelas golf. (Saya belum menemukan cara untuk memasukkan nomor base36 presisi yang diperluas tetapi base36 sederhana harus menyimpan 3 byte saja.)

Keluaran:

AAA
ABA
BBB
DBC
DCC
DCC
DEE
DFE
FFE
FGE
FGG
GGH
HHH
IIH
JII
JJI
JKK
JKL
KKL
LLL

Cobalah online di sini.

randomra
sumber
Sangat bagus. Dengan pengkodean base-256 menerapkan perbedaan pengkodean ini di CJam memberikan 33 byte ( versi 48 byte tanpa b256 ).
Peter Taylor
Ini luar biasa! Ini juga akan bekerja dengan 4x15, yang akan bekerja dengan baik untuk mengemas empat angka menjadi satu byte, jika Anda menyimpan data dengan lebar alih-alih memanjang. Anda membutuhkan tata letak yang memiliki pentomino U menghadap ke arah yang benar. Ada banyak tautan dalam pertanyaan itu.
Level River St
@steveverrill Anda memerlukan offset awal untuk itu karena akan ada lebih dari 4 buah yang dimulai pada baris pertama, sehingga Anda tidak dapat mengkodekannya ke base4. Dengan offset tambahan ini (mis. Yang 3#i.5mana 0 0 0 1 1 1 ... 4 4 4) itu bisa bekerja tetapi mungkin tidak akan lebih pendek (setidaknya cara saya mencoba).
randomra
2

Microscript II , 66 byte

Mari kita mulai dengan jawaban sederhana.

"00.@@@ccccF111//=---\n0...@@c))FFF1//8===-\n00.ttttt)))F1/8888=-"

Hore pencetakan tersirat.

SuperJedi224
sumber
1

Rubi

Rev 3, 55bytes

i=1
'S, OJ1*$HCH(#%0'.bytes{|e|puts "%x"%i+=e*130&9011}

Sebagai pengembangan lebih lanjut tentang ide Randomra, pertimbangkan output dan tabel perbedaan di bawah ini. Tabel perbedaan dapat dikompresi seperti sebelumnya, dan diperluas dengan mengalikan dengan 65 = binary 1000001 dan menerapkan topeng 11001100110011. Namun, Ruby tidak dapat diprediksi dengan karakter 8 bit (ia cenderung menafsirkannya sebagai Unicode.)

Anehnya, kolom terakhir seluruhnya sama. Karena itu, dalam kompresi kita dapat melakukan pengalihan hak pada data. Ini memastikan semua kode ASCII 7 bit. Dalam ekspansi, kita cukup mengalikan dengan 65 * 2 = 130 bukannya 65.

Kolom pertama juga seluruhnya genap. Karena itu kita dapat menambahkan 1 ke setiap elemen (32 ke setiap byte) jika perlu, untuk menghindari karakter kontrol. 1 yang tidak diinginkan dihapus dengan menggunakan mask 10001100110011 = 9011 sebagai gantinya 11001100110011.

Solution 59 of document linked in question

Start0001

Out  Diff
2223 2222
2433 0210
2433 0000
4445 2012
6555 2110
6577 0022
6687 0110
6887 0200
8897 2010
aa99 2202
caa9 2010
cab9 0010
cbbb 0102
cdbd 0202
cddd 0020

Meskipun saya menggunakan 15 byte untuk tabel, saya hanya benar-benar menggunakan 6 bit setiap byte, yang merupakan total 90 bit. Sebenarnya hanya ada 36 nilai yang mungkin untuk setiap byte, yang merupakan 2.21E23 kemungkinan secara total. Itu akan cocok dengan 77 bit entropi.

Rev 2, 58 byte, menggunakan pendekatan incremental Randomra

i=0
'UPEIP@bPHPBETTEPRADT'.bytes{|e|puts "%x"%i+=e*65&819}

Akhirnya, sesuatu yang lebih pendek dari solusi naif. Pendekatan incremental Randomra, dengan metode bytepacking dari Rev 1.

Rev 1, 72 byte, versi golf rev 0

Beberapa perubahan dilakukan pada baseline untuk mengakomodasi penyusunan ulang kode karena alasan bermain golf, tetapi masih masuk lebih lama daripada solusi naif.

i=0
'UPUIYD&!)$&V*).);c+*'.bytes{|e|i+=1;puts "%x"%(i/2*273+(e*65&819))}

Offset dikodekan ke dalam masing-masing karakter string sihir dalam basis 4 dalam format BAC, yaitu dengan 1 yang mewakili simbol tangan kanan, 16 yang mewakili simbol tengah, dan simbol kiri diseret ke posisi 4 itu. Untuk mengekstraknya, kode ascii dikalikan dengan 65 (biner 1000001) untuk diberikanBACBAC , kemudian di-anded dengan 819 (binary 1100110011) untuk diberikan.A.B.C .

Beberapa kode ascii memiliki set bit ke-7, yaitu mereka 64 lebih tinggi dari nilai yang diperlukan, untuk menghindari karakter kontrol. Karena bit ini dihapus oleh mask 819, ini tidak penting, kecuali ketika nilai C3, yang menyebabkan akumulasi. Ini harus diperbaiki di satu tempat saja (bukannya gkita harus menggunakanc .)

Rev 0, versi tidak dikoleksi

a= %w{000 010 000 201 100 100 011 021 110 120 011 112 111 221 211 221 122 123 112 222}
i=2
a.each{|e|puts "%x"%(i/2*273+e.to_i(16));i+=1} 

Keluaran

111
121
222
423
433
433
455
465
665
675
677
778
888
998
a99
aa9
abb
abc
bbc
ccc

Penjelasan

Dari solusi berikut, saya kurangi baseline, memberikan offset yang saya simpan sebagai data. Baseline diregenerasi sebagai angka heksadesimal dalam kode dengan i/2*273(273 desimal = 111 hex.)

solution   baseline   offset
AAA        AAA        000
ABA        AAA        010
BBB        BBB        000
DBC        BBB        201
DCC        CCC        100
DCC        CCC        100
DEE        DDD        011
DFE        DDD        021
FFE        EEE        110
FGE        EEE        120
FGG        FFF        011
GGH        FFF        112
HHH        GGG        111
IIH        GGG        221
JII        HHH        211
JJI        HHH        221
JKK        III        122
JKL        III        123
KKL        JJJ        112
LLL        JJJ        222
Level River St
sumber
Itu pada dasarnya terlihat seperti pendekatan yang sama dengan saya, tetapi Anda telah berhasil menghindari satu delta 4 yang memaksa saya untuk menyandikan di basis 5. Sepertinya saya memilih label yang salah untuk kepingan-kepingan itu.
Peter Taylor
Saya melihat jawaban Anda setelah saya memposting jawaban saya. Saya tidak bisa mengikuti Cjam, tetapi dari apa yang Anda katakan dalam jawaban Anda itu adalah pendekatan yang sama. Saya sebenarnya hanya memiliki satu 3di seluruh tabel (tepat di dekat bagian bawah) jadi saya pikir dengan meningkatkan garis dasar dengan sedikit lebih dari 0,5 setiap baris sebenarnya mungkin dimungkinkan untuk menggunakan basis 3. Jangan ragu untuk mencobanya. (Untuk alasan bermain golf, sepertinya saya harus mengubah baseline sedikit, yang memberi saya lebih banyak 3, dan sayangnya sepertinya akan lebih lama 1 byte daripada solusi naif di Ruby.)
Level River St
Jika saya tidak jelas sebelumnya, niat saya adalah untuk memberi selamat kepada Anda karena melakukan pekerjaan yang lebih baik daripada saya, bukan untuk menuduh Anda menyalin. Dan saya tidak akan mencoba menggunakan tingkat pertumbuhan 2,5 karena saya tidak berpikir itu akan mengalahkan pendekatan pengkodean perbedaan randomra.
Peter Taylor
@PeterTaylor terima kasih, saya mengerti Anda mengucapkan selamat kepada saya. Di sisi lain, Anda masuk pertama dengan ide yang pada dasarnya sama dan membuatnya jauh lebih pendek, jadi selamat untuk Anda juga. Dengan pendekatan perbedaan randomra akhirnya saya bisa mendapatkan lebih pendek dari solusi naif. Ini akan bekerja dengan baik pada 4x15 juga (mengingat tata letak pentomino yang tepat). Begitulah cara saya melakukannya dalam C atau bahasa lain yang bekerja dengan baik dengan string 8.bit. Karena Ruby mendukung unicode, ia mencoba menafsirkan string 8 bit sebagai unicode dan dapat memberikan beberapa pesan kesalahan yang menjengkelkan.
Level River St
0

Foo, 66 Bytes

"00.@@@ccccF111//=---\n0...@@c))FFF1//8===-\n00.ttttt)))F1/8888=-"
Teoc
sumber
Ini karakter-untuk-karakter yang identik dengan solusi Microscript II di atas ... Saya menganggap bahasa-bahasa ini terkait?
Darrel Hoffman
1
@DatrelHoffman tidak terlalu, foo pada dasarnya hanya mencetak semuanya dalam tanda kutip
Teoc