TAS Golf
A la manière d'un speedrun assisté par outil avec une touche de code-golf, l'objectif de ce défi est de terminer les Mondiaux 1-1 du jeu original Super Mario Bros pour NES dans le langage de programmation de votre choix, avec le moins d'octets possible. en utilisant uniquement les entrées du contrôleur de jeu dans le format que je vais décrire ci-dessous. Votre programme doit générer stdout
une liste de lignes dans ce format, créées spécifiquement pour ce défi:
up down left right start select A B
À partir de la première image, chaque nouvelle ligne représente les entrées du contrôleur 1 pour une image particulière. L'ordre des boutons par image n'a pas d'importance et ils peuvent être séparés par n'importe quelle quantité d'espaces non newline. Tout ou aucun ou certains des noms de boutons peuvent être inclus par ligne. Par exemple, un simple programme Python qui appuie à droite sur le D-pad pendant 3 images puis sur A pourrait ressembler à ceci:
for _ in range(3): print('right')
print('A')
Et sa sortie (que je voudrais alimenter dans mon émulateur pour vérifier) serait:
right
right
right
A
Ici, nous définissons le "succès" comme atteindre le drapeau à la fin du Mondial 1-1 illustré ci-dessus. Le score de cet exemple de soumission Python, s'il a réussi (ce qui n'a pas été le cas), serait de 44 octets , ou la longueur d'origine du programme Python.
Pour un exemple de fichier d’entrée de travail que j’ai créé sur la base du TAS le plus rapide , voir le présent Gistub: https://gist.github.com/anonymous/6f1a73cbff3cd46c9e1cf8d5c2ff58e1 Notez que ce fichier complète le jeu entier.
Il n'y a aucun moyen d'entrer des entrées de sous-trame . Il n’existe également aucun moyen de saisir des entrées dans le contrôleur du joueur 2, mais cela ne devrait pas non plus être nécessaire (ni utile) pour terminer le niveau ou la partie.
La version de SMB utilisée sera la ROM iNES USA / Japon d'origine (md5sum 811b027eaf99c2def7b933c5208636de - la version USA est identique à la version japonaise, elle fonctionnera donc, la ROM est étiquetée Super Mario Bros (JU) (PRG 0)
ou similaire).
Pour tester les soumissions, je vais exécuter les programmes, les stdout
transférer dans un fichier input.txt et les charger dans FCEUX en utilisant le script Lua que mario.lua
j'ai écrit pour ce défi:
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;
La commande spécifique que je vais utiliser est fceux mario.nes --loadlua mario.lua
. Les programmes n’ont pas de limite de temps, bien qu’ils doivent finir par s’arrêter.
Voici un petit exemple de Bash one-liner que j'ai créé pour convertir un fichier vidéo FCEUX (.fm2) en fichier input.txt pour mon script, si cela aide:
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
Pour référence, voici une carte en haute résolution de Monde 1-1 (ouvrez l'image dans un nouvel onglet pour une résolution complète): (source: mariouniverse.com )
Remarque: à première vue, cela peut sembler être un défi de complexité de Kolmogorov sur mon fichier input.txt. Cependant, en réalité, le défi est plus complexe que cela car (a) le fichier input.txt que j’ai fourni n’est certainement pas le plus court possible et (b) il n’a jamais été tenté de créer le plus court jeu de touches possible pour SMB dans ce format . Le «nombre le plus bas de boutons» connu TAS est différent car il permet de maintenir les boutons enfoncés pendant une longue période, ce qui ajouterait de la longueur à la sortie souhaitée dans ce challenge.