Mã công cụ hỗ trợ


39

TAS Golf

Kết thúc SMB1 1-1

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 stdoutmộ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 stdoutvào tệp input.txt và tải chúng vào FCEUX bằng tập lệnh Lua này mario.luatô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 )Thế giới 1-1

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.


1
Mặc dù bạn đã cung cấp một video về cấp độ, tôi không thể đếm được có bao nhiêu quyền trong video. Bạn có thể cho chúng tôi biết những động thái cần thiết?

1
Bạn đã đăng cái này trong Sandbox? Tôi không nhớ nó.

1
Tôi nghĩ thật buồn cười khi bạn có 16 lượt upvote và không có câu trả lời :)

2
@JackBates đó là dấu hiệu của một câu hỏi hay, thách thức, không tầm thường
FlipTack

1
404 trên hình ảnh bản đồ độ phân giải đầy đủ mà tôi nghĩ
Liam

Câu trả lời:


20

Python 2, 69 48 46 44 byte

print"start\n\n"*19+(27*"A right\n"+"\n")*99

Xem nó trong hành động trên youtube!

Tự động tìm thấy với (một phiên bản sửa đổi) của tập lệnh hack này:

start = 18
oncycle = 21
offcycle = 4


while true do
    emu.poweron()
    -- emu.speedmode("maximum")

    starting = 0
    i = 0
    frames = 0
    last_mario_x = -1

    emu.message(start .. " " .. oncycle .. " ".. offcycle)


    state = 0
    while state ~= 6 and state ~= 11 and frames < 4000 do
        if frames > 500 and frames % 100 == 0 then
            mario_x = memory.readbyte(0x6D) * 0x100 + memory.readbyte(0x86)
            if mario_x == last_mario_x then emu.message("stuck " .. mario_x .. " " .. last_mario_x); break end
            last_mario_x = mario_x
        end

        if starting < start then
            joypad.set(1, {start=1})
            emu.frameadvance(); frames = frames + 1;
            joypad.set(1, {})
            emu.frameadvance(); frames = frames + 1;
            starting = starting + 1
        else
            if i < oncycle then
                joypad.set(1, {A=1, B=1, right=1})
                i = i + 1
            else
                joypad.set(1, {})
                i = i +  1
                if i == oncycle + offcycle then
                    i = 0
                end
            end

            emu.frameadvance()
            frames = frames + 1
        end

        state = memory.readbyte(0x000E)
        if state == 4 then
            emu.message("success!")
            os.exit()
            break
        end

    end

    if start < 30 then
        start = start + 1
    elseif offcycle < 10 then
        start = 18
        offcycle = offcycle + 1
    else
        offcycle = 1
        oncycle = oncycle + 1
    end
end

1
@Harry Vui lòng xác minh phiên bản mới.
orlp

1
@Harry Tôi vừa thêm một phiên bản mới khác tiết kiệm thêm 2 byte bằng cách ... không sử dụng nút B! Nó hầu như không phù hợp với 99 lần lặp lại, gần như phải lãng phí một byte khi thực hiện hơn 100 lần lặp lại.
orlp

1
Phiên bản 44 byte cũng được xác nhận, rất thú vị để xem!
Harry

1
Ahh, đây là loại câu trả lời tôi sẽ tìm, nhưng tôi không thể tìm đúng số !! Hoàn thành rất tốt.
Lynn

1
@Harry Đây là bản ghi âm của tôi: youtube.com/watch?v=2-I1EEOlQYA
orlp

5

Python 2, 107 byte

i=0
print'\n'*33+'start'
for c in'~~22 +  2 2? @  F        . \r0'+'@'*10:print'A B right\n'[i:]*ord(c);i^=2

Rất ấn tượng và đã ngắn hơn nhiều so với tôi nghĩ! Có lẽ tôi nên bị mắc kẹt với trò chơi đầy đủ sau tất cả, haha. Ngoài ra tôi đã thử nghiệm điều này và có thể xác nhận nó hoàn thành cấp độ, nếu tôi có thể lấy nó để ghi lại có thể tôi sẽ tải lên tất cả dưới dạng video YouTube!
Harry

1

JavaScript (ES6), 59 ký tự

_=>`start

`[a="repeat"](19)+(`A right
`[a](27)+`
`)[a](99)

Điều này xuất ra văn bản tương tự như câu trả lời của orlp . Bản thân tôi đã cố gắng đưa ra một phương pháp tốt hơn, nhưng những bộ phim tôi chuyển đổi thành input.txttập tin không phải lúc nào cũng phát đúng. Bất cứ khi nào tôi thử chạy trình giả lập từ cmd, tôi đều gặp lỗi "an unknown error occurred".


Không thể chạy nó ngay bây giờ với mục đích của tôi, nhưng nếu nó xuất ra cùng một input.txt như câu trả lời của orlp thì chúng tôi sẽ gọi nó được xác minh!
Harry
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.