Напишите программу или функцию, которая не требует ввода, но печатает или возвращает постоянное текстовое изображение прямоугольника, состоящего из 12 различных пентомино :
Прямоугольник может иметь любые размеры и быть в любой ориентации, но все 12 пентомино должны использоваться ровно один раз, поэтому он будет иметь область 60. Каждое пентомино должно состоять из другого печатаемого символа ASCII (вам не нужно использовать письма сверху).
Например, если вы решили вывести это решение прямоугольника пентамино размером 20 × 3:
Вывод вашей программы может выглядеть примерно так:
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!!
Подойдет любое решение для прямоугольника, ваша программа должна напечатать только одно. (Завершающий перевод строки в выводе в порядке.)
Этот замечательный веб-сайт содержит множество решений для разных размеров прямоугольников, и, вероятно, стоит просмотреть их, чтобы убедиться, что ваше решение максимально короткое. Это код-гольф, выигрывает самый короткий ответ в байтах.
источник
Ответы:
Pyth, 37 байт
демонстрация
Использует очень простой подход: используйте шестнадцатеричные байты в качестве чисел. Преобразовать в шестнадцатеричное число, основание 256 кодировать это. Это дает волшебную строку выше. Чтобы декодировать, используйте основную функцию декодера Pyth 256, преобразуйте в шестнадцатеричный код, разделите на 4 фрагмента и соедините на новых строках.
источник
CJam (44 байта)
Задано в формате xxd, поскольку оно содержит управляющие символы (включая необработанную вкладку, которая очень плохо работает с MarkDown):
который декодирует что-то по линии
Слегка раскладываемая онлайн-демонстрация, которая не содержит управляющих символов и поэтому прекрасно сочетается с функциями библиотеки декодирования URI браузера.
Основной принцип заключается в том, что, поскольку ни один фрагмент не охватывает более 5 строк, мы можем компактно кодировать смещение от линейной функции номера строки (фактически, в базе 5, хотя я не пытался определить, будет ли это всегда так). ).
источник
Bash + общие утилиты Linux, 50
Чтобы воссоздать это из закодированного base64:
Поскольку существует 12 пентамино, их цвета легко кодируются в шестнадцатеричных блоках.
Выход:
источник
J, 49 байт
Вы можете выбрать буквы таким образом, чтобы максимальные приращения между вертикально смежными буквами были равны 2. Мы используем этот факт для кодирования вертикальных приращений в base3. После этого мы создаем текущие суммы и добавляем смещение, чтобы получить ASCII-коды букв.
Определенно гольф. (Мне еще предстоит найти способ ввода чисел base36 с повышенной точностью, но простой base36 должен сохранять только 3 байта.)
Выход:
Попробуйте это онлайн здесь.
источник
3#i.5
которое есть0 0 0 1 1 1 ... 4 4 4
) оно может работать, но, вероятно, не будет короче (по крайней мере, так, как я пытался).Microscript II , 66 байт
Начнем с простого ответа.
Ура неявной печати.
источник
Рубин
Rev 3, 55 байтов
В качестве дальнейшего развития идеи Рандомры рассмотрим таблицу результатов и различий ниже. Таблицу различий можно сжать, как и раньше, и расширить, умножив на 65 = двоичный код 1000001 и применив маску 11001100110011. Однако Ruby не работает предсказуемо с 8-битными символами (он обычно интерпретирует их как Unicode.)
Удивительно, но последний столбец полностью ровный. Из-за этого при сжатии мы можем выполнить смещение прав на данные. Это гарантирует, что все коды являются 7-битными ASCII. В расширении мы просто умножаем на 65 * 2 = 130 вместо 65.
Первый столбец также полностью ровный. Поэтому мы можем добавить 1 к каждому элементу (32 к каждому байту), где необходимо, чтобы избежать каких-либо управляющих символов. Ненужный 1 удаляется с помощью маски 10001100110011 = 9011 вместо 11001100110011.
Хотя я использую 15 байтов для таблицы, я действительно использую только 6 бит каждого байта, что в сумме составляет 90 бит. На самом деле существует только 36 возможных значений для каждого байта, что составляет в общей сложности 2,21E23. Это соответствовало бы 77 битам энтропии.
Rev 2, 58 байт, используя инкрементальный подход Рандомры
Наконец, что-то короче наивного решения. Инкрементальный подход Рандомры, с методом байтовой упаковки Rev 1.
Rev 1, 72 байта, версия для гольфа rev 0
Некоторые изменения были внесены в базовую линию, чтобы приспособить переупорядочение кода по причинам, связанным с игрой в гольф, но все же оно длится дольше, чем наивное решение.
Смещения кодируются в каждый символ магической строки в базе 4 в формате
BAC
, то есть с 1, представляющим правый символ, с 16, представляющим средний символ, и левым символом, вставленным в позицию 4. Чтобы извлечь их, код ascii умножается на 65 (двоичный код 1000001), чтобы получитьBACBAC
, затем он добавляется к 819 (двоичный код 1100110011), чтобы получить.A.B.C
.У некоторых из кодов ascii установлен 7-й бит, т.е. они на 64 больше, чем требуется, чтобы избежать управляющих символов. Поскольку этот бит удаляется маской 819, это несущественно, за исключением случаев, когда значение
C
равно 3, что вызывает перенос. Это должно быть исправлено только в одном месте (вместо тогоg
, чтобы использоватьc
.)Rev 0, версия без гольфа
Выход
объяснение
Из следующего решения я вычитаю базовую линию, давая смещение, которое я сохраняю как данные. Базовая линия восстанавливается в виде шестнадцатеричного числа в коде
i/2*273
(273 десятичных = 111 шестнадцатеричных).источник
3
таблица во всей таблице (прямо возле нижней части), поэтому я думаю, что, увеличив базовую линию чуть более чем на 0,5 каждой строки, можно фактически использовать базу 3. Не стесняйтесь попробовать это. (По причинам, связанным с игрой в гольф, мне кажется, мне придется немного изменить базовую линию, что дает мне больше 3-х, и, к сожалению, похоже, что она будет на 1 байт длиннее, чем простое решение в Ruby.)Foo, 66 байт
источник