พิมพ์รูปสี่เหลี่ยมผืนผ้า Pentomino


16

เขียนโปรแกรมหรือฟังก์ชั่นที่จะใส่ไม่ แต่พิมพ์หรือผลตอบแทนคงที่ที่เป็นข้อความภาพของรูปสี่เหลี่ยมผืนผ้าที่ทำจาก 12 ที่แตกต่างกันpentominoes :

12 pentominoes

สี่เหลี่ยมอาจมีมิติใด ๆ และอยู่ในทิศทางใดก็ได้ แต่ต้องใช้ Pentomino ทั้ง 12 ตัวเพียงครั้งเดียวดังนั้นมันจะมีพื้นที่ 60. Pentomino แต่ละอันจะต้องประกอบด้วยอักขระ ASCII ที่พิมพ์ได้แตกต่างกัน(คุณไม่จำเป็นต้องใช้ ตัวอักษรจากด้านบน)

ตัวอย่างเช่นหากคุณเลือกที่จะแสดงผลวิธีการแก้ปัญหา pentomino rectangle 20 × 3 นี้:

วิธีการแก้ปัญหา 3x20

ผลลัพธ์ของโปรแกรมของคุณอาจมีลักษณะเช่นนี้:

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

หรือคุณอาจพบว่ามันง่ายกว่าสำหรับการเล่นกอล์ฟ 6 × 10 โซลูชันนี้:

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

โซลูชันรูปสี่เหลี่ยมผืนผ้าใด ๆ ที่จะทำโปรแกรมของคุณจะต้องพิมพ์เพียงอย่างเดียว (ขึ้นบรรทัดใหม่ในผลลัพธ์เป็นปกติ)

เว็บไซต์ที่ยอดเยี่ยมแห่งนี้มีโซลูชันมากมายสำหรับมิติต่างๆและน่าจะเป็นสิ่งที่ควรพิจารณาเพื่อให้แน่ใจว่าโซลูชันของคุณสั้นที่สุด นี่คือ code-golf คำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ


15
โบนัสหากเป็น "ควิน" ใน Piet
mbomb007

@ mbomb007 นั้นเป็นไปไม่ได้เลยที่จะเล่นกับ 12 บล็อกด้วย: P
Sp3000

ฉันไม่คิดว่าช่องว่างควรได้รับอนุญาตในชายแดน แต่เนื่องจากเป็นเช่นนั้นฉันสามารถละเว้นช่องว่างต่อท้ายได้หรือไม่ ฉันจะได้รับโบนัสหรือไม่ถ้าฉันพิมพ์โซลูชันแนวตั้งขนาด 5x12 ด้วยฉันหมดพื้นที่ในตอนท้าย?
John Dvorak

@ Sp3000 โปรแกรม Piet ประกอบไปด้วยโซลูชันเพนโตโนมิกสี่เหลี่ยมผืนผ้าอย่างไร
John Dvorak

@JanDvorak คุณไม่สามารถเว้นช่องว่างต่อท้ายได้หากคุณมี มันเป็นตัวละครเหมือนกับ ASCII ที่เหลือพิมพ์
งานอดิเรกของ Calvin

คำตอบ:


1

Pyth, 37 ไบต์

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

สาธิต

ใช้วิธีการที่ตรงไปตรงมามาก: ใช้เลขฐานสิบหกเป็นตัวเลข แปลงเป็นเลขฐานสิบหกเข้ารหัส 256 ฐาน ที่ให้สายมายากลด้านบน ในการถอดรหัสใช้ฟังก์ชันตัวถอดรหัส 256 ฐานของ Pyth แปลงเป็นเลขฐานสิบหกแบ่งเป็น 4 ชิ้นและเข้าร่วมในการขึ้นบรรทัดใหม่


5

CJam (44 ไบต์)

