TAS Golf
Im Stil eines toolgestützten Speedruns mit einem Code-Golf-Twist besteht das Ziel dieser Herausforderung darin, World 1-1 des ursprünglichen Super Mario Bros- Spiels für das NES in der von Ihnen gewählten Programmiersprache in so wenigen Bytes wie möglich zu beenden. Verwenden Sie nur die In-Game-Controller-Eingänge im unten beschriebenen Format. Ihr Programm muss stdout
eine Liste von Zeilen in diesem Format ausgeben , die speziell für diese Herausforderung erstellt wurden:
up down left right start select A B
Beginnend mit dem ersten Frame repräsentiert jede neue Zeile die Eingänge für Controller 1 für einen bestimmten Frame. Die Reihenfolge der Schaltflächen pro Frame spielt keine Rolle. Sie können durch eine beliebige Anzahl von Leerzeichen (ohne Zeilenumbruch) voneinander getrennt werden. Alle oder keine oder einige der Schaltflächennamen können pro Zeile eingefügt werden. Ein einfaches Python-Programm, das das Steuerkreuz drei Frames lang nach rechts drückt und dann A drückt, könnte beispielsweise so aussehen:
for _ in range(3): print('right')
print('A')
Und seine Ausgabe (die ich in meinen Emulator einspeisen würde, um zu überprüfen) wäre:
right
right
right
A
Hier definieren wir "Erfolg" als das Erreichen der Flagge am Ende von World 1-1, wie oben abgebildet. Die Punktzahl für diese Python-Beispielübermittlung beträgt , falls sie erfolgreich war (was nicht der Fall ist), 44 Byte oder die ursprüngliche Länge des Python-Programms.
Eine Beispiel-Eingabedatei, die ich basierend auf dem aktuell schnellsten TAS erstellt habe , finden Sie in der folgenden Github-Liste: https://gist.github.com/anonymous/6f1a73cbff3cd46c9e1cf8d5c2ff58e1 Beachten Sie, dass diese Datei das gesamte Spiel abschließt.
Es gibt keine Möglichkeit, Subframe-Eingänge einzugeben . Es gibt auch keine Möglichkeit, Eingaben in den Controller von Spieler 2 einzugeben, aber dies sollte auch nicht notwendig (oder nützlich) sein, um das Level oder Spiel zu beenden.
Die verwendete SMB-Version ist das Original-iNES-ROM für USA / Japan (md5sum 811b027eaf99c2def7b933c5208636de). Die USA-Version ist genau die gleiche wie die japanische Version. Entweder funktioniert sie, das ROM ist allgemein beschriftet Super Mario Bros (JU) (PRG 0)
oder ähnlich.
Um die Einsendungen zu testen, stdout
führe ich die Programme aus, leite sie in eine input.txt-Datei und lade sie mit dem Lua-Skript, das mario.lua
ich für diese Herausforderung geschrieben habe, in FCEUX :
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;
Der spezifische Befehl, den ich verwenden werde, ist fceux mario.nes --loadlua mario.lua
. Es gibt keine zeitliche Begrenzung für die Programme, obwohl sie eventuell beendet werden müssen.
Dies ist ein kleiner Bash-Einzeiler, den ich erstellt habe, um eine FCEUX-Filmdatei (.fm2) in eine input.txt für mein Skript zu konvertieren, wenn dies hilft:
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
Als Referenz finden Sie hier eine Karte von World 1-1 in voller Auflösung (öffnen Sie das Bild in einem neuen Tab, um es in voller Auflösung anzuzeigen ) : (Quelle: mariouniverse.com )
Hinweis: Auf den ersten Blick scheint dies eine Herausforderung für die Kolmogorov-Komplexität in meiner angegebenen input.txt-Datei zu sein. In der Realität ist die Herausforderung jedoch komplexer, da (a) die von mir bereitgestellte input.txt definitiv nicht die kürzeste ist und (b) noch nie versucht wurde, eine möglichst kurze Anzahl von Tastendrücken für SMB in diesem Format zu erstellen . Das "Möglichst wenige Tasten" bekannte TAS unterscheidet sich, da es das Halten von Tasten für eine lange Zeit ermöglicht, was die gewünschte Ausgabe bei dieser Herausforderung verlängern würde.