TAS Golf
ในรูปแบบของspeedrun ที่ได้รับการช่วยเหลือจากเครื่องมือด้วยการหมุนรหัส - กอล์ฟเป้าหมายของความท้าทายนี้คือการทำให้เกมSuper Mario Brosดั้งเดิมของWorld 1-1เสร็จสมบูรณ์สำหรับ NES ในภาษาโปรแกรมที่คุณเลือกในเวลาไม่กี่ไบต์เท่าที่จะเป็นไปได้ ใช้อินพุตควบคุมในเกมในรูปแบบที่ฉันจะอธิบายด้านล่าง โปรแกรมของคุณจะต้องส่งออกไปยังรายการบรรทัดในรูปแบบนี้ซึ่งสร้างขึ้นสำหรับความท้าทายนี้โดยเฉพาะ:stdout
up down left right start select A B
เริ่มต้นด้วยเฟรมแรกแต่ละบรรทัดใหม่แสดงถึงอินพุตสำหรับคอนโทรลเลอร์ 1 สำหรับเฟรมเฉพาะ ลำดับของปุ่มต่อเฟรมไม่สำคัญและสามารถแยกออกจากกันด้วยจำนวนของพื้นที่ว่างที่ไม่ใช่บรรทัดใหม่ ชื่อปุ่มทั้งหมดหรือทั้งหมดหรือบางส่วนสามารถรวมต่อบรรทัดได้ ตัวอย่างเช่นโปรแกรม Python อย่างง่ายที่กด D-pad ไปทางขวา 3 เฟรมจากนั้นกด A อาจมีลักษณะเช่นนี้:
for _ in range(3): print('right')
print('A')
และเอาท์พุทของมัน (ซึ่งฉันจะป้อนลงในโปรแกรมจำลองการของฉันเพื่อตรวจสอบ) จะเป็น:
right
right
right
A
ที่นี่เรานิยาม 'ความสำเร็จ' ในการเข้าถึงธงเมื่อสิ้นสุด World 1-1 ดังภาพด้านบน คะแนนสำหรับการส่ง Python ตัวอย่างนี้ถ้าทำสำเร็จ (ซึ่งไม่เป็น) จะเป็น44 ไบต์หรือความยาวดั้งเดิมของโปรแกรม Python
สำหรับตัวอย่างไฟล์อินพุตที่ใช้งานได้ที่ฉันสร้างขึ้นตามTAS ที่เร็วที่สุดในปัจจุบันให้ดู Github Gist นี้: https://gist.github.com/anonymous/6f1a73cbff3cd46c9e1cf8d5c2ff58e1โปรดทราบว่าไฟล์นี้เสร็จสิ้นทั้งเกม
ไม่มีทางที่จะใส่ไม่เป็นปัจจัยการผลิตเฟรม นอกจากนี้ยังไม่มีวิธีป้อนอินพุตในคอนโทรลเลอร์ของผู้เล่น 2 แต่ก็ไม่จำเป็นเช่นกัน (หรือมีประโยชน์) สำหรับการจบระดับหรือเกม
เวอร์ชันของ SMB ที่ใช้จะเป็น USA / Japan iNES ROM ดั้งเดิม (md5sum 811b027eaf99c2def7b933c5208636de - เวอร์ชั่น USA นั้นเหมือนกันกับเวอร์ชั่นญี่ปุ่นดังนั้นจะใช้งานได้ ROM จะมีป้ายกำกับSuper Mario Bros (JU) (PRG 0)
หรือคล้ายกัน)
เพื่อทดสอบการส่งฉันจะเรียกใช้โปรแกรมstdout
ไพพ์ของพวกเขาลงในไฟล์ input.txt และโหลดมันลงใน FCEUX โดยใช้สคริปต์ Lua ที่mario.lua
ฉันเขียนสำหรับความท้าทายนี้:
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;
fceux mario.nes --loadlua mario.lua
คำสั่งเฉพาะผมจะใช้เป็น ไม่มีการ จำกัด เวลาสำหรับโปรแกรมแม้ว่าในที่สุดพวกเขาจะต้องยุติการทำงาน
นี่เป็น Bash one-liner เล็ก ๆ น้อย ๆ ที่ฉันสร้างขึ้นเพื่อแปลงไฟล์ภาพยนตร์ FCEUX (.fm2) เป็น input.txt สำหรับสคริปต์ของฉันถ้ามันช่วย:
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
สำหรับการอ้างอิงนี่คือแผนที่ความละเอียดเต็มของ World 1-1 (เปิดภาพในแท็บใหม่สำหรับความละเอียดเต็ม): (แหล่งที่มา: mariouniverse.com )
หมายเหตุ: จากภาพรวมครั้งแรกสิ่งนี้อาจดูเหมือนความท้าทายที่ซับซ้อนของ Kolmogorov ในไฟล์ input.txt ที่ฉันได้รับ อย่างไรก็ตามในความเป็นจริงความท้าทายนั้นซับซ้อนกว่านั้นเนื่องจาก (a) input.txt ที่ฉันให้ไว้ไม่ได้สั้นที่สุดและ (b) ไม่เคยมีความพยายามในการสร้างชุดคีย์เพรสที่สั้นที่สุดเท่าที่จะเป็นไปได้สำหรับ SMB ในรูปแบบนี้ . 'ปุ่มน้อยที่สุดที่เป็นไปได้' TAS ที่รู้จักนั้นแตกต่างกันเพราะช่วยให้กดปุ่มค้างไว้เป็นเวลานานซึ่งจะเพิ่มความยาวให้กับเอาต์พุตที่ต้องการในความท้าทาย