TAS Golf
Nello stile di uno speedrun assistito da utensili con un tocco di code-golf, l'obiettivo di questa sfida è quello di completare il mondo 1-1 del gioco originale Super Mario Bros per il NES nel linguaggio di programmazione scelto nel minor numero di byte possibile, usando solo gli input del controller di gioco nel formato che descriverò di seguito. Il tuo programma deve produrre stdout
un elenco di righe in questo formato, creato appositamente per questa sfida:
up down left right start select A B
A partire dal primo frame, ogni newline rappresenta gli ingressi per il Controller 1 per un frame specifico. L'ordine dei pulsanti per frame non ha importanza e possono essere separati da qualsiasi quantità di spazio bianco non newline. Tutti o nessuno o alcuni dei nomi dei pulsanti possono essere inclusi per riga. Ad esempio, un semplice programma Python che preme il D-pad a destra per 3 fotogrammi e quindi preme A potrebbe apparire così:
for _ in range(3): print('right')
print('A')
E il suo output (che vorrei inserire nel mio emulatore per verificare) sarebbe:
right
right
right
A
Qui, definiamo il "successo" come raggiungere la bandiera alla fine del Mondo 1-1 nella foto sopra. Il punteggio per questo esempio di invio di Python, se ha avuto successo (cosa che non ha successo), sarebbe 44 byte , o la lunghezza originale del programma Python.
Per un esempio di file di input funzionante che ho creato sulla base dell'attuale TAS più veloce , vedere questo Github Gist: https://gist.github.com/anonymous/6f1a73cbff3cd46c9e1cf8d5c2ff58e1 Nota che questo file completa l'intero gioco.
Non è possibile immettere input di sottotelaio . Inoltre, non è possibile immettere input nel controller di Player 2, ma ciò non dovrebbe essere necessario (o utile) per completare il livello o il gioco.
La versione di SMB utilizzata sarà la ROM iNES originale USA / Giappone (md5sum 811b027eaf99c2def7b933c5208636de - la versione USA è esattamente la stessa della versione giapponese, quindi funzionerà, la ROM è comunemente etichettata Super Mario Bros (JU) (PRG 0)
o simile).
Per testare gli invii, stdout
eseguirò i programmi, li instraderò in un file input.txt e li caricherò in FCEUX usando questo script Lua che mario.lua
ho scritto per questa sfida:
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;
Il comando specifico che userò è fceux mario.nes --loadlua mario.lua
. I programmi non hanno limiti di tempo, anche se alla fine devono terminare.
Questa è una piccola riga di Bash che ho creato per convertire un file di film FCEUX (.fm2) in un input.txt per il mio script, se aiuta:
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
Per riferimento, ecco una mappa a piena risoluzione del Mondo 1-1 (apri l'immagine in una nuova scheda per la piena risoluzione): (fonte: mariouniverse.com )
Nota: a prima vista, può sembrare una sfida alla complessità di Kolmogorov sul mio file input.txt. Tuttavia, in realtà la sfida è più complessa di così perché (a) input.txt che ho fornito non è sicuramente il più breve possibile e (b) non c'è mai stato un tentativo di creare il set più breve possibile di tasti premuti per le PMI in questo formato . Il minor numero possibile di TAS noti è diverso perché consente di tenere i pulsanti a lungo, il che aggiungerebbe lunghezza all'output desiderato in questa sfida.