Binary Golf Grand Prix 6 - Forth

Очередной BGGP стартовал, а значит время немного размять мозги. В этот раз нужно написать минимальный файл, который печатает или каким-то иным способом возвращает шестёрку. Начальное количество очков будет рассчитано как 4096 минус размер вашего файла (поэтому решение не должно быть больше 4096 байт). Но не просто так в этом году соревнование проходит с подзаголовком "Recycle":

Все подробности BGGP6 можно найти на официальной странице:

Первое решение, пришедшее мне в голову - Forth

Как напечатать шестёрку в Forth? А достаточно всего трех байт:

6 .

(литералом заносим значение 6 в стек и печатает число с вершины стека словом точка ".")

В качестве Forth-системы для Unix я предпочитаю PFE (Portable Forth Environment [2]). Если разместить эти три байта в файле /tmp/bggp6.forth, то запустить его можно командой:

$ pfe -y -q /tmp/bggp6.forth
6 

UDP: 2025-10-20: Исходный текст Forth не является бинарным файлом (точнее исполняемым байт-кодом), а значит не может выступать в качестве решения BGGP1 (Палиндром) или BGGP2 (Полиглот).

Полиглот

Три байта это компактно. Плюс это уже вполне себе полиглот: такой файл можно скормить Unix оболочке (например - zsh), которая выведет шестёрку, как часть сообщения об ошибке:

$ zsh /tmp/bggp6.forth
/tmp/bggp6.forth:1: command not found: 6

Да, элегантность такого решения под вопросом. Плюс в BGGP2 есть явное требование, что "основной" файл должен быть бинарным, содержащим машинный код.

Палиндром

За каждое дополнительное задание из прошлых лет мы получим 256 очков. Поэтому имеет смысл выполнять его, если решение распухнет на меньшее количество байт. Очевидным решением тут будет палиндром. Зеркалируем первые два байта и получаем пятибайтовую последовательность, которая делает почти тоже самое:

6 . 6

(для Forth-системы мы просто оставим в стеке ещё одно значение 6, что вполне укладывается в условия конкурса)

То есть добавили 2 байта (которые будут вычитаться из результирующих очков), но получили за это 256 очков. Или не получили, если следовать формальным правилам, ведь исходный код Forth не является исполняемым байт-кодом.

Заключение

Сначала я невнимательно прочитал условия первых BGGP, поэтому замахнулся на пару лишних номинаций. Мой промах.

Здорово было бы пофиксить что-то в открытом проекте до конца конкурса. Даже не ради очков, просто мне по душе такая инициатива организаторов :)

Ссылки

[2] https://pfe.sourceforge.net/