В 2014 году демосценер Jakub 'Ilmenit' Debski выпустил демонстрационную процедурную графическую схему объемом 250 байт (1) для Atari XL под названием Mona . Это рисует следующую картину (2) :
Ваша задача - создать точно такую же картинку, используя язык по вашему выбору.
(1) Разбивка: 136 байтов данных + 114 байтов кода.
(2) Исходное изображение 128х96. Вышеуказанная версия была увеличена до 256x192. Несколько пикселей отличаются от оригинала, но это ожидаемый результат с псевдокодом, описанным в этой задаче.
Как?
Это код-гольф . Хотя вы имеете право использовать любой метод, наилучшие результаты, скорее всего, будут достигнуты при использовании оригинального алгоритма, который описан ниже.
NB . Этот абзац не является спецификацией, а скорее общим описанием. Пожалуйста, обратитесь к псевдокоду и справочной реализации для деталей алгоритма.
Изображение состоит из 64 псевдослучайных мазков кисти ( см. Это видео ) с циклическим переключением следующих цветов (в шестнадцатеричном формате RRGGBB):
COLOR = [ 0xFFE289, 0xE99E45, 0xA55A00, 0x000000 ]
Фон изначально заполнен 4-м цветом (черный). Каждый ход короче предыдущего.
Псевдослучайный генератор использует регистр сдвига с линейной обратной связью (LFSR) для 32-разрядного целого числа, изначально установленного в 0x7EC80000
XOR и с 0x04C11DB7
.
Каждый штрих инициализируется 16-битным значением, которое перезаписывает младшие байты начального числа:
BRUSH = [
0x030A, 0x37BE, 0x2F9B, 0x072B, 0x0E3C, 0xF59B, 0x8A91, 0x1B0B,
0x0EBD, 0x9378, 0xB83E, 0xB05A, 0x70B5, 0x0280, 0xD0B1, 0x9CD2,
0x2093, 0x209C, 0x3D11, 0x26D6, 0xDF19, 0x97F5, 0x90A3, 0xA347,
0x8AF7, 0x0859, 0x29AD, 0xA32C, 0x7DFC, 0x0D7D, 0xD57A, 0x3051,
0xD431, 0x542B, 0xB242, 0xB114, 0x8A96, 0x2914, 0xB0F1, 0x532C,
0x0413, 0x0A09, 0x3EBB, 0xE916, 0x1877, 0xB8E2, 0xAC72, 0x80C7,
0x5240, 0x8D3C, 0x3EAF, 0xAD63, 0x1E14, 0xB23D, 0x238F, 0xC07B,
0xAF9D, 0x312E, 0x96CE, 0x25A7, 0x9E37, 0x2C44, 0x2BB9, 0x2139
];
Эти значения также используются для установки новой позиции (bx, by) кисти в начале штриха: bx задается младшим значащим байтом и by задается старшим значащим байтом.
Направление хода задается битами № 1 и № 7 начального числа. (См. Оператор SWITCH в псевдокоде.)
Псевдо-код
Ниже приведен алгоритм в псевдокоде, предполагая , что 0-индексированные массивы, где AND
, OR
и XOR
средние Битовые операции.
seed = 0x7EC80000
dir = 0x00
FOR part = 0 TO 63
word = BRUSH[part]
seed = (seed AND 0xFFFF0000) OR word
bx = word AND 0xFF
by = (word >> 8) AND 0xFF
FOR len = 0 TO (64 - part) * 32 - 1
carry = seed AND 0x80000000
seed = (seed << 1) AND 0xFFFFFFFF
IF carry
seed = seed XOR 0x04C11DB7
dir = seed AND 0xFF
ENDIF
SWITCH dir AND 0x82
CASE 0x00:
by = (by + 1) AND 0x7F
ENDCASE
CASE 0x02:
bx = (bx + 1) AND 0x7F
ENDCASE
CASE 0x80:
by = (by - 1) AND 0x7F
ENDCASE
CASE 0x82:
bx = (bx - 1) AND 0x7F
ENDCASE
ENDSWITCH
drawPixel(bx, by, COLOR[part AND 3])
ENDFOR
ENDFOR
Ссылочная реализация
Ниже приведена справочная реализация в JavaScript.
Вы также можете увидеть анимационную версию здесь .
Разъяснение и правила
- Вывод должен быть обрезан до 128x96, хотя алгоритм рисует за пределами этой области.
- Если ваш язык / платформа не может выводить точные цвета, описанные выше, вы должны использовать цвета, максимально приближенные.
- Если вы решите использовать альтернативный метод, вы все равно должны генерировать точно такой же вывод.
- На всякий случай: отправка исходного кода сборки 6502 или любой слегка отредактированной версии не допускается.
- Можете ли вы побить 250 байтов? Приятного рисования!
Ответы:
код операции x86,
227224223 байтаОбраз:
источник
0122 6681F7B71DC104 xor edi, 00001DB7
обнаружена ошибка в W32DasmСборка 8086 - NASM (MBR) -
248245 байтисточник
xor dx,dx
и изменитеmov bp,0xa000; mov es,bp
наpush 0xa000; pop es
.PUSH imm
Excel VBA 32-разрядная,
1011720 байтРедакция 49; Δ Оценка = 291 байт
Golfed
Полная
Sub
процедура, которая не требует ввода и выводит Мона Лизу наActiveSheet
объект в диапазоне[A1:DX96]
.Было много черной магию , участвующую в гольфе это вниз к его текущему состоянию, - отметить, некоторые из трюков , участвующих в пикселе арт приготовительные , бит сдвиг цвета неявного преобразования типов , и
сжатия байт в качествеbase64
сжатиеString
.Примечание. Это решение было ограничено 32-разрядными версиями Excel VBA, как
^
иLongLong
литерал типа в 64-разрядных версиях.Примечание. Второе: строка в строке 3 не является комментарием, поскольку
”
не эквивалентна"
Выход
Gif, показывающий вывод к
ActiveSheet
когдаM
вызывается в непосредственном окне VBE. Следует отметить , что из - за ограничений на размер файла , этотрисунокGIF имеет меньше кадров , чем фактически произведены.Ungolfed
Полная
sub
подпрограмма без обработки, которая не требует ввода данных и создает mona lisa, используя метод, описанный выше дляActiveSheet
объектаисточник
HTML + CSS + JavaScript (ES6), 499 байт
678...478475473465459455451447449 байтЭто далеко не 250 байтов, но я определенно остановлюсь на 500 байтах! Огромное спасибо @Arnauld и @Firefly за помощь в игре этого монстра.
Для увеличения масштаба замените CSS следующим текстом:
Аннотированная история!
У меня был взрывной код Арно, и некоторые из них вы можете получить здесь. Наслаждайтесь!
Показать фрагмент кода
источник
Befunge,
11311052 байтаСуществует ряд проблем, которые делают эту проблему сложной в Befunge:
У Befunge есть только 2000 байтов памяти для работы (включая исходный код), поэтому мы никак не можем отобразить все изображение в памяти перед его выводом. Чтобы обойти это, я повторяю алгоритм 96 раз, по одному разу для каждой строки. Каждый прогон хранит только те пиксели, которые необходимы для текущей строки, которые затем выводятся в конце прогона. Это позволяет нам обходиться с буфером пикселей всего 128 байтов.
Befunge не имеет битовых операций вообще. Многие
AND
операции можно просто эмулировать с помощью оператора по модулю (например,a AND 0x7F
можно заменить наa % 0x80
). Однако для этогоXOR
требуется довольно сложная битовая манипуляция, с которой нам приходится иметь дело с одним байтом за раз, используя набор пользовательских формул, жестко закодированных для обработки четырех необходимых нам байтов. Например, для расчетаa XOR 0xC1
мы используем формулу:a + 0xC1 - (a/64%4*64 + a%2)*2
Хотя само по себе это не является ограничением Befunge, интерфейс в TIO не способен обрабатывать расширенные символы ASCII в источнике, что было бы самым простым способом хранения таблиц кисти и цвета. Я работаю над этим, генерируя эти таблицы в виде списка чисел в стеке, затем создаю небольшой цикл инициализации, который копирует значения из стека в память. Значительная часть моего времени была потрачена на игру в гольф за этим столом, который занимает первые пять с половиной строк кода.
К сожалению, несмотря на все мои усилия по обеспечению совместимости кода с TIO и выбор формата файла, который может быть извлечен из TIO ( PPM ), слишком медленно выполнить его в течение 60 секунд (возможно, выполнение алгоритма 96 раз) не помогает). Но поскольку он генерирует изображение построчно, вы все равно должны получить достаточно вывода, чтобы восстановить почти половину изображения.
Попробуйте онлайн!
Если у вас нет локальной программы просмотра файлов PPM, вы можете легко конвертировать в другой формат, используя один из многих онлайн-конвертеров. Одним из примеров является Convertio .
источник
Python 3,
544536523519518 байтЭто еще одна версия CCB60 Python для перевода эталонной реализации. Первоначально я использовал большое шестнадцатеричное число для представления кисти алгоритма, но позже я понял, что мое необоснованное предположение о том, что представление строки в Юникоде не будет работать в Python, было ложным.
Первоначально я думал, что мое число байтов было значительно ниже, но, как указывалось только в ASCII , я не помнил, чтобы считать символы Юникода как более одного байта.
Выход (128 х 96)
Идентичен выходу CCB60.
источник
Java 7,
681677675626612610 байтВыводит следующее изображение в разрешении 128х96:
Я знаю, что это даже не около 250 байтов, но эй, это Java
-2 байта благодаря Zacharý
источник
#Language, <s>Old Scores</s> Score Bytes
и 2 вы можете сделать свой код немного более читабельным, добавив флаг языка формы<!-- language-all: lang-java -->
перед Ваш кодовый блок0x04C11DB7
=>0x4C11DB7
и0x7f
=>127
. Не сходите с ума, когда это не нужно.C #,
960850 байтПрямая копия псевдокода с добавлением некоторого количества игры в гольф. Есть еще много вещей, которые можно сыграть в гольф, но я хотел опубликовать свой ответ, чтобы начать игру.
Полная / Отформатированная версия:
источник
var m = new Bitmap(128,96)
AE IU WAUGH WYPython 2.7; Всего
880876 байт (включая данные)-4 байта до 876 благодаря ZacharyT. (Моему интерпретатору python не понравилось его предложение отказаться от пробелов между 80-ми и т. Д.).
Предложение Тейлора Скотта поместить кисть в Base 10 превосходно, но notjagan (в комментарии) продвинулся на шаг вперед, используя расширенный целочисленный формат python в шестнадцатеричном формате. notjagan ответ на Python 3, и это такое улучшение от того, что я сделал, что он заслуживает похвалы. Я надеюсь, что он отправит это как отдельный ответ.
Вывод в окно Tkinter. Без масштабирования изображение очень маленькое, но масштабирование добавляет к счету около десятка байтов.
Здесь мало что происходит, кроме перевода на Python и некоторого базового игры в гольф. Иногда побочные манипуляции короче, иногда целочисленная математика. Я не мог найти способ упаковать больше логики в списки или массивы. Основной алгоритм уже довольно плотный.
источник
<!-- language-all: lang-py -->
80
"иelse
". И так0x00
же, как0
, верно?import
и*
.Tcl / Tk, 805
808815816819826839840843Все еще неудачник, ноя должен был сделать это! может быть, я могу играть в гольф позже!Теперь не неудачник!
Tcl / Tk, 1370
Очень незаметная транслитерация псевдокода перед началом игры в гольф!
update
Линия дает возможность просмотреть рисунок делается постепенно!источник
Python 3 + matplotlib, 541
Это сохраняет изображение в виде png-файла "i". Для отображения изображения вы можете заменить imsave imshow и шоу на 545 байт.
источник
SmileBASIC,
454447444 байтаСтрока "x" содержит недопустимые символы Юникода, поэтому я не могу опубликовать ее здесь. Вот коды символов в десятичном формате (только массив BRUSH в обратном порядке):
8505, 11193, 11332, 40503, 9639, 38606, 12590, 44957, 49275, 9103, 45629, 7700, 44387, 16047, 36156, 21056, 32967, 44146, 47330, 6263, 59670, 16059, 2569, 1043, 21292, 45297, 10516, 35478, 45332, 45634, 21547, 54321, 12369, 54650, 3453, 32252, 41772, 10669, 2137, 35575, 41799, 37027, 38901, 57113, 9942, 15633, 8348, 8339, 40146, 53425, 640, 28853, 45146, 47166, 37752, 3773, 6923, 35473, 62875, 3644, 1835, 12187, 14270, 778
источник
"xx...xx"
строки?: r4, 764 байта
Источник для запуска в : R4 GitHub
Я использую трюк, чтобы сделать движение без условий, преобразовать бит 8 в знак и сдвинуть с битом 2. версия с именами стека:
источник
Ябасич,
790779 байтОсновной ответ , который не принимает входной сигнал и выводит на новый графический окне.
Выход
Ниже масштабируется в 8 раз
источник