In một hình chữ nhật Pentomino


16

Viết chương trình hoặc hàm không có đầu vào nhưng in hoặc trả về mô tả văn bản không đổi của một hình chữ nhật được tạo từ 12 hình ngũ giác riêng biệt :

12 hình ngũ giác

Hình chữ nhật có thể có bất kỳ kích thước nào và theo bất kỳ hướng nào, nhưng tất cả 12 hình ngũ giác phải được sử dụng chính xác một lần, do đó, nó sẽ có diện tích 60. Mỗi pentomino khác nhau phải được tạo thành từ một ký tự ASCII có thể in khác nhau (bạn không cần sử dụng chữ cái ở trên).

Ví dụ: nếu bạn chọn xuất giải pháp hình chữ nhật pentomino 20 × 3 này:

Giải pháp 3x20

Đầu ra của chương trình của bạn có thể trông giống như thế này:

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

Ngoài ra, bạn có thể thấy dễ dàng hơn khi chơi giải pháp 6 × 10 này:

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

Bất kỳ giải pháp hình chữ nhật sẽ làm, chương trình của bạn chỉ cần in một. (Một dòng mới ở đầu ra là tốt.)

Trang web tuyệt vời này có vô số giải pháp cho các kích thước hình chữ nhật khác nhau và có lẽ đáng để duyệt chúng để đảm bảo giải pháp của bạn càng ngắn càng tốt. Đây là code-golf, câu trả lời ngắn nhất trong byte thắng.


15
Tiền thưởng nếu đó là một "câu đố" trong Piet.
mbomb007

@ mbomb007 Điều đó khá là không thể với chỉ 12 khối để chơi với: P
Sp3000

Tôi không nghĩ rằng không gian nên được cho phép trên biên giới. Nhưng vì chúng là, tôi có thể bỏ qua dấu cách không? Tôi có nhận được tiền thưởng nếu tôi in một giải pháp 5x12 dọc với chữ I ở ngoài không gian không?
John Dvorak

@ Sp3000 làm thế nào về một chương trình Piet bao gồm hoàn toàn các giải pháp hình chữ nhật pentomino?
John Dvorak

@JanDvorak Bạn không thể bỏ qua dấu cách nếu bạn có chúng. Họ là những nhân vật giống như phần còn lại của ASCII có thể in được.
Sở thích của Calvin

Câu trả lời:


1

Bình thường, 37 byte

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

Trình diễn

Sử dụng một cách tiếp cận rất đơn giản: Sử dụng byte hex làm số. Chuyển đổi thành số hex, cơ sở 256 mã hóa đó. Điều đó cho chuỗi ma thuật ở trên. Để giải mã, sử dụng chức năng giải mã 256 cơ sở của Pyth, chuyển đổi thành hex, chia thành 4 khối và tham gia vào các dòng mới.


5

CJam (44 byte)