ได้รับในรูปแบบ xxd เพราะมันมีตัวควบคุม (รวมถึงแท็บดิบที่เล่นจริงๆไม่ดีกับ 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 

ซึ่งถอดรหัสบางอย่างตามแนวของ

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

การสาธิตออนไลน์ที่ไม่อัปเดตเล็กน้อยซึ่งไม่มีอักขระควบคุมและเล่นได้ดีกับฟังก์ชันการถอดรหัสไลบรารีเบราว์เซอร์ URI

หลักการพื้นฐานคือเนื่องจากไม่มีชิ้นส่วนใดยาวเกิน 5 แถวเราสามารถเข้ารหัสออฟเซ็ตจากฟังก์ชันเชิงเส้นของจำนวนแถวได้อย่างแน่นหนา (ในฐาน 5 ที่จริงแล้วแม้ว่าฉันจะไม่ได้พยายามระบุว่าสิ่งนี้จะเป็นกรณีนี้เสมอหรือไม่ )


5

Bash + utils Linux ทั่วไป, 50

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

ในการสร้างสิ่งนี้จากการเข้ารหัส base64:

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

เนื่องจากมีเพนโตโน 12 ตัวสีของมันจึงถูกเข้ารหัสได้อย่างง่ายดายใน hex nybbles

เอาท์พุท:

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

4

J, 49 ไบต์

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

คุณสามารถเลือกตัวอักษรในลักษณะที่การเพิ่มขึ้นสูงสุดระหว่างตัวอักษรที่อยู่ติดกันในแนวตั้งคือ 2 เราใช้ความจริงนี้เพื่อเข้ารหัสการเพิ่มขึ้นในแนวตั้งใน base3 หลังจากนั้นเราสร้างผลรวมสะสมและเพิ่มออฟเซ็ตเพื่อรับรหัส ASCII ของตัวอักษร

สามารถเล่นกอล์ฟได้อย่างแน่นอน (ฉันยังหาวิธีป้อนหมายเลข base36 ที่มีความแม่นยำเพิ่ม แต่ base36 แบบง่ายควรบันทึก 3 ไบต์เพียงอย่างเดียว)

เอาท์พุท:

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

ลองออนไลน์ได้ที่นี่


ดีมาก. ด้วยการเข้ารหัส base-256 ที่ใช้การเข้ารหัสที่แตกต่างนี้ใน CJam ให้ 33 ไบต์ ( รุ่น 48 ไบต์ไม่มี b256 )
ปีเตอร์เทย์เลอร์

นี่มันเจ๋งมาก! นอกจากนี้ยังใช้งานได้กับ 4x15 ซึ่งจะทำงานได้ดีสำหรับการบรรจุตัวเลขสี่ตัวเป็นไบต์หากคุณจัดเก็บความกว้างของข้อมูลมากกว่าความยาว คุณต้องการเลย์เอาต์ที่มี Pentomino U หันหน้าไปทางที่ถูกต้อง มีคำถามมากมายในลิงค์นี้
เลเวลริเวอร์

@steveverrill คุณจะต้องเริ่มต้นออฟเซ็ตสำหรับสิ่งนั้นเนื่องจากจะมีมากกว่า 4 ชิ้นเริ่มต้นที่บรรทัดแรกดังนั้นคุณไม่สามารถเขียนรหัสเหล่านั้นลงใน base4 ได้ ด้วยออฟเซ็ตพิเศษ (เช่น3#i.5ที่0 0 0 1 1 1 ... 4 4 4) มันสามารถทำงานได้ แต่อาจจะไม่สั้นลง (อย่างน้อยฉันก็ลอง)
randomra


1

ทับทิม

Rev 3, 55bytes

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

ในการพัฒนาเพิ่มเติมเกี่ยวกับแนวคิดของ Randomra ให้พิจารณาผลลัพธ์และตารางความแตกต่างด้านล่าง ตารางความแตกต่างสามารถบีบอัดได้เหมือนก่อนและขยายโดยการคูณด้วย 65 = ไบนารี 1000001 และใช้รูปแบบ 11001100110011 อย่างไรก็ตามทับทิมไม่สามารถคาดเดาได้ด้วยอักขระ 8 บิต (มันมีแนวโน้มที่จะตีความว่าเป็น Unicode)

น่าแปลกที่คอลัมน์สุดท้ายยังมีความเท่าเทียมกัน ด้วยเหตุนี้ในการบีบอัดข้อมูลเราจึงสามารถทำการเลื่อนสิทธิบนข้อมูลได้ สิ่งนี้ทำให้มั่นใจว่ารหัสทั้งหมดเป็น 7 บิต ASCII ในการขยายตัวเราเพียงคูณด้วย 65 * 2 = 130 แทน 65

คอลัมน์แรกยังมีความเท่าเทียมกัน ดังนั้นเราสามารถเพิ่ม 1 ในแต่ละองค์ประกอบ (32 ถึงแต่ละไบต์) ตามความจำเป็นเพื่อหลีกเลี่ยงอักขระควบคุมใด ๆ 1 ที่ไม่ต้องการถูกลบออกโดยใช้มาสก์ 10001100110011 = 9011 แทน 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

แม้ว่าฉันจะใช้ 15 ไบต์สำหรับตาราง แต่ฉันใช้เพียง 6 บิตของแต่ละไบต์ซึ่งรวมเป็น 90 บิต ในความเป็นจริงมีเพียง 36 ค่าที่เป็นไปได้สำหรับแต่ละไบต์ซึ่งเป็น 2.21E23 ทั้งหมด นั่นจะพอดีกับ 77 บิตของเอนโทรปี

Rev 2, 58 ไบต์โดยใช้วิธีการเพิ่มเติมของ Randomra

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

ในที่สุดสิ่งที่สั้นกว่าโซลูชันไร้เดียงสา วิธีการเพิ่มของ Randomra ด้วยวิธี bytepacking ของ Rev 1

Rev 1, 72 ไบต์, golfed เวอร์ชัน rev 0

การเปลี่ยนแปลงบางอย่างเกิดขึ้นกับพื้นฐานเพื่อรองรับการจัดเรียงรหัสใหม่เพื่อเหตุผลด้านการเล่นกอล์ฟ

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

ออฟเซ็ตจะถูกเข้ารหัสเป็นอักขระแต่ละตัวของสตริงมายากลในรูปแบบฐานที่ 4 BACนั่นคือสัญลักษณ์ 1 หมายถึงสัญลักษณ์มือขวายุค 16 แทนสัญลักษณ์กลางและสัญลักษณ์เลฟธานด์ที่อยู่ในตำแหน่ง 4 ในการที่จะดึงมันออกมารหัส ASCII จะถูกคูณด้วย 65 (ไบนารี 1000001) เพื่อให้BACBACจากนั้นมันจะเป็น 819 (ไบนารี 1100110011) เพื่อให้.A.B.Cเพื่อให้

รหัส ascii บางตัวมีการตั้งค่าบิตที่ 7 นั่นคือ 64 สูงกว่าค่าที่ต้องการเพื่อหลีกเลี่ยงอักขระควบคุม เนื่องจากบิตนี้ถูกลบโดย mask 819 สิ่งนี้จึงไม่สำคัญยกเว้นเมื่อค่าของCคือ 3 ซึ่งทำให้เกิดการพกพา สิ่งนี้จะต้องได้รับการแก้ไขในที่เดียวเท่านั้น (แทนที่จะgต้องใช้c)

Rev 0 เวอร์ชันที่ไม่ดี

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} 

เอาท์พุต

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

คำอธิบาย

จากวิธีแก้ปัญหาต่อไปนี้ฉันลบพื้นฐานให้ออฟเซ็ตที่ฉันเก็บเป็นข้อมูล ข้อมูลพื้นฐานถูกสร้างใหม่เป็นเลขฐานสิบหกในรหัสโดยi/2*273(273 ทศนิยม = 111 ฐานสิบ)

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

ดูเหมือนว่าเป็นแนวทางเดียวกับของฉัน แต่คุณสามารถหลีกเลี่ยงเดลต้าเดียวของ 4 ที่บังคับให้ฉันเข้ารหัสในฐาน 5 ดูเหมือนว่าฉันเลือกการติดฉลากผิดสำหรับชิ้นส่วน
Peter Taylor

ฉันเห็นคำตอบของคุณหลังจากโพสต์ของฉัน ฉันไม่สามารถติดตาม Cjam ได้ แต่จากสิ่งที่คุณพูดในคำตอบของคุณมันเป็นแนวทางที่คล้ายกัน จริง ๆ แล้วฉันมีเพียงหนึ่งเดียว3ในตารางทั้งหมด (ใกล้ด้านล่าง) ดังนั้นฉันคิดว่าการเพิ่มพื้นฐานโดยมากกว่า 0.5 เล็กน้อยทุกบรรทัดมันอาจเป็นไปได้ที่จะใช้ฐาน 3 จริง ๆ ลองใช้ดูก็ได้ (สำหรับเหตุผลเกี่ยวกับการเล่นกอล์ฟดูเหมือนว่าฉันจะต้องเปลี่ยนพื้นฐานเล็กน้อยซึ่งทำให้ฉันค่อนข้างมากกว่า 3 และน่าเสียดายที่มันดูเหมือนว่ามันจะเป็น 1 ไบต์นานกว่าโซลูชันไร้เดียงสาใน Ruby)
Level River St

ในกรณีที่ฉันยังไม่ชัดเจนก่อนหน้านี้ความตั้งใจของฉันคือการแสดงความยินดีกับคุณในการทำงานที่ดีขึ้นกว่าฉันไม่ได้ที่จะกล่าวหาคุณในการคัดลอก และฉันจะไม่ลองใช้อัตราการเติบโต 2.5 เพราะฉันไม่คิดว่ามันจะเอาชนะวิธีการเข้ารหัสที่ต่างกันของ randomra
ปีเตอร์เทย์เลอร์

@ PeterTaylor ขอบคุณฉันได้รับสิ่งที่คุณแสดงความยินดีกับฉัน ในทางกลับกันคุณได้แนวคิดแรกมาจากแนวคิดเดียวกันและทำให้สั้นลงไปอีกมากดังนั้นขอแสดงความยินดีกับคุณเช่นกัน ด้วยวิธีการที่ต่างกันของ randomra ในที่สุดฉันก็สามารถสั้นกว่าโซลูชันที่ไร้เดียงสาได้ มันจะทำงานได้ดีที่ 4x15 เช่นกัน (ตามรูปแบบ pentomino ด้านขวา) นั่นเป็นวิธีที่ฉันจะทำใน C หรือภาษาอื่น ๆ ที่ทำงานได้ดีกับ 8.bit strings เนื่องจาก Ruby รองรับยูนิโค้ดจึงพยายามตีความสตริง 8 บิตเป็นยูนิโค้ดและสามารถให้ข้อความผิดพลาดที่น่ารำคาญได้
เลเวลริเวอร์เซนต์

0

Foo, 66 ไบต์

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

นี่เป็นตัวอักษรสำหรับตัวละครเหมือนกับโซลูชัน Microscript II ด้านบน ... ฉันคิดว่าภาษาเหล่านี้เกี่ยวข้องกันหรือไม่
Darrel Hoffman

1
@DatrelHoffman ไม่ได้จริงๆ foo เพียงพิมพ์ทุกอย่างด้วยเครื่องหมายคำพูด
Teoc
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.