TAS Golf
Al estilo de un speedrun asistido por herramientas con un giro de código de golf, el objetivo de este desafío es completar el Mundo 1-1 del juego original de Super Mario Bros para el NES en el lenguaje de programación elegido en el menor número de bytes posible, usando solo las entradas del controlador en el juego en el formato que describiré a continuación. Su programa debe generar stdout
una lista de líneas en este formato, creado específicamente para este desafío:
up down left right start select A B
Comenzando con el primer cuadro, cada nueva línea representa las entradas para el Controlador 1 para un cuadro particular. El orden de los botones por cuadro no importa, y pueden separarse por cualquier cantidad de espacios en blanco que no sean de nueva línea. Todos o ninguno de los nombres de los botones se pueden incluir por línea. Por ejemplo, un programa simple de Python que presiona el D-pad hacia la derecha durante 3 cuadros y luego presiona A podría verse así:
for _ in range(3): print('right')
print('A')
Y su salida (que alimentaría en mi emulador para verificar) sería:
right
right
right
A
Aquí, definimos 'éxito' como alcanzar la bandera al final del Mundo 1-1 que se muestra arriba. La puntuación para este envío de Python de ejemplo, si tuvo éxito (que no lo hace), sería de 44 bytes , o la longitud original del programa Python.
Para un ejemplo de archivo de entrada de trabajo que creé basado en el TAS más rápido actual , vea este Github Gist: https://gist.github.com/anonymous/6f1a73cbff3cd46c9e1cf8d5c2ff58e1 Tenga en cuenta que este archivo completa todo el juego.
No hay forma de ingresar entradas de subtrama . Tampoco hay forma de ingresar entradas en el controlador del Jugador 2, pero eso tampoco debería ser necesario (o útil) para completar el nivel o el juego.
La versión de SMB utilizada será la ROM iNES original de EE. UU./ Japón (md5sum 811b027eaf99c2def7b933c5208636de: la versión de EE. UU. Es exactamente la misma que la versión japonesa, por lo que funcionará, la ROM está comúnmente etiquetada Super Mario Bros (JU) (PRG 0)
o es similar).
Para probar los envíos, ejecutaré los programas, los canalizaré stdout
en un archivo input.txt y los cargaré en FCEUX usando este script Lua mario.lua
que escribí para este desafío:
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;
El comando específico que usaré es fceux mario.nes --loadlua mario.lua
. No hay límite de tiempo para los programas, aunque finalmente deben terminar.
Esta es una pequeña línea de Bash que hice para convertir un archivo de película FCEUX (.fm2) a input.txt para mi script, si ayuda:
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
Como referencia, aquí hay un mapa de resolución completa del Mundo 1-1 (abra la imagen en una nueva pestaña para resolución completa): (fuente: mariouniverse.com )
Nota: A primera vista, esto puede parecer un desafío de complejidad de Kolmogorov en mi archivo input.txt dado. Sin embargo, en realidad el desafío es más complejo que eso porque (a) el input.txt que proporcioné definitivamente no es el más corto posible y (b) nunca ha habido un intento de crear el conjunto más corto posible de pulsaciones de teclas para SMB en este formato . El 'TAS con la menor cantidad de botones posible' es diferente porque permite mantener presionados los botones durante mucho tiempo, lo que agregaría longitud a la salida deseada en este desafío.