TAS Golf
У стилі скоромовки з інструментами з поворотом коду-гольфу, метою цього завдання є завершити Світ 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 буде оригінальний ROM 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) наданий мною вклад.txt, безумовно, не найкоротший і (b) ніколи не було спроб створити якомога коротший набір клавіш для SMB у цьому форматі. . Найвідоміша з найменших кнопок, відома TAS, відрізняється тим, що вона дозволяє тримати тривалий час натискання кнопок, що додало б довжину бажаному виводу в цьому виклику.