TAS Golf
W stylu Speedrun narzędzia wspomagane z domieszką code-golf, celem tego wyzwania jest zakończenie świata 1-1 z oryginalnego Super Mario Bros gry na NES w wybranym języku programowania w jak najmniejszej liczbie bajtów, jak to możliwe, używając tylko wejść kontrolera w grze w formacie, który opiszę poniżej. Twój program musi wyświetlać stdout
listę linii w tym formacie, stworzoną specjalnie dla tego wyzwania:
up down left right start select A B
Zaczynając od pierwszej ramki, każda nowa linia reprezentuje dane wejściowe dla Kontrolera 1 dla konkretnej ramki. Kolejność przycisków na ramkę nie ma znaczenia, i można je oddzielić dowolną liczbą spacji niebędących znakami nowej linii. W wierszu można podać wszystkie lub brak nazw przycisków lub niektóre z nich. Na przykład prosty program w języku Python, który naciska D-pad w prawo dla 3 ramek, a następnie naciska A, może wyglądać następująco:
for _ in range(3): print('right')
print('A')
A jego wynik (który chciałbym wprowadzić do mojego emulatora w celu weryfikacji) to:
right
right
right
A
Tutaj definiujemy „sukces” jako osiągnięcie flagi pod koniec świata 1-1 na zdjęciu powyżej. Wynik dla tego przykładowego przesłania w języku Python, jeśli się powiedzie (czego nie powiedzie się), wyniesie 44 bajty lub oryginalną długość programu w języku Python.
Na przykład działający plik wejściowy, który utworzyłem w oparciu o bieżący najszybszy TAS , zobacz Github Gist: https://gist.github.com/anonymous/6f1a73cbff3cd46c9e1cf8d5c2ff58e1 Pamiętaj, że ten plik kończy całą grę.
Nie ma możliwości wprowadzania danych wejściowych w ramce pomocniczej . Nie ma również możliwości wprowadzania danych wejściowych do kontrolera Gracza 2, ale nie powinno to być również konieczne (ani przydatne) do ukończenia poziomu lub gry.
Użyta wersja SMB będzie oryginalnym ROMem USA / Japonii iNES ROM (md5sum 811b027eaf99c2def7b933c5208636de - wersja USA jest dokładnie taka sama jak wersja japońska, więc albo będzie działać, ROM jest zwykle oznaczony Super Mario Bros (JU) (PRG 0)
lub podobny).
Aby przetestować zgłoszenia, uruchomię programy, stdout
potokuję je do pliku input.txt i ładuję do FCEUX za pomocą skryptu Lua, mario.lua
który napisałem dla tego wyzwania:
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;
Konkretne polecenie, którego będę używać, to fceux mario.nes --loadlua mario.lua
. Programy nie mają ograniczenia czasowego, ale ostatecznie muszą się zakończyć.
To jest mały linijka Bash, którą zrobiłem, aby przekonwertować plik filmu FCEUX (.fm2) na input.txt dla mojego skryptu, jeśli to pomaga:
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
Dla porównania, oto mapa świata 1-1 w pełnej rozdzielczości (otwórz obraz w nowej karcie dla pełnej rozdzielczości): (źródło: mariouniverse.com )
Uwaga: Na pierwszy rzut oka może to wydawać się wyzwaniem złożoności Kołmogorowa w moim pliku input.txt. Jednak w rzeczywistości wyzwanie jest bardziej złożone, ponieważ (a) podany przeze mnie plik input.txt zdecydowanie nie jest najkrótszy z możliwych i (b) nigdy nie podjęto próby stworzenia możliwie najkrótszego zestawu naciśnięć klawiszy dla SMB w tym formacie . Znane TAS „najmniejszej możliwej liczby przycisków” jest inne, ponieważ pozwala na długie przytrzymanie przycisków, co zwiększy długość pożądanego wyjścia w tym wyzwaniu.