ТАС Гольф
В стиле ускоренного запуска с помощью инструмента с поворотом кода в гольф цель этой задачи состоит в том, чтобы завершить Мир 1-1 оригинальной игры Super Mario Bros для NES на выбранном вами языке программирования за минимальное количество байтов, насколько это возможно, используя только входы игрового контроллера в формате, который я опишу ниже. Ваша программа должна вывести stdout
список строк в этом формате, созданный специально для этой задачи:
up down left right start select A B
Начиная с первого кадра, каждая новая строка представляет входные данные для контроллера 1 для определенного кадра. Порядок кнопок на кадр не имеет значения, и они могут быть разделены любым количеством пробелов без новой строки. Все или никакие или некоторые из названий кнопок могут быть включены в строку. Например, простая программа на Python, которая нажимает D-pad на 3 кадра, а затем нажимает A, может выглядеть так:
for _ in range(3): print('right')
print('A')
И его вывод (который я проверю в своем эмуляторе) будет:
right
right
right
A
Здесь мы определяем «успех» как достижение флага в конце Мира 1-1, изображенного выше. Оценка для этого примера представления Python, если она прошла успешно (чего не происходит), составила бы 44 байта , или исходную длину программы Python.
Для примера рабочего входного файла, который я создал на основе текущего самого быстрого TAS , см. Этот Github Gist: https://gist.github.com/anonymous/6f1a73cbff3cd46c9e1cf8d5c2ff58e1 Обратите внимание, что этот файл завершает всю игру.
Нет способа ввода входных данных субкадра . Также нет способа ввода входных данных в контроллер игрока 2, но это также не должно быть необходимым (или полезным) для прохождения уровня или игры.
Используемой версией SMB будет исходное ПЗУ iNES для США / Японии (md5sum 811b027eaf99c2def7b933c5208636de - версия для США точно такая же, как и для японской версии, поэтому либо будет работать, ПЗУ обычно помечается Super Mario Bros (JU) (PRG 0)
или аналогично).
Чтобы проверить представленные материалы, я буду запускать программы, stdout
помещать их в файл input.txt и загружать их в FCEUX, используя скрипт Lua, который mario.lua
я написал для этой задачи:
for line in io.lines('input.txt') do
local t = {}
for w in line:gmatch("%S+") do
t[w] = true;
end;
joypad.set(1, t);
emu.frameadvance();
end;
while (true) do
emu.frameadvance();
end;
Команда конкретного Я буду использовать это fceux mario.nes --loadlua mario.lua
. Нет ограничений по времени для программ, хотя они должны в конечном итоге прекратить.
Это небольшая строчка из Bash, которую я сделал, чтобы конвертировать файл фильма FCEUX (.fm2) в файл input.txt для моего сценария, если это поможет:
cat movie.fm2 | cut -d'|' -f 3 | sed 's/\.//g' | sed 's/R/right /g' | sed 's/L/left /g' | sed 's/D/down /g' | sed 's/U/up /g' | sed 's/T/start /g' | sed 's/S/select /g' | sed 's/B/B /g' | sed 's/A/A /g' | tail -n +13 > input.txt
Для справки: карта мира 1-1 в полном разрешении (откройте изображение на новой вкладке для просмотра в полном разрешении): (источник: mariouniverse.com )
Примечание. На первый взгляд это может показаться проблемой сложности Колмогорова в моем файле input.txt. Однако на самом деле задача более сложная, чем та, потому что (a) предоставленный мною input.txt определенно не самый короткий и (b) никогда не было попытки создать максимально короткий набор нажатий клавиш для SMB в этом формате. , «Наименьшее количество возможных кнопок», известное TAS, отличается тем, что позволяет удерживать кнопки в течение длительного времени, что увеличит длину до желаемого результата в этой задаче.