TASゴルフ
コードゴルフツイストを備えたツールアシストスピードランのスタイルで、この課題の目標は、選択したプログラミング言語で元のスーパーマリオブラザーズゲームのワールド1-1をできるだけ少ないバイトで完了することです。以下で説明する形式のゲーム内コントローラー入力のみを使用します。プログラムは、このチャレンジ専用に作成されたこの形式の行のリストに出力する必要があります。stdout
up down left right start select A B
最初のフレームから開始して、各改行は特定のフレームのコントローラー1の入力を表します。フレームごとのボタンの順序は重要ではなく、任意の量の改行以外の空白で区切ることができます。ボタン名のすべてまたはすべて、または一部を行ごとに含めることができます。たとえば、Dパッドを3フレーム右に押してからAを押す単純なPythonプログラムは次のようになります。
for _ in range(3): print('right')
print('A')
そして、その出力(検証のためにエミュレータに入力します)は次のようになります。
right
right
right
A
ここでは、「成功」を、上記の世界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ファイルにパイプして、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
です。プログラムは最終的に終了する必要がありますが、プログラムに時間制限はありません。
これは、FCEUXムービー(.fm2)ファイルをスクリプト用のinput.txtに変換するために作成した小さなBashワンライナーです。
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ファイルでのコルモゴロフの複雑さの挑戦のように思えるかもしれません。ただし、実際には、チャレンジはそれよりも複雑です。なぜなら、(a)私が提供したinput.txtは明らかに最短ではなく、(b)この形式でSMBの最短のキー押下セットを作成しようとしたことがないためです。 。TASで知られている「可能な最小のボタン」は、ボタンを長時間保持できるため、この課題で望ましい出力に長さが追加されるため、異なります。