TAS Golf
Theo phong cách của một trò chơi tốc độ được hỗ trợ bằng công cụ với một cú đánh golf mã, mục tiêu của thử thách này là hoàn thành World 1-1 của trò chơi Super Mario Bros gốc cho NES bằng ngôn ngữ lập trình đã chọn của bạn với càng ít byte càng tốt, chỉ sử dụng các đầu vào bộ điều khiển trong trò chơi theo định dạng tôi sẽ mô tả bên dưới. Chương trình của bạn phải xuất ra stdout
một danh sách các dòng theo định dạng này, được tạo riêng cho thử thách này:
up down left right start select A B
Bắt đầu với khung đầu tiên, mỗi dòng mới đại diện cho các đầu vào cho Bộ điều khiển 1 cho một khung cụ thể. Thứ tự các nút trên mỗi khung không quan trọng và chúng có thể được phân tách bằng bất kỳ khoảng trắng không phải dòng mới nào. Tất cả hoặc không hoặc một số tên nút có thể được bao gồm trên mỗi dòng. Ví dụ: một chương trình Python đơn giản nhấn phím D bên phải cho 3 khung và sau đó nhấn A có thể trông như thế này:
for _ in range(3): print('right')
print('A')
Và đầu ra của nó (mà tôi sẽ đưa vào trình giả lập để xác minh) sẽ là:
right
right
right
A
Ở đây, chúng tôi định nghĩa "thành công" là đạt được lá cờ ở cuối Thế giới 1-1 như hình trên. Điểm cho bài nộp Python này, nếu nó thành công (không thành công), sẽ là 44 byte hoặc độ dài ban đầu của chương trình Python.
Để biết ví dụ về tệp đầu vào mà tôi đã tạo dựa trên TAS nhanh nhất hiện tại , hãy xem Github Gist này: https://gist.github.com/anonymous/6f1a73cbff3cd46c9e1cf8d5c2ff58e1 Lưu ý rằng tệp này hoàn thành toàn bộ trò chơi.
Không có cách nào để nhập đầu vào khung con . Cũng không có cách nào để nhập dữ liệu đầu vào trong bộ điều khiển của Người chơi 2, nhưng điều đó cũng không cần thiết (hoặc hữu ích) để hoàn thành cấp độ hoặc trò chơi.
Phiên bản SMB được sử dụng sẽ là ROM iNES gốc Hoa Kỳ / Nhật Bản (md5sum 811b027eaf99c2def7b933c5208636de - phiên bản USA giống hệt như phiên bản tiếng Nhật nên sẽ hoạt động, ROM thường được dán nhãn Super Mario Bros (JU) (PRG 0)
hoặc tương tự).
Để kiểm tra các bài nộp, tôi sẽ chạy các chương trình, chuyển chúng stdout
vào tệp input.txt và tải chúng vào FCEUX bằng tập lệnh Lua này mario.lua
tôi đã viết cho thử thách này:
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;
Lệnh cụ thể tôi sẽ sử dụng là fceux mario.nes --loadlua mario.lua
. Không có giới hạn thời gian cho các chương trình, mặc dù cuối cùng chúng phải chấm dứt.
Đây là một đoạn Bash nhỏ mà tôi đã thực hiện để chuyển đổi tệp phim FCEUX (.fm2) thành input.txt cho tập lệnh của mình, nếu nó giúp:
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
Để tham khảo, đây là bản đồ độ phân giải đầy đủ của Thế giới 1-1 (mở hình ảnh trong tab mới để có độ phân giải đầy đủ): (nguồn: mariouniverse.com )
Lưu ý: Thoạt nhìn, điều này có vẻ giống như một thách thức phức tạp Kolmogorov trên tệp input.txt đã cho của tôi. Tuy nhiên, trong thực tế, thách thức phức tạp hơn thế bởi vì (a) input.txt tôi cung cấp chắc chắn không phải là ngắn nhất có thể và (b) chưa bao giờ có nỗ lực tạo ra bộ phím bấm ngắn nhất có thể cho SMB theo định dạng này . TAS có ít nút nhất có thể 'TAS khác nhau vì nó cho phép giữ các nút trong một thời gian dài, điều này sẽ thêm chiều dài cho đầu ra mong muốn trong thử thách này.