辅助工具高尔夫


39

塔斯高尔夫

SMB1 1-1结束

在风格TAS竞速一个代码高尔夫扭曲,这一挑战的目标是完成世界1-1原来的超级马里奥兄弟中的几个字节尽可能游戏在你选择的编程语言中的NES,仅使用我将在下面描述的格式的游戏内控制器输入。您的程序必须以stdout这种格式输出到专门为此挑战创建的行列表:

up down left right start select A B

从第一帧开始,每条换行符代表特定帧的Controller 1输入。每帧按钮的顺序无关紧要,它们可以用任意数量的非换行空格分隔。每行可以包含全部或不包含或包含一些按钮名称。例如,一个简单的Python程序向右按D-pad 3帧,然后按A可能看起来像这样:

for _ in range(3): print('right')
print('A')

其输出(我将输入我的仿真器进行验证)将是:

right
right
right
A

在这里,我们将“成功”定义为到达上图所示的世界1-1末尾的旗帜。此示例Python提交的得分(如果成功)(如果没有成功),将为44字节,即Python程序的原始长度。

有关基于当前最快的TAS创建的示例工作输入文件,请参见以下Github要点:https : //gist.github.com/anonymous/6f1a73cbff3cd46c9e1cf8d5c2ff58e1注意,此文件可以完成整个游戏。

无法输入子帧输入。也没有办法在Player 2的控制器中输入输入,但是这对于完成关卡或游戏也不是必需的(或有用的)。

使用的SMB版本将是原始的美国/日本iNES ROM(md5sum 811b027eaf99c2def7b933c5208636de-美国版本与日语版本完全相同,因此可以使用,通常使用ROM标记Super Mario Bros (JU) (PRG 0)或相似)。

为了测试提交的内容,我将运行程序,将它们通过管道stdout输入到input.txt文件中,然后使用mario.lua我为该挑战编写的Lua脚本将其加载到FCEUX中:

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一小段代码,用于将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世界1-1

注意:乍看之下,这似乎对我给定的input.txt文件来说是Kolmogorov复杂性的挑战。但是,实际上,挑战比这要复杂得多,因为(a)我提供的input.txt绝对不是最短的时间,并且(b)从未尝试过以这种格式为SMB创建最短的按键集。TAS已知的“可能的按钮最少”是不同的,因为它允许长时间保持按钮,这将增加挑战中所需输出的长度。


1
您提供了该级别的视频后,我无法计算该视频中有多少权限。您能告诉我们所需的举动吗?

1
您将其发布在沙盒中了吗?我不记得了

1
我认为这很有趣,您有16票赞成票,但没有答案:)

2
@JackBates这是一个很好的,具有挑战性的,不平凡的问题的信号
FlipTack

1
我认为是该全分辨率地图图像上的404
Liam

Answers:


20

Python 2,69 48 46 44字节

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

在youtube上观看效果!

自动发现此hacky脚本(的修改版本):

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请验证新版本。
orlp

1
@Harry我刚刚添加了另一个新版本,该版本通过不使用B按钮又节省了2个字节!它几乎不适合99个重复,几乎不得不在执行100个以上重复时浪费一个字节。
orlp

1
还确认了44字节版本,观看很有趣!
哈里

1
啊,这就是我想要的答案,但是我找不到正确的数字!做得非常好。
林恩

1
@Harry,这是我的录音:youtube.com/watch?
v=

5

Python 2,107个字节

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

非常令人印象深刻,已经比我想象的要短得多!也许我毕竟应该坚持完整的游戏,哈哈。我也对此进行了测试,可以确认它是否完成了水平。如果我可以记录下来,也许我会将它们全部上传为YouTube视频!
哈里

1

JavaScript(ES6),59个字符

_=>`start

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

这将输出与orlp的答案相同的文本。我本人尝试提出一种更好的方法,但是转换为input.txt文件的电影并不总是可以正常播放。每当我尝试从cmd运行仿真器时,都会显示错误消息"an unknown error occurred"


目前无法在我端运行它,但是如果它输出的输入与奥尔普的答案相同,那么我们将其称为已验证!
哈里
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.