ローグライクパスファインディング
あなたのタスクは、ダンジョンを表す以下に説明する要素の2次元配列を与えられ、怪物を起こさずにローグが収集できる金貨の量を表す単一の数値を出力または返すことです。
配列の要素は次のとおりです。
- 空のスペースは
.
、コールのいずれかまたはスペースで表されます。 - Rogueの開始位置は、もちろん次のように表され
@
ます。 - 金色のピースは
$
; で表されます。 - 壁はで表され
#
ます。 - モンスターは、次の正規表現の文字で表されます
[a-zA-Z*&]
。
配列には上記以外の文字が含まれてはならないため、壁、空きスペース、ならず者、または金のピース以外のものはすべてモンスターであると想定できます。
経路探索のルールは次のとおりです。
- 悪党は空のセルまたは金を含むセルのみを通過できます。
- 隣接するセルまたは斜めに隣接するセルに移動するにはターンが必要です。
- 金を手に入れるのは瞬時です。
- ならず者は目を覚ますことなく、モンスターに1ターン以上隣接したり斜めに隣接したりすることはできません。
- ならず者は何回でもモンスターの認識エリアに入ることができ、モンスターは近くで2 ターン連続してモンスターを目覚めさせます。
入出力規則
入力は、2次元配列、フラット配列、文字列など、あらゆる妥当な形式で取得できます。作業が楽になる場合は、配列の次元も取得できます。
不正は最初はモンスターの近くにいないことが保証されています。
完全なプログラムまたは機能は問題ありません。
得点
これはcode-golfであり、スコアは提出物のバイト数であり、少ないほうが良いです。
テストケース
読みやすくするために、ここでは空のスペースにドットを使用しています。スペースを使用したい場合は、上記を参照してください。また、これは不正が常に左上隅にあるという単なる偶然の一致であり、コードは他の有効な位置も処理する必要があることに注意してください。
1)
@..
.$.
... -> 1
ただ健全性テスト。
2)
@....
...g$
..... -> 0
再び、健全性テスト。
3)
@....
...$g
..... -> 1
悪党は左から入ることで金をつかむことができます。
4)
@....g..
.......$
........
.....h.. -> 1
ならず者はモンスターの間でジグザグに動き、それぞれの近くに1ターン以上滞在することはありません。
5)
@....z..
.......$
.....b.. -> 0
前のテストケースの戦術はここでは機能しません-モンスターの感度領域は重複しています。
6)
@$#.
###$
.... -> 1
健全性テスト。
7)
@..#..
$.$g.$
...#.. -> 2
同上。
8)
@#.d#$
$...##
e.....
..$...
##..$b
.#..g$ -> 3
ここにあるすべての金のうち、安全に到達できるのは3つだけです。開始位置の近くの金は、1つ下に移動してから開始位置に戻すことで取得できます。左上隅から脱出するには、ローグは右下に2回斜めに移動する必要があります。真ん中の金は問題ありません。外側金によって守らg
やb
当時の真ん中に金の右の場所から斜めに移動するとによって得することができます。残りは手に入れることができません。右上の金は壁でブロックされており、右下の金はモンスターの感受性の高いエリアで2ターン必要です。
次のテストケースはmbomb007からgeneしみなく寄付されました。
9)
12345678
a @....g.D
b .......$
c ......#.
d .....h.. -> 1
これはトリッキーです。パスはb4-b5-c6-b7-c8-b8(grab)
です。
10)
12345678
a @....g.D
b .......$
c .......#
d .....h.. -> 1
パスは[bc]4-c5-b6-c7-b8(grab)
です。
11)
12345678
a @....g.D
b ......#$
c .......#
d .....h.. -> 1
余分な壁は実際に[bc]4-c5-b6-c7-b8(grab)
は何も変えませんが、それでも解決策です。
@
は有効な入力ですか?