TAS Golf
No estilo de um speedrun assistido por ferramentas com uma reviravolta no código de golfe, o objetivo desse desafio é completar o mundo 1-1 do jogo Super Mario Bros original para o NES na linguagem de programação escolhida no menor número de bytes possível, usando apenas as entradas do controlador no jogo no formato que descreverei abaixo. Seu programa deve gerar stdout
uma lista de linhas neste formato, criada especificamente para este desafio:
up down left right start select A B
Começando com o primeiro quadro, cada nova linha representa as entradas para o Controlador 1 para um quadro específico. A ordem dos botões por quadro não importa e eles podem ser separados por qualquer quantidade de espaço em branco que não seja da nova linha. Todos ou nenhum ou alguns dos nomes dos botões podem ser incluídos por linha. Por exemplo, um programa Python simples que pressiona o direcional para a direita por 3 quadros e pressiona A pode ser assim:
for _ in range(3): print('right')
print('A')
E sua saída (que eu alimentaria no meu emulador para verificar) seria:
right
right
right
A
Aqui, definimos 'sucesso' como alcançar a bandeira no final do Mundo 1-1 na foto acima. A pontuação para este exemplo de envio do Python, se for bem-sucedida (o que não ocorre), seria 44 bytes ou o comprimento original do programa Python.
Para um exemplo de arquivo de entrada de trabalho que criei com base no TAS mais rápido atual , consulte este Github Gist: https://gist.github.com/anonymous/6f1a73cbff3cd46c9e1cf8d5c2ff58e1 Observe que este arquivo completa o jogo inteiro.
Não há como inserir entradas de subquadro . Também não há como inserir entradas no controle do jogador 2, mas isso também não deve ser necessário (ou útil) para concluir o nível ou o jogo.
A versão do SMB usada será a ROM iNES dos EUA / Japão original (md5sum 811b027eaf99c2def7b933c5208636de - a versão dos EUA é exatamente a mesma da versão japonesa, portanto, qualquer uma delas funcionará, a ROM é geralmente rotulada Super Mario Bros (JU) (PRG 0)
ou similar).
Para testar os envios, executarei os programas, canalizá- stdout
los em um arquivo input.txt e carregá-los no FCEUX usando este script Lua mario.lua
que escrevi para este desafio:
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;
O comando específico que vou usar é fceux mario.nes --loadlua mario.lua
. Não há limite de tempo para os programas, embora eles precisem terminar.
Este é um pouco da linha Bash que fiz para converter um arquivo de filme FCEUX (.fm2) em um input.txt para o meu script, se ajudar:
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
Para referência, aqui está um mapa de resolução total do Mundo 1-1 (abra a imagem em uma nova guia para resolução total): (fonte: mariouniverse.com )
Nota: À primeira vista, isso pode parecer um desafio à complexidade Kolmogorov no meu arquivo input.txt. No entanto, na realidade, o desafio é mais complexo do que isso porque (a) o input.txt que forneci definitivamente não é o mais curto possível e (b) nunca houve uma tentativa de criar o menor conjunto possível de pressionamentos de tecla para SMB nesse formato . O 'menor número possível de botões' conhecido do TAS é diferente porque permite manter os botões pressionados por um longo período de tempo, o que aumentaria a produção desejada neste desafio.