Binary Golf Grand Prix 6 - Forth
Очередной BGGP стартовал, а значит время немного размять мозги. В этот раз нужно написать минимальный файл, который печатает или каким-то иным способом возвращает шестёрку. Начальное количество очков будет рассчитано как 4096 минус размер вашего файла (поэтому решение не должно быть больше 4096 байт). Но не просто так в этом году соревнование проходит с подзаголовком "Recycle":
- Если ваше решение будет удовлетворять условиям одного из предыдущих конкурсов, то будет начислено +256 балов за каждый: палиндром, полиглот, падение, самовоспроизведение и скачивание по сети. То есть до 1024 баллов за все пять предыдущих лет.
- Если ваше решение будет выявлять какую-то проблему в открытом софте, которая будет исправлена до окончания BGGP6 (18 января 2026 года), то такое решение получит +1024 баллов.
- Ещё 256 баллов дают за публикацию о своём решении, поэтому вы и читаете это :) ~~удалить этот пункт перед публикацией~~
Все подробности 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, поэтому замахнулся на пару лишних номинаций. Мой промах.
Здорово было бы пофиксить что-то в открытом проекте до конца конкурса. Даже не ради очков, просто мне по душе такая инициатива организаторов :)