TAS Golf
Bir kod destekli twist ile alet destekli bir speedrun tarzında, bu zorluğun amacı, seçtiğiniz programlama dilinde NES için orijinal Super Mario Bros oyununun 1-1 dünyasını mümkün olan en az baytta tamamlamak. sadece oyun içi denetleyici girişlerini kullanarak aşağıda tarif edeceğim formatta. Programınız , bu sorun için özel olarak oluşturulmuş, bu formattaki bir satır listesine çıkmalıdır:stdout
up down left right start select A B
İlk kareden başlayarak, her yeni satır, belirli bir kareye ait Kontrolör 1 için girişleri temsil eder. Kare başına düğme sırası önemli değildir ve herhangi bir miktarda yeni satır olmayan beyaz boşlukla ayrılabilir. Düğme adlarının tümü ya da hiçbiri ya da hiçbiri satır başına dahil edilebilir. Örneğin, D-pad'i 3 kare için sağa ve ardından A'ya basan basit bir Python programı şöyle görünebilir:
for _ in range(3): print('right')
print('A')
Ve (doğrulamak için öykünücüme besleyeceğim) çıktısı:
right
right
right
A
Burada, 'başarıyı' yukarıda gösterilen Dünya 1-1'inin bayraklarına ulaşmak olarak tanımlarız. Bu örnek için verilen puan Python gönderimi başarılı olmuşsa (ki başarısız olursa) 44 bayt veya Python programının orijinal uzunluğu olacaktır.
Geçerli en hızlı TAS'ye göre oluşturduğum örnek bir çalışma giriş dosyası için şu Github Gist'e bakın: https://gist.github.com/anonymous/6f1a73cbff3cd46c9e1cf8d5c2ff58e1 Bu dosyanın tüm oyunu tamamladığına dikkat edin.
Alt çerçeve girişlerini girmenin bir yolu yoktur . Oyuncu 2'nin kontrol ünitesine girişleri girmenin bir yolu yoktur, ancak seviyeyi veya oyunu tamamlamak için de gerekli (veya faydalı) olmamalıdır.
Kullanılan SMB sürümü orijinal ABD / Japonya iNES ROM'u olacaktır (md5sum 811b027eaf99c2def7b933c5208636de - ABD sürümü, Japonca sürümüyle tamamen aynıdır, bu nedenle çalışacak, ROM genellikle etiketli Super Mario Bros (JU) (PRG 0)
veya benzeridir).
Gönderimleri test etmek için programları çalıştıracağım, stdout
onları bir input.txt dosyasına aktaracağım ve mario.lua
bu meydan okuma için yazdığım Lua betiğini kullanarak FCEUX'a yükleyeceğim :
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;
Kullanacağım belirli komut fceux mario.nes --loadlua mario.lua
. Programların herhangi bir zaman sınırı yoktur, ancak sonunda sona erdirmeleri gerekir.
Bu, FCEUX film (.fm2) dosyasını betiğim için bir input.txt dosyasına dönüştürmek için yaptığım küçük bir Bash tek-liner:
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
Başvuru için, burada Dünya 1-1'in tam çözünürlüklü bir haritası var (resmi tam çözünürlük için yeni bir sekmede aç): (kaynak: mariouniverse.com )
Not: İlk bakışta, bu benim input.txt dosyamdaki bir Kolmogorov karmaşıklığı mücadelesi gibi görünebilir. Ancak, gerçekte, zorluk bundan daha karmaşık çünkü (a) sağladığım girdi.txt kesinlikle mümkün olan en kısa yol değil ve (b) bu formatta SMB için mümkün olan en kısa tuşa basma kümesini yaratma girişimi hiç olmadı . 'Mümkün olan en az sayıda düğme' bilinen TAS farklıdır, çünkü düğmelere uzun süre basılı tutulmasına izin verir, bu da bu zorlukla istenen çıktıya uzunluk katar.