テキストアドベンチャーゲームには、かなり定式化されています。一連の部屋/スペースで構成される世界があり、プレイヤーはこれらの部屋を動き回ることができ、部屋にはいくつかのアイテムがあります。アイテムはプレイヤーが拾い上げ、置いて、他の部屋(鍵など)にアクセスするために使用し、他のアイテムと組み合わせて新しいアイテムを作成できます。
チャレンジ
あなたの課題は、テキストアドベンチャーランタイムを最小限のバイト(コードゴルフ)で記述することです。物事を単純にするために、あなたがする必要があるのは、与えられた一連のコマンドが与えられたゲームに勝つかどうかに応じて、真実または偽の値を出力することです(対話性、人間に優しい出力などはありません)
ゲームのルール
- 世界は常に、接続された10の部屋がある廊下で構成されています。各部屋には入室するためのキーが必要ですが、キーなしでいつでも退出することができます(だから、ある種のラッチロックだと思います)。
- プレイヤーは部屋0から始まり、部屋9に入れば勝ちます(部屋9に到達すると、別の部屋に行くなど、好きなことを行うことができ、勝ちます)。
- 各部屋には、任意の数のアイテムを含めることができます。
- AZという名前のアイテムは最大26個あり、世界中でアイテムが複数回表示されることはありません。
- プレイヤーは、現在の部屋からアイテムを拾ってインベントリに入れることができます(インベントリからアイテムを現在のルームにドロップすることもできます)。
- プレーヤーの最大インベントリサイズは有限であり、レベルの詳細が提供されます。
- ゲームの開始時には、プレイヤーのインベントリは常に空です。
- ルーム内のアイテムの最大数に制限はありません(ただし、アイテムの総数であるため、暗黙的な制限は26になります)。
- アイテムAJは、0から9の部屋に入るために使用できるキーです(つまり、プレーヤーはアイテムAがある場合は部屋0に、Bがある場合は部屋1に移動できます。部屋を出るためにキーは必要ありません。プレーヤーは部屋0から始まるため、キー「A」はプレーヤーが戻りたい場合にのみ必要です。部屋0。
- プレーヤーのインベントリ内のアイテムを組み合わせて、新しいアイテム(プレーヤーのインベントリ内に作成されます)を作成できます。許可された組み合わせには、レベルの詳細が提供されます。
- アイテムを結合すると、元のアイテムが消費されます(つまり、アイテムの1つがキーだった場合、そのキーを使用することはできなくなります)。
- プレイヤーが不可能なことをしようとする場合(例えば、現在の部屋にないアイテムを拾う/持っていないアイテムをドロップする/持っていないアイテムを組み合わせる/鍵のない部屋に行くのため)、何も起こらず、継続することができます。
- プレイヤーは決して意味のないコマンドを出すことはありません(部屋11に行くなど)。
したがって、単純なゲームは次のようになります。
v
+---+---+---+---+---+---+---+---+---+---+
| C | | J | | | | | | | |
+---+---+---+---+---+---+---+---+---+---+
| CORRIDOR |
+---------------------------------------+
Inventory capacity: 99
部屋0にはアイテム「C」が含まれています(これは部屋2の鍵です)。部屋2にはアイテム「J」が含まれています(これは部屋9の鍵です)。プレイヤーは、Cを拾い、部屋2に移動し、Jを拾い、次に部屋9に移動することでゲームに勝つことができます。
より複雑なゲームは次のとおりです。
v
+---+---+---+---+---+---+---+---+---+---+
| C | | X |YZ | | | | | | |
+---+---+---+---+---+---+---+---+---+---+
| CORRIDOR |
+---------------------------------------+
Inventory capacity: 10
C+X => D
Y+Z => J
プレイヤーは、Cを拾い、部屋2に移動し、Xを拾い、CとXを組み合わせてDを作成し、次に部屋3に移動することで勝つことができます。部屋9に移動します。
入力フォーマット
処理する入力がかなりあり、それはかなり退屈なタスクなので、入力形式は非常に柔軟です。次のデータを取得します。プログラムへの送信方法は、主にユーザー次第です。
- 各部屋の初期内容(各部屋の0個以上のアイテムのリスト);
- 許可されたアイテムの組み合わせのコレクション(それぞれに2つの入力アイテムとその出力アイテムが含まれます。入力アイテムは順序付けられていないことに注意してください)。
- 最大在庫サイズ(整数、0 <=サイズ<= 26);
- プレーヤーが試行したコマンドのリスト。
プレーヤーのコマンドは次のとおりです。
[P]ick up <item>
-部屋からアイテムをピックアップし、プレイヤーのインベントリに入れます(スペースがある場合)[D]rop <item>
-プレイヤーのインベントリから現在の部屋にアイテムをドロップします[C]ombine <item1> <item2>
-プレイヤーのインベントリ内の2つのアイテムを組み合わせて、新しいアイテムを作成します[G]o to <room>
-プレイヤーが必要なキーを持っている場合、選択した部屋に移動します
たとえば、テストに使用した入力形式は、単純なプログラム引数でした。
./adventure YZ '' '' '' '' '' '' '' '' '' 1 YZJ 2 PY PZ CYZ G9
# r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 combinations inv. size commands...
# means:
# room 0 starts with items Y & Z, all other rooms start empty
# 1 combination is possible: Y+Z => J
# max inventory size is 2
# player commands are [P]ick up Y, [P]ick up Z, [C]ombine Y and Z, [G]o to room 9
# (in this example, the player wins)
しかし、他の形式で簡単にできる場合は、それで問題ありません(たとえば、特殊な区切り文字/複数行/異なる順序付け/ JSONへのシリアル化など)
出力フォーマット
プレイヤーのコマンドによってゲームに勝つ場合、プログラムはいくつかの真実の出力を返し、そうでない場合は偽の出力を返します。これは、stdoutへの認識可能なメッセージ、プログラムの戻りコード、または選択した言語が提供するものである可能性があります。他のすべての出力は無視されます。
テストケース
次のbashスクリプトは、ほとんどの状況をチェックするテストハーネスを提供します。上記の形式を使用するように記述されていますが、別の形式を使用するように変更すると、invoke
関数に変換が追加されます。
#!/bin/sh
PROG="$1";
if [[ -z "$PROG" ]]; then
echo "Usage: $0 <program-to-test>";
exit 1;
fi;
function invoke {
"$PROG" "$@"
}
RED="\033[1;31m";
GREEN="\033[1;32m";
RESET="\033[m";
FAILURES="0";
function pass {
if ! invoke "$@" >/dev/null 2>&1; then
echo "${RED}Expected pass, got fail:${RESET} $*" >&2;
(( FAILURES = "$FAILURES" + 1 ));
invoke "$@" 2>&1;
fi;
}
function fail {
if invoke "$@" >/dev/null 2>&1; then
echo "${RED}Expected fail, got pass:${RESET} $*" >&2;
(( FAILURES = "$FAILURES" + 1 ));
invoke "$@" 2>&1;
fi;
}
echo "Running tests...";
# R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 C I Cmd...
pass J '' '' '' '' '' '' '' '' '' 0 9 PJ G9;
fail '' J '' '' '' '' '' '' '' '' 0 9 PJ G9;
pass J '' '' '' '' '' '' '' '' '' 0 9 PJ PJ G9;
fail J '' '' '' '' '' '' '' '' '' 0 9 PJ;
fail J '' '' '' '' '' '' '' '' '' 0 9 G9;
pass J '' '' '' '' '' '' '' '' '' 0 9 G9 PJ G9;
pass J '' '' '' '' '' '' '' '' '' 0 1 PJ G9;
fail J '' '' '' '' '' '' '' '' '' 0 0 PJ G9;
fail J '' '' '' '' '' '' '' '' '' 0 9 PJ DJ G9;
fail J '' '' '' '' '' '' '' '' '' 0 9 PJ PJ DJ G9;
pass J '' '' '' '' '' '' '' '' '' 0 9 PJ DJ PJ G9;
pass J '' '' '' '' '' '' '' '' '' 0 9 PJ DJ PJ G9;
pass B CJ '' '' '' '' '' '' '' '' 0 2 PB G1 DB PC PJ G9;
fail B CJ '' '' '' '' '' '' '' '' 0 2 PB G1 DB PB PC PJ G9;
pass AJ '' '' '' '' '' '' '' '' '' 0 2 PA PJ G9;
pass B D '' J '' '' '' '' '' '' 0 2 PB G1 PD G3 DB PJ G9;
fail B D '' J '' '' '' '' '' '' 0 2 PB G1 PD G2 DB PJ G9;
fail B D '' J '' '' '' '' '' '' 0 2 PB G1 PD G3 PJ G9;
fail B D J C '' '' '' '' '' '' 0 2 PB G1 PD G3 PJ G9;
pass AJ '' '' '' '' '' '' '' '' '' 0 2 PA PJ G9 G0;
fail ADJ '' '' '' '' '' '' '' '' '' 0 3 PA PD PJ G3 DJ G0 PJ G9;
pass ADJ '' '' '' '' '' '' '' '' '' 0 3 PA PD PJ G3 DJ G0 G3 PJ G9;
fail ADJ '' '' '' '' '' '' '' '' '' 0 3 PA PD PJ G3 DJ G0 DD G3 PJ G9;
pass ADJ '' '' '' '' '' '' '' '' '' 0 3 PA PD PJ DD G3 DJ G0 DD G3 PJ G9;
fail ADJ '' '' '' '' '' '' '' '' '' 0 1 PA DA DA PD PJ G9;
pass ADJ '' '' '' '' '' '' '' '' '' 0 1 PA DA DA PJ G9;
fail ABCDEFGHIKLMNOPQRSTUVWXYZ J '' '' '' '' '' '' '' '' 0 26 PA PB PC PD PE PF PG PH PI PJ PK PL PM PN PO PP PQ PR PS PT PU PV PW PX PY PZ G9;
pass ABCDEFGHIJKLMNOPQRSTUVWXYZ '' '' '' '' '' '' '' '' '' 0 26 PA PB PC PD PE PF PG PH PI PJ PK PL PM PN PO PP PQ PR PS PT PU PV PW PX PY PZ G9;
fail YZJ '' '' '' '' '' '' '' '' '' 0 2 PY PZ CYZ PJ G9;
pass YZJ '' '' '' '' '' '' '' '' '' 1 YZW 2 PY PZ CYZ PJ G9;
pass YZJ '' '' '' '' '' '' '' '' '' 1 YZW 2 PY PZ CYZ PJ CWJ G9;
fail XYZJ '' '' '' '' '' '' '' '' '' 1 YZW 2 PY PZ CYZ PX PJ G9;
fail XYZJ '' '' '' '' '' '' '' '' '' 1 YZW 2 PY PZ CYZ PX DY DZ PJ G9;
pass XYZJ '' '' '' '' '' '' '' '' '' 1 YZW 2 PY PZ CYZ PX DW PJ G9;
pass YZ '' '' '' '' '' '' '' '' '' 1 YZJ 2 PY PZ CYZ G9;
fail YZ '' '' '' '' '' '' '' '' '' 1 YZJ 2 CYZ G9;
pass YZ '' '' '' '' '' '' '' '' '' 1 YZJ 2 PY PZ CYZ CYZ G9;
fail YZ '' '' '' '' '' '' '' '' '' 1 YZJ 2 PY PZ CYZ DJ CYZ G9;
fail YZ '' '' '' '' '' '' '' '' '' 1 YZJ 2 PY PZ CYZ DJ PY PZ CYZ G9;
fail WZ '' '' '' '' '' '' '' '' '' 1 YZJ 2 PW PZ CYZ G9;
fail WZ '' '' '' '' '' '' '' '' '' 1 YZJ 2 PY PZ CYZ G9;
pass YZ '' '' '' '' '' '' '' '' '' 1 YZJ 2 PY PZ CZY G9;
pass YZ '' '' '' '' '' '' '' '' '' 1 ZYJ 2 PY PZ CYZ G9;
fail YZ '' '' '' '' '' '' '' '' '' 1 YZJ 1 PY PZ CYZ G9;
fail YZ '' '' '' '' '' '' '' '' '' 1 YZJ 1 PY PZ CYZ PY PZ CYZ G9;
fail YZ '' '' '' '' '' '' '' '' '' 1 YZJ 1 PY PZ CYZ PJ G9;
fail YZ '' '' '' '' '' '' '' '' '' 1 YZJ 1 PJ G9;
pass BW UV '' '' '' '' '' '' '' '' 3 BUR WVS RSJ 2 PB PW G1 DW PU CBU DR PW PV CVW PR CRS G9;
fail BW AUV '' '' '' '' '' '' '' '' 3 BUR WVS RSJ 2 PB G1 PU CBU DR PA PB G0 DA PW G1 PV CVW PR CRS G9;
pass BCW AUV '' '' '' '' '' '' '' '' 3 CUR WVS RSJ 2 PB PC G1 DB PU CCU DR PC PA PB G0 DA PW G1 DB PV CVW PR CRS G9;
fail BCW UV '' '' '' '' '' '' '' '' 3 CUR WVS RSJ 2 PB PC G1 DB PU CCU DR PC PA PB G0 DA PW G1 DB PV CVW PR CRS G9;
fail BCW AUV '' '' '' '' '' '' '' '' 3 CUR WVS RSJ 2 PB PC G1 DB PU CCU PA PB G0 DA PW G1 DB PV CVW PR CRS G9;
fail BCW AUV '' '' '' '' '' '' '' '' 3 CUR WVS RSJ 2 PB PC G1 DB PU CCU DR PA G0 DA PW G1 DB PV CVW PR CRS G9;
fail BCW AUV '' '' '' '' '' '' '' '' 3 CUR WVS RSJ 2 PB PC G1 DB PU CCU DR PB G0 DA PW G1 DB PV CVW PR CRS G9;
fail BCW AUV '' '' '' '' '' '' '' '' 3 CUR WVS RSJ 2 PB PC G1 DB PU CCU DR PA PB G0 DA G1 DB PV CVW PR CRS G9;
fail BCW AUV '' '' '' '' '' '' '' '' 3 CUR WVS RSJ 2 PB PC G1 DB PU CCU DR PA PB G0 DA PW G1 DB CVW PR CRS G9;
pass BFK LG M N O CDE PQR U W '' 10 BPT CQS TSH HUI IWV VFA GRX MXZ ANY YZJ 5 \
PB PF PK G1 PL PG G6 DB DK DL G5 PC PD PE G6 DF G2 PM G6 DM DC G3 PN G4 PO G6 DN DO DD DE \
PB PP CBP PC PQ CCQ CTS G7 PU CUH G8 PW CWI G6 PF CVF PR PM PN CGR CMX CAN CYZ G9
fail BFK LG M N O CDE PQR U W '' 10 BPT CQS TSH HUI IWV VFA GRX MXZ ANY YZJ 5 \
PB PF PK G1 PL PG G6 DB DK DL G5 PC PD PE G6 DF G6 DM DC G3 PN G4 PO PM G6 DN DO DD DE \
PB PP CBP PC PQ CCQ CTS G7 PU CUH G8 PW CWI G6 PF CVF PR PM PN CGR CMX CAN CYZ G9
if (( "$FAILURES" == "0" )); then
echo "${GREEN}All tests passed${RESET}";
else
echo "${RED}Total failures: $FAILURES${RESET}";
fi;
勝ち
標準コードゴルフ:最短コード(バイト単位)が勝ちます。エントリはゲームルールに従う必要があります。実際には、すべてのテストケースに合格する必要があります(必要に応じて、さらにテストを追加できます)。