Надрукуйте Пентоміно прямокутник


16

Напишіть програму або функцію, яка не вводить, але друкує або повертає постійне текстове зображення прямокутника, зробленого з 12 різних пентаміно :

12 пентоміно

Прямокутник може мати будь-які розміри і бути в будь-якій орієнтації, але всі 12 пентоміно повинні використовуватися точно один раз, тому він буде мати площу 60. Кожен різний пентоміно повинен складатися з іншого символу ASCII для друку (не потрібно використовувати листи зверху).

Наприклад, якщо ви вирішили вивести це рішення прямокутника прямокутника розміром 20 × 3:

3х20 розчин

Вихід програми може виглядати приблизно так:

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!!

Будь-яке рішення прямокутника зробить, вашій програмі потрібно лише роздрукувати його. (Закінчується новий рядок у висновку.)

Цей чудовий веб-сайт має безліч рішень для різних розмірів прямокутника, і, напевно, варто переглянути їх, щоб переконатися, що ваше рішення є якомога коротшим. Це код-гольф, найкоротша відповідь у байтах виграє.


15
Бонус, якщо це «королева» в Piet.
mbomb007

@ mbomb007 Це майже неможливо, лише грати з 12 блоками: P
Sp3000

Я не думаю, що на кордонах не можна допускати пробілів. Але оскільки вони є, чи можу я пропустити пробіли? Чи отримую я бонус, якщо надрукую вертикальне рішення розміром 5х12 з I в пробілі в кінці?
Джон Дворак

@ Sp3000, як щодо програми Piet, що складається повністю з прямокутників прямокутників?
Джон Дворак

@JanDvorak Ви не можете опустити пробіли, якщо вони є. Вони символи, як і решта ASCII для друку.
Захоплення Кальвіна

Відповіді:


1

Pyth, 37 байт

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

Демонстрація

Використовує дуже простий підхід: використовуйте шістнадцяткові байти як числа. Перетворити в шістнадцятковий номер, базовий 256 кодує це. Це дає чарівну струну вище. Щоб розшифрувати, використовуйте базову функцію декодера Pyth 256, перетворите на шістнадцятковий, розділіть на 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 + звичайні утиліти Linux, 50

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

Щоб відтворити це з кодованої base64:

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

Оскільки налічується 12 пентоміно, їх кольори легко кодуються в шістнадцяткові нибла.

Вихід:

$ ./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-кодів літер.

Однозначно пограбаючи. (Я ще не знаходжу способу ввести розширені цифри базових точок36, але проста база 36 повинна зберігати 3 байти.)

Вихід:

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

Спробуйте його онлайн тут.


Дуже хороша. При базовому кодуванні 256, що застосовує цю різницю, кодування в CJam дає 33 байти ( 48-байтна версія без b256 ).
Пітер Тейлор

Це круто! Він також би працював з 4x15, який би добре працював для упаковки чотирьох чисел у байт, якщо ви зберігаєте дані ширини, а не довжини. Вам знадобиться макет, у якому U-пентоміно виходить правильно. Посилань у питанні багато.
Річка Рівня Св.

@steveverrill Вам знадобиться стартовий зсув для цього, оскільки в першому рядку буде більше 4 штук, тому ви не можете їх кодувати в base4. З цим додатковим зміщенням (наприклад, 3#i.5яке є 0 0 0 1 1 1 ... 4 4 4) воно може працювати, але, ймовірно, не буде коротшим (принаймні так, як я намагався).
випадкові


1

Рубін

Вихід 3, 55 байт

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

Як подальший розвиток ідеї Randomra розглянемо таблицю результатів та різниці нижче. Таблицю різниць можна стиснути, як і раніше, і розширити, помноживши на 65 = двійковий 1000001 і застосувавши маску 11001100110011. Однак, Ruby не працює передбачувано з 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.

Ред 1, 72 байти, гольф-версія версії 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, тоді він anded з 819 (двійковий 1100110011), щоб дати .A.B.C.

Деякі коди ascii мають 7-й бітовий набір, тобто вони на 64 перевищують необхідне значення, щоб уникнути контрольних символів. Оскільки цей біт видаляється за допомогою маски 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. Схоже, я вибрав неправильну маркування для шматочків.
Пітер Тейлор

Я побачив вашу відповідь після того, як я розмістив свою. Я не можу слідувати за Cjam, але з того, що ви сказали у своїй відповіді, це схожий підхід. Насправді 3у всій таблиці є лише один (внизу внизу), тому я думаю, що збільшивши базову лінію трохи більше, ніж на 0,5, кожен рядок, можливо, можна використовувати базу 3. Спробуйте це. (З міркувань гольфу, здається, що мені доведеться трохи змінити базову лінію, що дає мені більше 3-х, і, на жаль, його виглядає як на 1 байт довше, ніж наївне рішення в Рубі.)
Level River St

Якщо я не був зрозумілий раніше, я мав намір привітати вас із виконанням кращої роботи, ніж я, а не звинуватити вас у копіюванні. І я не збираюся намагатися використовувати коефіцієнт зростання 2,5, тому що я не думаю, що це переможе підхід до кодування різниці випадкових випадків.
Пітер Тейлор

@PeterTaylor дякую, я зрозумів, що ти мене вітаєш. З іншого боку, ви вперше зібралися з тією ж ідеєю і зробили її набагато коротше, тож вітаю і вас. З підходом до різниці випадкових випадків я можу отримати коротше, ніж наївне рішення. Він би добре працював і в 4x15 (з огляду на правильний макет пентоміно). Саме так я б це робив на C або будь-якій іншій мові, яка добре працює з 8.bit рядками. Оскільки Ruby підтримує unicode, він намагається інтерпретувати 8-бітові рядки як unicode і може видавати деякі дратівливі повідомлення про помилки.
Рівень річки Св.

0

Foo, 66 байт

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

Це символ для символу, ідентичний рішенню Microscript II вище ... Я припускаю, що ці мови пов'язані?
Даррель Гофман

1
@DatrelHoffman не дуже, foo в основному просто друкує все в лапках
Teoc
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.