あなたは2つの町の間で砂漠を横断する旅行者です。停止せずに通り抜けるのに十分な水を運ぶことはできません。これは、古典的なパズルのバリエーションです。
ルール
砂漠は次のようになります。ほとんどが空のWxHグリッドです。マークされたスペースS
は開始点、E
終了点であり、数字Nでマークされた正方形にはN単位の水が入ります。.
ゼロホールド水でマークされた正方形。
.....................................
........S............................
.....................................
.........7...........................
.....................................
.......................3.............
.....5...............................
................................2....
.....................................
.....................................
.....................................
...............................E.....
.....................................
....................7................
.....................................
.....................................
5単位の水でSから開始します。
最大5ユニットの水を運ぶことができます。
各ターンあなた
- 1つの正方形を上、下、左、または右に移動し、
- あなたが運んでいる水を1単位消費する、
- いくつかの単位の水を拾ったり、落としたりします。
ターンは次のように表記されます:(direction)(+|-)(units of water)
、+
あなたは水を拾うこと、-
あなたがそれを落とすことを示します。
例は次のとおりです。
D+0 Move Down
R+0 Move Right
D+2 Move Down, pick up two units of water.
U-1 Move Up, drop one unit of water.
上記の例でSから始まるこれらの移動を実行すると、砂漠はその後このようになります。
.....................................
........S............................
.........1...........................
.........5...........................
.....................................
.......................3.............
.....5...............................
................................2....
.....................................
.....................................
.....................................
...............................E.....
.....................................
....................7................
.....................................
.....................................
あなたはすでにあなたの広場にあるよりも多くの水を拾うことはできません。水を拾うとき、タイルのカウントからそのユニット数を差し引きます。
最大5ユニットを保持するためにのみ水を拾うことができます。
Sが無限ユニットを保持する場合を除き、タイルは9ユニットを超えることはできません。
あなたが現在持っているだけの水を落とすことができます。
地面の水は、再び拾うまで変わりません。
Sに戻ると、水を使い果たすことなく、あらゆる量の水を拾うことができます。
Eに到達したら、勝ちます。Eで最後のユニットの水を消費すると、あなたはまだ勝ちます。
あなたのターンの後、あなたの水がゼロでEにいない場合、あなたは死ぬ。
入出力
プログラムはSTDIN
、上記の形式のASCIIアートとして、任意のサイズの開始マップを受け取ります。あなたはそれが長方形であると仮定することができます。つまり、すべての行が同じ長さで、正確に1 S
つと1つのE
正方形があり、すべての行がで終了し\n
、STDIN全体がこの正規表現に準拠します。/^[SE1-9\.\n]+$/
プログラムは次の出力をSTDOUTに書き込みます。
- 動きのリスト、
- マップの最終状態。
移動のリストは、便利な形式で出力できます。
マップの最終状態は入力と同じ形式で印刷されます。ただし#
、タイルが水を含まず、SまたはEでない場合、訪問したすべてのタイルをでマークして砂漠を通過したルートを追加で表示します。それはあります.
)。
入力例:
.....S.
.......
.......
E......
....8..
入賞例:
D+0
D+0
D+0
D+0
L+5
L+0
L+0
L+0
L+0
U+0
.....S.
.....#.
.....#.
E....#.
####3#.
自明性
コードを投稿するときは、サンプルマップ入力を投稿します。コードは、次の非自明な条件を満たすソリューションを見つけます。
- SとEは、少なくとも10回離れています。
- 最初にN単位の水を含むすべての正方形は、すべての正方形が含まれるN幅の境界線で囲まれている必要があります
.
(水なし、SまたはEなし)
例
........2.
..........
..........
S.1..2....
..........
..........
........1.
..3.......
.........E
タイルの水の量を増やすと、上記は簡単になります。
必要条件
おそらく、あなたのプログラムは、もしあれば解決策を見つける前に、いくつかの失敗した試みに遭遇するでしょう。
- 最終的に、プログラムは解決可能な入力を解決する必要があります。
- 私はあなたが死ぬのを見たい -あなたのプログラムは、解決策を見つけるために失敗した試みごとに、死へのルートの動きと最終マップを出力します。
- 成功するソリューションに遭遇した場合は、そのための完全な出力を印刷して終了します。
- 解決策が見つかるまで実行しますが、同じ解決策を2回試行しないでください。すべての死亡は別個のルートによるものでなければなりません。
- これをテスト入力として使用します。
(何らかの中間点でウォーターキャッシュをドロップするには、少なくとも1回の移動が必要です)。
S........
.........
.........
........E
解決する非自明なデモンストレーション入力とともに投稿された最短コードが優先されます。