それは最後のスプリントです...そして、あなたのチームの半分は病気です。あなたは遅く働いて、その日の最後のコミットをして、楽しみにしています...なぜライトが消えたのですか?警備員がやってくるのを覚えていません... 私は家に鍵を置いた!
状況の恐怖が沈むにつれて、あなたはあなたが逃げようとしていると決める。
タスクの概要
逃げるには、計画が必要です!ただし、計画には失敗する可能性があり、計画ごとに異なる労力が必要であることはご存じでしょう。
お腹が空いていて、疲れていて、エンジニアであるあなたは、短いプログラムを書いて、複雑さから逃れるための最良の方法を決定し、成功の可能性とそれが必要とする努力のバランスを取ります。
建物の地図を作成します。
#######################
# = #
! = ! <-- window
# ! = # (freedom!)
#################= #
# # = #
# # = #
# # = #
# o ! # # ! = #
##| ! ## # ! = #
#######################
^ ^ ^
me my door ludicrously high shelves
(locked) (climbable)
オフィスを脱出するには、マップから自分自身を移動する必要があります。ここでは、2つのウィンドウ(!
)があり、どちらか一方が自由になりますが、アクセスできるのはそのうちの1つだけです。「マップ外」とは、マップの境界外に足を置くことを意味します
細胞の種類
- empty, you can be here (i.e. the escapee can consume this cell)
# - solid (your desk, your in-tray), you can't be here, but you can stand on it
! - destructible, (co-worker's desk, door, window), you can't be here until you smash it first (turning it into an empty cell)
= - climbable, (fire ladder, filing cabinet, etc.), you can be here
脱出者によって最初に消費された細胞は空になった。
アクション仕様
使い捨てで可能なアクションの数があります。これらは、整数の成功確率を持つ単純な状態遷移によって定義されます。たとえば、ウォーキングの場合、エスケープするセルを1つのセルに移動します。これを次の遷移で表します。
ステップ
1 stp、100%、ミラー
o. o
|. --> |
# #
点は、中に移動するか、中を通過するために空でなければならない(または登ることができますが、固体または破壊可能ではない)セルを示しています。100%とは、自分を傷つけずに大胆な脱出を終わらせる可能性が100%あることを意味します。すべての確率は、1%から100%の間の整数パーセンテージです。最初の図は、初期状態を示しています(何か立っている、空いているスペースの隣に立っている)。2番目の図は、端末の状態(空のスペースに移動した)を示しています。左側(初期状態)の特定されていないセル(スペース)が特定のものである必要はありません。未指定のセル(スペース、
)右側(終端状態)は以前と同じである必要があります(例:脱走者の背後にあるもの、またはたまたま私が歩いているもの(空きスペースなど))。 )ダイアグラムはセルを破壊可能から空に変更するだけで、他の変更は発生しません。「1 stp」は1 stpのコストを意味します。「stp」をステップに必要なエネルギー量として定義します。
「ミラー」は、このアクションに2つの形式があることを意味します。「右」アクションが表示され、「左」アクションは正確なミラーです。例:
.o
.|
#
の鏡(左)形式
o.
|.
#
右のアクションは「右」と呼ばれます(例:「ステップ右」)左のアクションは「左」と呼ばれます(例:「左ステップ」)
これらの図では、脱走者は
o
|
立っているとき(高さ2ユニット)および
%
しゃがむとき(1ユニットの高さ)。固体または破壊可能である必要があるセルは、ハッシュで示され#
ます。固体または破壊可能であってはならないセルは、ドットで示され.
ます。破壊可能でなければならないセルは、バングで示され!
ます。新しく作成された空のスペースは、アンダースコアで表示されます_
。
x
移動しない参照ポイントです(存在しない、そのセルがどうあるべきかについての制約はありません(スペースなど))。
注:床に着いたときの急速な減速の問題は無視します。はい、このゲームでは、はしごに完全に壮大なジャンプをすることができます)
ステップ
1 stp、100%、ミラー
o. o
|. --> |
x# x#
登る
1 stp、100%、ミラー
= =
o. --> o
|. |
x= x=
シャッフル
3 stp、100%、ミラー
%. %
x# --> x#
クランバーアップ
10 stp、95%、ミラー
o. %
|# --> #
x# x#
ドロップ
0 stp、100%
o
| --> o
x. x|
ドロップ(スタンド)
0 stp、100%
% o
x. --> x|
登る
2 stp、100%
= o
o --> |
x| x
クラウチ
2 stp、100%
o
| --> %
x# x#
スタンド
4 stp、100%
. o
% --> |
x# x#
ショートジャンプ
4 stp、95%、ミラー
o.. o
|.. --> |
x# x#
走り幅跳び
7 stp、75%、ミラー
o... o
|... --> |
x# x#
高跳び
12 stp、90%、ミラー
.. o
o. --> |
|
x# x#
それに背を向けて!
20 stp、80%、ミラー
o!. _o
|!. --> _|
x# x#
パンチ
8 stp、90%、ミラー
o! o_
| --> |
x# x#
キック
8 stp、85%、ミラー
o o
|! --> |_
x# x#
切手
8 stp、90%
o o
| --> |
x! x_
予定
計画は、上記で定義された一連のアクションです。例えば:
Step Left
High Jump Left
Crouch
Shuffle Left
Shuffle Left
Stand
Long Jump Left
Put your back into it! Left
Step Left
ドロップが含まれていることに注意してください。ルールは、ドロップ以外の操作を停止するように設定する必要がありますが、まだ計画する必要があります!
どの計画にも必要な労力があります。これは、各ステップの労力の合計です。成功確率もあります。これは、各アクションの成功確率の積です。簡単な例:
Step Right: 1stp, 100%
Long Jump Right: 7stp, 75%
Step Right: 1stp, 100%
Stamp: 8stp, 90%
Drop: 0stp, 100%
Drop: 0stp, 100%
Drop: 0stp, 100%
Drop: 0stp, 100%
Step Left: 1stp, 100%
Step Left: 1stp, 100%
High Jump Left: 12stp, 90%
Effort = 1+7+1+8+1+1+12 = 31
Success Probability = 75%*90*90% = 60.75%
ページの上部にあるマップの「実用的な例」は、要点として見つけることができます。
入力
入力は、整数と、文字の配列または文字列の2つの部分で構成されます。
整数は、成功の最小許容(パーセント)確率です。パーセンテージとして解釈されるため、80は計画が80%以上の確率で成功する必要があることを意味します。
有効なマップは、スタンディングエスケープ(最小サイズ1x2)を含み、未指定のシンボルを含まない長方形です。すべての行は同じ長さになります。入力は、1次元の区切り文字列(区切り文字は単一の一貫した文字、またはCRLFとLFCRのペアのいずれかでなければなりません)、同様の1次元配列、または2次元配列として受け入れることができます。選択した入力形式が何らかの方法でマップの幅または高さを示さない場合、これらの追加の引数を受け入れることができます(これを回答で明確に述べる必要があります)。必要に応じて、コマンドライン引数と標準入力を混在させることができます(たとえば、stdinからのマップ、argvからの最小成功確率)。以下は、有効なマップと無効なマップの例です。
有効:
o
|
有効:
# #
! o #
! | #
#########
無効(エスケープなし):
# #
! #
! #
#########
無効(エスケープが常に立ち上がる):
# #
! #
! % #
#########
無効(無効な記号):
# #
! ~ #
! #
#########
無効です(長方形/異なる長さの行ではありません):
# #
! o #
! | #
#########
入力が有効であると仮定することができます(無効な入力が渡された場合、プログラムが何をするかは気にしません)。
出力
出力はテキスト(ASCII)です。文字列として返されるか、標準出力に出力されます。計画は、LF、CRLF、またはLFCRで区切る必要があります。同様に、Required Effortの後に別のLF、CRLF、またはLFCRが必要です。末尾の改行はオプションです。
最適な計画を、それが必要とする努力とともに出力するか、「希望はありません!」そのような計画が存在しない場合。成功の確率を出力する必要はありません。このテキストには、末尾の改行がある場合とない場合があります。
最適な計画とは、少なくとも所定の成功確率で最小限の労力を必要とする計画(上記参照)として定義されます。確率の計算は正確でなければならないことに注意してください。浮動小数点が十分であると仮定することはできません(これが出力を期待しない理由です)。私はこれを公正にテストするためにテストケースを設計しようとします(それらに合格し、仮の仮定を立てない場合は、提出物が有効であると考えるかもしれません)。
フォーマット:
Required Effort: <effort>
<plan>
たとえば、入力用
50
# #
! o #
! | #
#########
適切な出力は次のとおりです。
Required Effort: 23
Step Left
Step Left
Step Left
Kick Left
Punch Left
Step Left
Step Left
Step Left
Step Left
ここで成功する確率は76.5%です。
同じマップで、成功の最小確率が80%の場合、「それに戻る」必要があります。これは、より多くの労力を必要としますが、成功確率の基準を満たします。成功の最小確率が80%を超える場合は、少し難しく考える必要があります(ドアの一部をパンチまたはキックしてシャッフルアウト)。成功の最小確率が100%の場合、「希望はありません!」と印刷する必要があります。
例
入力に対して複数の有効なプランがある可能性があります。出力は正確にこれらである必要はありませんが、正しい必要な作業が必要であり、有効なプランである必要があります。検証ツールを使用してソリューションを確認できます(以下を参照)
入力:
100
o
|
出力:
Required Effort: 0
Drop
入力:
5
# = #
# = !
# = ! ! !
# =#######
# = #
# = o #
# = ! | #
##########
出力:
Required Effort: 57
Step Left
Kick Left
Step Left
Step Left
Step Left
Climb Up
Climb Up
Climb Up
Climb Up
Climb off Right
High Jump Right
Long Jump Right
Step Right
Drop
Kick Right
Crouch
Shuffle Right
Shuffle Right
入力:
60
#########
# ! # #
! ! ! o #
! # ! | #
#########
出力:
Required Effort: 58
Step Left
Kick Left
Crouch
Shuffle Left
Shuffle Left
Stand
Punch Left
Clamber Up Left
Shuffle Left
Drop (Stand)
Kick Left
Crouch
Shuffle Left
Shuffle Left
同じマップで、80%の場合、出力は次のようになります。
There is no hope!
同じマップで、50%の場合、必要な作業量は異なるプランで56になります)
入力:
50
#######################
# # = #
! # = !
# # = #
###### #####!## =### #
#= ## # = #
#=############# = #
#= = #
#= o = #
#!!| = #
#######################
出力:
Required Effort: 121
Step Right
Step Right
Step Right
Step Right
Step Right
Step Right
Step Right
Step Right
Step Right
Step Right
Step Right
Step Right
Step Right
Step Right
Climb Up
Climb Up
Climb Up
Climb Up
Climb Up
Climb Up
Climb off Right
Long Jump Left
Step Left
Step Left
Stamp
Drop
Drop
Crouch
Shuffle Left
Shuffle Left
Shuffle Left
Shuffle Left
Shuffle Left
Shuffle Left
Stand
Clamber Up Left
Stand
Clamber Up Left
Stand
Step Left
Step Left
Step Left
Step Left
Punch Left
Clamber Up Left
Shuffle Left
入力:
66
######
# ###
#o ! !
#| ! !
### ##
######
出力:
Required Effort: 37
Step Right
Put your back into it! Right
Kick Right
Crouch
Shuffle Right
Shuffle Right
入力:
これは、犠牲になる可能性のある多くの誤った仮定をチェックするように設計されており、その結果、少し奇妙に見えるかもしれません
30
###################
# ## # # # # = #
! ## # # # = #
# # # = #
## ############= #
# ## # #= #
# = # #= #
! = # #= #
# = # #= #
#o= ! ==#
#|= ! =#
#!= # ==########==#
# # ! !! =#
# # !! ! = #
# # !!!!#########
# # # #
# # # #
###################
成功の可能性制約30の出力:
Required Effort: 199
Long Jump Right
Put your back into it! Right
<snip>
成功の可能性制約32の出力:
Required Effort: 200
Long Jump Right
Punch Right
<snip>
上部のマップを入力として使用し、成功の確率を1%に制限すると、116の必要な努力が得られるはずです(成功の確率〜32%、これはテストプログラムで実行するのに約20秒かかりました)。
勝利基準
これはコードゴルフです。最短のコードが勝つかもしれません。
資格を得るには、機能またはプログラムが機能し、妥当なマシンで30分以内に上記の各テストケースを解決できる必要があります。私のソルバーは、それぞれ30秒以内にそれらを実行します。テストスクリプト(下記)が30分以内に実行される場合は、ぜひ行ってください。
ソルバー、検証、テストスクリプト、およびテストケースの例(ソリューション付き)
ソルバーのC#コードとソリューション検証ツールは、ここで要点として利用できます。要点にはが含まれますfile.txt
。これは、上記で説明したアクションの機械可読(十分)な形式であり、プログラムの実行に必要です。そのファイルと仕様の間の矛盾は意図的なものではありません。
要旨には、多数のテストケース(上記のすべての例を含む)と、それらに対して自動的に送信を実行するPowerShellスクリプトも含まれています。特定のテストが失敗したことをスクリプトが示している場合は、実行OfficeEscapeSolver.exe testcase<n>.txt outputFromYourProgram.txt
して詳細を確認できます。これらのテストケースのソリューション例は、別のGistにあります。
すべてのコードは完全に混乱していますがstatic void Main(...)
、出力量を変更するために遠くに迷う必要はありません(この情報を自由に使用してください、私はあなたのためにそれを提供しました!)。
スクリプトと検証ツールは非常に寛大なので、テストケースに合格することは必ずしも出力が適切に形成されていることを意味しません。提出を有効にするには、出力が上記の仕様と一致する必要があります。
ソルバーまたはテストスクリプトのバグ、エラーfile.txt
、または危険なテストケースを見つけたと思われる場合は、この投稿にコメントするか、SEチャットでpingしてください。私はおそらく他のコミュニケーションの試みに気付かないでしょう。
BashやBatchでテストスクリプトを提供することはありません。それらがわからないからです。しかし、翻訳を含めて喜んで、人々が望むならC#バージョンを書きます。
ポストアンブル
質問がありますか?遅れないで、今日彼らに聞いてください!
このタスクは、真剣なゴルファーに歯を沈める何かを与えるための努力を必要とすることを意図しています。
入力/出力に関するフィードバックに対するais523に感謝します。
人々がもっと欲しければ(この投稿がこれ以上長くならないように)、または自分自身のいくつかを提供したいなら、gistファイルでより多くのテストケースを提供できます。