離散確率分布の概念を人々に紹介する古典的な例は、Beanマシンです。このマシンには、上部の狭い通路から大量のビー玉が落下し、その後、インターレースピンの列にヒットします。各ピンでビー玉がヒットすると、ピンの左右に落ちる場合があります。最後に、ピンはマシンの下部にある垂直ビンに集められます。このマシンの簡単な図は次のようになります。
| O |
| ^ |
| ^ ^ |
| ^ ^ ^ |
| ^ ^ ^ ^ |
| ^ ^ ^ ^ ^ |
|_|_|_|_|_|_|
この図では、O
はビー玉が落ちる場所を示しています。それぞれ^
は、大理石がピンの左または右のいずれかの正方形に移動する確率が50%であるピンです。次に、ビー玉はデバイスの下部のビンに集まります。十分な数のビー玉の場合、ビン内のビー玉スタックの高さは離散的な二項分布に似ています。
チャレンジ
この課題では、上記のような図に基づいて、Beanマシンの結果の確率分布を計算します。図は、側面のフィールドまたは現在のフィールドの下のフィールドに向かって、ビー玉が通過する2次元の「プログラム」として解釈されます。ビー玉が機械の底に達すると、確率分布としてカウントされます。面白くするために、これらの図には、単純なソースとピン以外のフィールドがいくつか含まれています。ダイアグラムの例は次のとおりです。
| O |
| ^ |
| ^ / |
| ^ | ^ |
| <^- = v |
| ^ ^ ^ ^ ^ |
さらに、ビー玉にはそれぞれ回転方向があります。この方向はいくつかのフィールドによって設定され、ビー玉が他のいくつかのフィールドで移動する次のフィールドを決定します。
以下のフィールドが定義されています:
O
:ソース。その直下にビー玉を生成します。これらのビー玉の方向は左50%、右50%です。各ソースは同じ量のビー玉を生成します。U
:シンク。このフィールドに入るビー玉はすべて、ビーンマシンから削除されます。: 空きスペース。大理石がこのフィールドに到着すると、それは下のフィールドに移動します。
-
:フロア。大理石がこのフィールドに到着すると、現在の方向に応じて、左側のフィールドまたは右側のフィールドのいずれかに移動します。^
:スプリッター。大理石がこのフィールドに到着すると、50%がスプリッターの右側のフィールドまたは左側のフィールドに移動します。これにより、大理石の方向も決まります。v
:参加します。大理石がこのフィールドに到着すると、それは下のフィールドに移動します。/
:傾斜パッド。大理石がこのフィールドに到着すると、パッドの左側のフィールドに移動し、大理石の方向を設定します。\
:前と同じですが、右側にあります。|
:リフレクター。大理石がこのフィールドに到着すると、大理石の方向を反転させ、この反転した方向に基づいて、大理石をフィールドの右または左に移動します。=
:キャノン。大理石がこのフィールドに到着すると、大理石が、
-
またはでないフィールドに遭遇するまで、大理石を現在の方向で右または左に移動しO
ます。<
:前と同じですが、常に方向を設定し、左に移動します。>
:前と同じですが、右側にあります。
図に関して、以下の保証が与えられます。
- 各入力行のフィールドの長さはまったく同じです。
- 各行の左端と右端のフィールドは常にa
|
です。 - ダイアグラムには、
\/
またはなどの不定の反復でビー玉がマシンに詰まる可能性のあるパスは含まれません^^
。 - 図には、上記のフィールドのみが含まれます。
- 1つ以上のソースがあります
結果
あなたの仕事は、ビー玉がグラフの下側を出る確率分布の16行の高さのASCIIバーグラフを生成し、最大の確率が16文字すべてをカバーするようにスケーリングすることです。したがって、次の問題の場合:
| O |
| ^ |
| ^ ^ |
| ^ ^ ^ |
| ^ ^ ^ ^ |
| ^ ^ ^ ^ ^ |
プログラムは次の解決策を作成する必要があります(横へのパイプを含めて、入力プログラムと同じ幅にする必要があります。
# #
# #
# #
# #
# #
# #
# #
# #
# # # #
# # # #
# # # #
# # # #
# # # #
# # # #
# # # # # #
# # # # # #
例
以下は、すべての異なるフィールドタイプの機能をテストする必要がある例です。
| O O |
| O ^ / <^\\\ |
| ^ > ^ |
| ^ ^ ^ =|
| ^ ^ | ^ <^ O |
| ^ > ^ | ^ O ^> v |
|| ^U ^ | = ^\ |
| ^ ^ ^ ^U ^\ ---^ |
| = ^ ^ = v |
結果は次のようになります。
#
#
#
#
# #
# #
# #
# # # #
# # # #
# # # #
# # # #
## # # #
## # # # #
# ### # # # #
# # ### # # # #
# # ### # # # #
ルール
機能と完全なプログラムの両方が、この課題に対する有効な答えを構成します。改行で区切られた文字列としてダイアグラムを受け取り、指定された形式で出力グラフを返す必要があります。デフォルトの入出力ルールが適用されます。出力では末尾と先頭の改行を使用できますが、各行は入力とまったく同じ幅にする必要があります。
より創造的なソリューションを可能にするためには、プログラムが同じダイアグラムに対して90%以上の時間で正しい結果を出力することが必要です。やはり確率シミュレーションです。
得点
これはcode-golfであるため、バイト単位の最低スコアが優先されます。
v
= [space]
?
v
と[space]
大砲が周囲で相互作用する方法が異なります。