Pentomino Dikdörtgen Yazdır


16

12 farklı pentominodan yapılmış bir dikdörtgenin sabit bir metin tasvirini basan veya döndüren bir program veya işlev yazın :

12 pentomino

Dikdörtgen herhangi bir boyuta sahip olabilir ve herhangi bir yönde olabilir, ancak 12 pentomino'nun tamamı bir kez kullanılmalıdır, bu nedenle alan 60 olacaktır. Her farklı pentomino farklı bir yazdırılabilir ASCII karakterinden oluşmalıdır ( Yukarıdaki harfler).

Örneğin, bu 20 × 3 pentomino dikdörtgen çözümünü çıkarmayı seçtiyseniz:

3x20 çözümü

Programınızın çıktısı şöyle görünebilir:

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

Alternatif olarak, bu 6 × 10 çözümü golf oynamak daha kolay olabilir:

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

Herhangi bir dikdörtgen çözümü yapar, programınızın sadece bir tane yazdırması gerekir. (Çıktının sonundaki satırsonu iyi.)

Bu harika web sitesi , çeşitli dikdörtgen boyutlar için bir sürü çözüm içeriyor ve muhtemelen çözümünüzün mümkün olduğunca kısa olduğundan emin olmak için bunlara göz atmaya değer. Bu kod golfü, bayttaki en kısa cevap kazanıyor.


15
Piet'de bir "quine" ise bonus.
mbomb007

@ mbomb007 Bu, oynamak için sadece 12 blok ile neredeyse imkansız: P
Sp3000 10:15

Sınırlarda boşluk bırakılması gerektiğini düşünmüyorum. Ama oldukları için arka boşlukları atlayabilir miyim? Sonunda boşluklar I olan dikey bir 5x12 çözüm yazdırırsam bonus alır mıyım?
John Dvorak

@ Sp3000 tamamen pentomino dikdörtgen çözümlerinden oluşan bir Piet programına ne dersiniz?
John Dvorak

@JanDvorak Varsa arka boşlukları atlayamazsınız. Bunlar yazdırılabilir ASCII'nin geri kalanı gibi karakterler.
Calvin'in Hobileri

Yanıtlar:


1

Pyth, 37 bayt

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

gösteri

Çok basit bir yaklaşım kullanır: Sayı olarak onaltılık bayt kullanın. Onaltılık sayıya dönüştürün, taban 256 bunu kodlayın. Bu yukarıdaki sihirli ipi verir. Kod çözmek için Pyth'in temel 256 kod çözücü işlevini kullanın, onaltılık biçime dönüştürün, 4 parçaya bölün ve yeni satırlara katılın.


5

CJam (44 bayt)

Kontrol karakterleri içerdiğinden ( MarkDown ile gerçekten kötü oynayan ham bir sekme dahil ) xxd biçiminde verilir:

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 

hangi çizgiler boyunca bir şey kod çözme

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

Kontrol karakterleri içermeyen ve bu nedenle tarayıcı URI kod çözme kitaplığı işlevleriyle güzelce oynayan biraz ungolfed çevrimiçi demo .

Temel ilke, hiçbir parça 5 satırdan fazla yayılmadığından, satır numarasının doğrusal bir fonksiyonundan bir ofseti kompakt bir şekilde kodlayabileceğimizdir (aslında, taban 5'te, aslında, bunun her zaman böyle olup olmayacağını belirlemeye çalışmamış olsam da) ).


5

Bash + yaygın Linux araçları, 50

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

Bunu kodlanmış base64'ten yeniden oluşturmak için:

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

12 pentomino olduğundan, renkleri kolayca altıgen nybble olarak kodlanır.

Çıktı:

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

4

J, 49 bayt

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

Harfleri, dikey olarak bitişik harfler arasındaki maksimum artışların 2 olacağı şekilde seçebilirsiniz. Bu gerçeği, base3'teki dikey artışları kodlamak için kullanırız. Bundan sonra, toplamları yaratırız ve harflerin ASCII kodlarını almak için bir ofset ekleriz.

Kesinlikle golf edilebilir. (Henüz genişletilmiş hassas base36 sayılarını girmenin bir yolunu bulamıyorum ancak basit base36 yalnızca 3 bayt kaydetmelidir.)

Çıktı:

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

Burada çevrimiçi deneyin.


Çok hoş. CJam'de bu fark kodlamasını uygulayan baz-256 kodlaması ile 33 bayt verir ( b256'sız 48 bayt versiyonu ).
Peter Taylor

Bu harika! Ayrıca, uzunlukları yerine veri genişliklerini depolarsanız, dört sayıyı bir bayta paketlemek için iyi çalışan 4x15 ile de çalışır. U pentomino'nun doğru yöne baktığı bir düzene ihtiyacınız olacaktır. Sorudaki bağlantıda bol miktarda var.
Level River St

