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