Được cung cấp ở định dạng xxd vì nó chứa các ký tự điều khiển (bao gồm cả tab thô, hoạt động rất tệ với 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 

mà giải mã một cái gì đó dọc theo dòng

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

Bản demo trực tuyến hơi vô văn hóa không chứa các ký tự điều khiển và do đó chơi độc đáo với các chức năng thư viện giải mã URI của trình duyệt.

Nguyên tắc cơ bản là vì không có phần nào kéo dài hơn 5 hàng, chúng ta có thể mã hóa phần bù từ hàm tuyến tính của số hàng một cách gọn gàng (trên thực tế, trong cơ sở 5, mặc dù tôi đã cố gắng xác định liệu điều này có luôn luôn như vậy không ).


5

Bash + dụng cụ Linux phổ biến, 50

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

Để tạo lại điều này từ cơ sở được mã hóa64:

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

Vì có 12 hình ngũ giác, màu sắc của chúng dễ dàng được mã hóa thành các hình lục giác.

Đầu ra:

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

4

J, 49 byte

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

Bạn có thể chọn các chữ cái theo cách tăng tối đa giữa các chữ cái liền kề theo chiều dọc là 2. Chúng tôi sử dụng thực tế này để mã hóa số gia dọc trong cơ sở3. Sau đó, chúng tôi tạo ra các khoản tiền đang chạy và thêm một phần bù để lấy mã ASCII của các chữ cái.

Chắc chắn là golf. (Tôi vẫn chưa tìm được cách nhập số cơ sở chính xác mở rộng 36 nhưng cơ sở đơn giản 36 chỉ nên lưu 3 byte.)

Đầu ra:

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

Hãy thử trực tuyến tại đây.


Rất đẹp. Với mã hóa cơ sở 256 áp dụng mã hóa khác biệt này trong CJam cho ra 33 byte ( phiên bản 48 byte không có b256 ).
Peter Taylor

Điều này thật tuyệt! Nó cũng sẽ hoạt động với 4x15, hoạt động tốt để đóng gói bốn số vào một byte, nếu bạn lưu trữ chiều rộng dữ liệu thay vì chiều dài. Bạn sẽ cần một bố cục có pentomino chữ U hướng đúng. Có rất nhiều trong liên kết tại câu hỏi.
Cấp sông St

@steveverrill Bạn sẽ cần một phần bù bắt đầu cho điều đó bởi vì sẽ có hơn 4 phần bắt đầu trên dòng đầu tiên, vì vậy bạn không thể mã hóa chúng thành cơ sở4. Với phụ này bù đắp (ví dụ 3#i.5đó là 0 0 0 1 1 1 ... 4 4 4) nó có thể làm việc nhưng có lẽ sẽ không thể ngắn hơn (ít nhất là cách tôi cố gắng).
Randomra

2

Kính hiển vi II , 66 byte

Hãy bắt đầu với câu trả lời đơn giản.

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

Hoan hô in ấn ngầm.


1

Hồng ngọc

Rev 3, 55byte

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

Là một sự phát triển hơn nữa về ý tưởng của Randomra, hãy xem xét bảng đầu ra và sự khác biệt dưới đây. Bảng khác biệt có thể được nén như trước và được mở rộng bằng cách nhân với 65 = nhị phân 1000001 và áp dụng mặt nạ 11001100110011. Tuy nhiên, Ruby không hoạt động có thể dự đoán được với các ký tự 8 bit (nó có xu hướng diễn giải chúng là Unicode.)

Đáng ngạc nhiên, cột cuối cùng là hoàn toàn thậm chí. Do đó, trong quá trình nén, chúng tôi có thể thực hiện quyền chuyển đổi dữ liệu. Điều này đảm bảo tất cả các mã là 7 bit ASCII. Trong mở rộng, chúng tôi chỉ cần nhân với 65 * 2 = 130 thay vì 65.

Cột đầu tiên cũng hoàn toàn đồng đều. Do đó, chúng ta có thể thêm 1 cho mỗi phần tử (32 cho mỗi byte) khi cần thiết, để tránh mọi ký tự điều khiển. 1 không mong muốn được loại bỏ bằng cách sử dụng mặt nạ 10001100110011 = 9011 thay vì 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

Mặc dù tôi sử dụng 15 byte cho bảng, tôi chỉ thực sự sử dụng 6 bit của mỗi byte, tổng cộng là 90 bit. Thực tế, chỉ có 36 giá trị có thể có cho mỗi byte, tổng cộng là 2,21E23. Điều đó sẽ phù hợp với 77 bit của entropy.

Rev 2, 58 byte, sử dụng phương pháp gia tăng của Randomra

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

Cuối cùng, một cái gì đó ngắn hơn giải pháp ngây thơ. Cách tiếp cận gia tăng của Randomra, với phương pháp khai thác của Rev 1.

Rev 1, 72 byte, phiên bản golf của rev 0

Một số thay đổi đã được thực hiện cho đường cơ sở để phù hợp với việc sắp xếp lại mã cho các lý do chơi gôn, nhưng vẫn còn lâu hơn giải pháp ngây thơ.

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

Các độ lệch được mã hóa thành từng ký tự của chuỗi ma thuật ở định dạng cơ sở 4 BAC, tức là với số 1 đại diện cho biểu tượng tay phải, số 16 đại diện cho biểu tượng ở giữa và biểu tượng bên trái được đặt vào vị trí của 4. Để trích xuất chúng, mã ascii được nhân với 65 (nhị phân 1000001) để cung cấp BACBAC, sau đó nó được gắn với 819 (nhị phân 1100110011) để cung cấp .A.B.C.

Một số mã ascii có tập bit thứ 7, tức là chúng cao hơn 64 so với giá trị bắt buộc, để tránh các ký tự điều khiển. Bởi vì bit này được loại bỏ bởi mặt nạ 819, điều này là không quan trọng, ngoại trừ khi giá trị Clà 3, gây ra sự chuyển giao. Điều này phải được sửa ở một nơi duy nhất (thay vì gchúng ta phải sử dụng c.)

Rev 0, phiên bản chưa được chỉnh sửa

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} 

Đầu ra

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

Giải trình

Từ giải pháp sau đây, tôi trừ đường cơ sở, đưa ra phần bù mà tôi lưu trữ dưới dạng dữ liệu. Đường cơ sở được tái tạo thành một số thập lục phân trong mã theo i/2*273(273 thập phân = 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

Trông giống như cách tiếp cận của tôi, nhưng bạn đã tránh được đồng bằng 4 khiến tôi phải mã hóa trong cơ sở 5. Có vẻ như tôi đã chọn sai nhãn cho các mảnh.
Peter Taylor

Tôi thấy câu trả lời của bạn sau khi tôi đăng bài của tôi. Tôi không thể theo dõi Cjam, nhưng từ những gì bạn nói trong câu trả lời của bạn, đó là một cách tiếp cận tương tự. Tôi thực sự chỉ có một cái duy nhất 3trong toàn bộ bảng (ngay gần dưới cùng) vì vậy tôi nghĩ bằng cách tăng đường cơ sở lên hơn 0,5 mỗi dòng, thực sự có thể sử dụng cơ sở 3. Hãy thử nó. (Vì lý do chơi gôn, có vẻ như tôi sẽ phải thay đổi đường cơ sở một chút, điều này mang lại cho tôi nhiều hơn 3 giây, và thật không may, nó trông giống như nó sẽ dài hơn 1 byte so với giải pháp ngây thơ trong Ruby.)
Level River St

Trong trường hợp tôi không rõ ràng sớm hơn, ý định của tôi là chúc mừng bạn đã làm một công việc tốt hơn tôi, không buộc tội bạn sao chép. Và tôi sẽ không thử sử dụng tốc độ tăng trưởng 2,5 vì tôi không nghĩ nó sẽ đánh bại phương pháp mã hóa khác biệt của Randomra.
Peter Taylor

@PeterTaylor cảm ơn, tôi đã nhận được rằng bạn đang chúc mừng tôi. Mặt khác, bạn đã tham gia đầu tiên với ý tưởng cơ bản giống nhau và làm cho nó ngắn hơn nhiều, vì vậy cũng xin chúc mừng bạn. Với cách tiếp cận khác biệt của Randomra cuối cùng tôi có thể rút ngắn hơn giải pháp ngây thơ. Nó cũng hoạt động tốt ở 4x15 (được bố trí đúng pentomino). Đó là cách tôi làm bằng C hoặc bất kỳ ngôn ngữ nào hoạt động tốt với chuỗi 8.bit. Vì Ruby hỗ trợ unicode, nó cố gắng diễn giải các chuỗi 8 bit là unicode và có thể đưa ra một số thông báo lỗi gây phiền nhiễu.
Cấp sông St

0

Foo, 66 byte

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

Đây là ký tự cho từng ký tự giống hệt với giải pháp microscript II ở trên ... Tôi cho rằng các ngôn ngữ này có liên quan?
Darrel Hoffman

1
@DatrelHoffman không thực sự, foo về cơ bản chỉ in mọi thứ trong ngoặc kép
Teoc
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.