@steveverrill Bunun için bir başlangıç ​​ofsetine ihtiyacınız olacaktır, çünkü ilk satırda başlayan 4'ten fazla parça olacaktır, bu yüzden bunları base4'e kodlayamazsınız. Bu ekstra ofset ile (örneğin 3#i.5hangi 0 0 0 1 1 1 ... 4 4 4) o çalışabilir ama muhtemelen (en azından yolu denedim) daha kısa olmayacaktır.
randomra

2

Microscript II , 66 bayt

Basit cevapla başlayalım.

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

Yaşasın örtük baskı.


1

Yakut

Rev 3, 55 bayt

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

Randomra'nın fikri hakkında daha fazla bir gelişme olarak, aşağıdaki çıktı ve fark tablosunu göz önünde bulundurun. Fark tablosu daha önce olduğu gibi sıkıştırılabilir ve 65 = ikili 1000001 ile çarpılarak ve 11001100110011 maskesi uygulanarak genişletilebilir. Ancak, Ruby 8 bit karakterlerle tahmin edilebilir şekilde çalışmaz (bunları Unicode olarak yorumlama eğilimindedir).

Şaşırtıcı bir şekilde, son sütun tamamen eşittir. Bu nedenle, sıkıştırmada veriler üzerinde bir hak kayması gerçekleştirebiliriz. Bu, tüm kodların 7 bit ASCII olmasını sağlar. Genişlemede 65 yerine 65 * 2 = 130 ile çarpıyoruz.

İlk sütun tamamen eşittir. Bu nedenle, kontrol karakterlerinden kaçınmak için gerektiğinde her bir öğeye 1 (her bayta 32) ekleyebiliriz. İstenmeyen 1, 11001100110011 yerine 10001100110011 = 9011 maskesi kullanılarak çıkarılır.

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

Tablo için 15 bayt kullanmama rağmen, her baytın yalnızca 6 bitini kullanıyorum, bu da toplam 90 bit. Aslında her bayt için sadece 36 olası değer vardır, bu toplamda 2.21E23 olasılıktır. Bu, 77 bit entropi için uygundur.

Rev 2, 58 bayt, Randomra'nın artımlı yaklaşımını kullanarak

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

Son olarak, saf çözeltiden daha kısa bir şey. Revra'nın bytepackleme yöntemi ile Randomra'nın artımlı yaklaşımı.

Rev 1, 72 bayt, rev 0'ın golf versiyonu

Golf nedenleriyle kodun yeniden düzenlenmesini sağlamak için taban çizgisinde bazı değişiklikler yapıldı, ancak yine de naif çözümden daha uzun sürdü.

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

Ofsetler, tabandaki 4 sihirli dizginin her karakterine formatta kodlanır BAC, yani 1'ler sağ simgeyi temsil eder, 16'lar orta simgeyi temsil eder ve sol sembol 4'lerin pozisyonuna sokulur. Onları çıkarmak için, ascii kodu vermek için 65 (ikili 1000001) ile çarpılır BACBAC, daha sonra vermek için 819 (ikili 1100110011) ile anded edilir .A.B.C.

Bazı ascii kodları 7. bit setine sahiptir, yani kontrol karakterlerinden kaçınmak için gerekli değerden 64 daha yüksektir. Bu bit, maske 819 tarafından kaldırıldığı için, değerinin C3 olması dışında bir aktarmaya neden olan durum hariç, bu önemsizdir . Bu sadece bir yerde düzeltilmelidir (kullanmak gzorundayız yerine c).

Rev 0, desteksiz versiyon

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} 

Çıktı

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

açıklama

Aşağıdaki çözümden, veri olarak sakladığım ofseti vererek taban çizgisini çıkarıyorum. Taban çizgisi, kodda onaltılı bir sayı olarak i/2*273(273 ondalık = 111 hex) olarak yeniden oluşturulur.

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

Bu aslında benimkiyle aynı yaklaşıma benziyor, ancak beni temel 5'te kodlamaya zorlayan 4'ün tek deltasından kaçınmayı başardınız. Görünüşe göre parçalar için yanlış etiketlemeyi seçtim.
Peter Taylor

Cevabımı, benimkini yayınladıktan sonra gördüm. Cjam'ı takip edemem, ancak cevabınızda söylediklerinizden benzer bir yaklaşım. Aslında 3tüm tablonun içinde tek bir tane var (sağ altta) bu yüzden taban çizgisini her satırda 0,5'ten biraz artırarak baz 3'ü kullanmak mümkün olabileceğini düşünüyorum. Bunu denemekten çekinmeyin. (Golf nedenlerinden ötürü, taban çizgisini biraz değiştirmek zorunda kalacağım, bu da bana daha fazla 3 veriyor ve maalesef Ruby'deki naif çözümden 1 bayt daha uzun olacak gibi görünüyor.)
Level River St

Daha önce net olmasaydım, niyetim sizi kopyalamakla suçlamak değil, benden daha iyi bir iş yaptığınız için sizi tebrik etmekti. Ve 2.5 büyüme hızını kullanmayacağım çünkü randomra'nın fark kodlama yaklaşımını yeneceğini düşünmüyorum.
Peter Taylor

@PeterTaylor teşekkürler, beni tebrik ettiğini anladım. Öte yandan, temelde aynı fikri ilk aldınız ve çok daha kısalttınız, bu yüzden sizi de tebrik ediyoruz. Randomra'nın fark yaklaşımı ile nihayet naif çözümden daha kısa olabilirim. 4x15 de iyi çalışır (doğru pentomino düzeni göz önüne alındığında). Ben C ya da 8.bit dizeleri ile iyi çalışan herhangi bir dilde yapmak böyle. Ruby unicode'u desteklediğinden, 8 bit dizeleri unicode olarak yorumlamaya çalışır ve bazı can sıkıcı hata mesajları verebilir.
Level River St

0

Foo, 66 Bayt

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

Bu karakter için karakter yukarıdaki Microscript II çözümü ile aynıdır ... Bu dillerin ilişkili olduğunu varsayalım?
Darrel Hoffman

1
@DatrelHoffman gerçekten değil, foo temelde her şeyi tırnak içinde yazdırır
Teoc
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.