Оскар Толедо Г. решил поучаствовать в 29-м конкурсе IOCCC (International Obfuscated C Code Contest). Это соревнование по написанию запутанного кода на C, которое проводят с 1984 года. В этом году лимит — 4993 байта и 2503 печатных символа. Проверяет размер специальная утилита iocccsize.
Оскар выбрал для конкурса игру Klondike Solitaire — пасьянс, знакомый каждому по Windows 3.1. Он уже писал такой пасьянс раньше, в том числе для Intellivision. Математики подсчитали, что выиграть можно только 43% партий с одной сдачей карт и 18% — с тремя.
Писать код начал в феврале 2026 года. За три дня сделал основную логику на C, использовал библиотеку curses для отрисовки карт, цвета и Unicode-символы мастей. Первая версия в лимит не влезла, пришлось оптимизировать. Особенно сложно было сделать интерфейс: в оригинале игроки перетаскивают карты мышью, но для экономии места Оскар заменил drag-and-drop на табы (Tab — выбор карты, Space — сброс). В игру добавил опциональную сдачу по три карты, режим подсчёта очков из Лас-Вегаса и бонус за время — «вишенку на торте».
С curses вышла морока. Библиотека есть в каждом Linux и macOS, но версий много, и они отличаются. Для мастей нужен UTF-8, а некоторые реализации curses его не поддерживают. В итоге ASCII-боксы для карт нашёл в документации, а символы мастей взял из Unicode. Цвета для красных карт тоже работают — curses унифицирует управление терминалом.
Исходник программы занимает около 5 КБ и выглядит как бессмысленный набор символов. Это и есть цель IOCCC: код должен делать своё дело, но быть абсолютно нечитаемым. Оскар показывает пример: вместо нормального цикла for можно написать однострочник с while и оператором запятой. В своей игре он использовал замену != на -, >= на >, случайную перестановку массива и индекса, константу O вместо нуля, тернарные операторы — всё, чтобы запутать код.
После закрытия конкурса Оскар заметил, что можно было ещё сильнее запутать и оптимизировать. К сожалению, его работа не победила. Но он выложил исходник, чтобы все желающие могли поиграть в Klondike в текстовом терминале. Для сборки нужен gcc и ncurses с поддержкой UTF-8. На macOS 12.7.6 всё работает, на macOS 10.15 (Catalina) карты отображаются, но нет границ — с 2020 года Apple не добавила поддержки символов, которые есть в Linux с 2014-го. На macOS 10.11 (El Capitan) старая версия ncurses 5 вообще не знает UTF-8. Советуют развернуть терминал на 36 или 40 строк.
Запускается игра без аргументов (Windows-подсчёт очков), с одним аргументом (Лас-Вегас), с двумя (Windows с тремя картами), с тремя (Лас-Вегас с тремя картами). Управление — Tab для перемещения курсора-звёздочки, Space для выбора и сброса, Enter для выхода.