Golf TAS
Dengan gaya speedrun berbantu alat dengan twist kode-golf, tujuan dari tantangan ini adalah untuk menyelesaikan World 1-1 dari game Super Mario Bros asli untuk NES dalam bahasa pemrograman pilihan Anda dalam sesedikit mungkin byte, hanya menggunakan input controller dalam game dalam format yang akan saya jelaskan di bawah ini. Program Anda harus menampilkan ke stdout
daftar baris dalam format ini, dibuat khusus untuk tantangan ini:
up down left right start select A B
Dimulai dengan frame pertama, setiap baris baru mewakili input untuk Pengendali 1 untuk frame tertentu. Urutan tombol per frame tidak masalah, dan mereka dapat dipisahkan dengan jumlah spasi spasi non-baris baru. Semua atau tidak ada atau beberapa nama tombol dapat dimasukkan per baris. Misalnya, program Python sederhana yang menekan D-pad tepat untuk 3 frame dan kemudian menekan A mungkin terlihat seperti ini:
for _ in range(3): print('right')
print('A')
Dan hasilnya (yang akan saya masukkan ke emulator saya untuk diverifikasi) adalah:
right
right
right
A
Di sini, kami mendefinisikan 'kesuksesan' sebagai mencapai bendera di akhir Dunia 1-1 seperti yang digambarkan di atas. Skor untuk pengiriman contoh Python ini, jika berhasil (yang tidak), akan menjadi 44 byte , atau panjang asli dari program Python.
Untuk contoh file input yang berfungsi saya buat berdasarkan TAS tercepat saat ini , lihat Github Gist ini: https://gist.github.com/anonymous/6f1a73cbff3cd46c9e1cf8d5c2ff58e1 Perhatikan bahwa file ini melengkapi seluruh permainan.
Tidak ada cara untuk memasukkan input subframe . Juga tidak ada cara untuk memasukkan input pada pengontrol Player 2, tetapi itu juga tidak perlu (atau berguna) untuk menyelesaikan level atau game.
Versi SMB yang digunakan adalah ROM AS / Jepang iNES yang asli (md5sum 811b027eaf99c2def7b933c5208636de - versi USA sama persis dengan versi Jepang sehingga keduanya dapat berfungsi, ROM umumnya berlabel Super Mario Bros (JU) (PRG 0)
atau serupa).
Untuk menguji pengiriman, saya akan menjalankan program, menyalurkannya stdout
ke file input.txt, dan memuatnya ke FCEUX menggunakan skrip Lua yang mario.lua
saya tulis untuk tantangan ini:
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;
Perintah spesifik yang akan saya gunakan adalah fceux mario.nes --loadlua mario.lua
. Tidak ada batasan waktu untuk program, meskipun mereka akhirnya harus berakhir.
Ini adalah Bash one-liner kecil yang saya buat untuk mengonversi file film FCEUX (.fm2) ke input.txt untuk skrip saya, jika itu membantu:
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
Untuk referensi, berikut adalah peta Dunia 1-1 dengan resolusi penuh (buka gambar di tab baru untuk resolusi penuh): (sumber: mariouniverse.com )
Catatan: Sekilas, ini mungkin tampak seperti tantangan kompleksitas Kolmogorov pada file input.txt yang saya berikan. Namun, pada kenyataannya tantangannya lebih kompleks dari itu karena (a) input.txt yang saya berikan jelas bukan yang sesingkat mungkin dan (b) tidak pernah ada upaya untuk membuat set penekanan tombol sesingkat mungkin untuk SMB dalam format ini. . 'Tombol paling sedikit yang mungkin' diketahui TAS berbeda karena memungkinkan untuk menahan tombol untuk waktu yang lama, yang akan menambah panjang pada output yang diinginkan dalam tantangan ini.