Классическим примером для представления людям концепции дискретного распределения вероятностей является бобовая машина . У этой машины большое количество мрамора выпадает из узкого прохода наверху, после чего они ударяются о ряды переплетенных штифтов, где на каждом штифте попадание мрамора может упасть влево или вправо от штифта. Наконец, штифты собраны в вертикальные бункеры в нижней части машины. Простая схема этой машины выглядит следующим образом:
| O |
| ^ |
| ^ ^ |
| ^ ^ ^ |
| ^ ^ ^ ^ |
| ^ ^ ^ ^ ^ |
|_|_|_|_|_|_|
На этой диаграмме O
обозначено место падения мрамора. Каждый из них ^
- это булавка, на которой мрамор с вероятностью 50% может переместиться на квадрат слева или справа от булавки. Мрамор затем собирается в ящиках на дне устройства, и для достаточно большого количества мраморов высота мраморных стопок в ящиках будет напоминать дискретное биномиальное распределение.
Вызов
Для этой задачи вы будете вычислять результирующее распределение вероятностей бобовых машин на основе диаграмм, подобных приведенной выше. Диаграммы интерпретируются как двумерная «программа», через которую проходят шарики, либо к боковым полям, либо к полям под текущим полем. Когда шарики достигают нижней части машины, они учитываются для распределения вероятностей. Чтобы было интересно, эти диаграммы будут содержать несколько полей, а не только простой источник и выводы. Пример диаграммы:
| O |
| ^ |
| ^ / |
| ^ | ^ |
| <^- = v |
| ^ ^ ^ ^ ^ |
Кроме того, каждый шарик теперь имеет направление вращения. Это направление задается некоторыми полями и определяет, к какому следующему полю перемещается мрамор в нескольких других полях.
Определены следующие поля:
O
: Источник. Создает мрамор прямо под ним. Направление этих шариков - 50% влево, 50% вправо. Каждый источник производит одинаковое количество мрамора.U
Раковина Любые шарики, попадающие в это поле, удаляются из бобовой машины.: Пустое пространство. Если мрамор прибудет на это поле, он переместится на поле ниже.
-
: Пол. Если мрамор прибудет на это поле, он переместится либо к полю слева, либо к полю справа, в зависимости от его текущего направления.^
Разветвитель Если мрамор попадает на это поле, он имеет 50% перемещения к полю справа или к полю слева от сплиттера. Это также определяет направление мрамора.v
: Присоединиться. Если мрамор прибудет на это поле, он переместится на поле ниже./
Наклонная накладка. Если мрамор прибудет на это поле, он переместится на поле слева от площадки, задав направление мрамора.\
То же, что и предыдущий, но справа.|
Отражатель Если мрамор прибудет на это поле, он изменит направление мрамора и переместит мрамор в поле вправо или влево, основываясь на этом обратном направлении.=
: Пушка Если мрамор прибывает в это поле, оно будет переместить его вправо или влево , в направлении тока, пока мрамор не встречает поле, которое не,
-
илиO
.<
: То же, что и предыдущий, но всегда будет устанавливать направление и двигаться влево.>
То же, что и предыдущий, но справа.
Следующие гарантии даны относительно диаграммы.
- Каждая строка ввода будет иметь одинаковую длину в полях.
- Самое левое и самое правое поле каждой строки всегда будет a
|
. - Диаграмма не будет содержать никаких возможных путей, по которым шарики могут застрять в машине на неопределенное количество итераций, например
\/
или^^
. - Диаграмма будет содержать только вышеупомянутые поля.
- Есть один или несколько источников
Результат
Ваша задача будет состоять в том, чтобы сгенерировать 16-строчную гистограмму ASCII высотой распределения вероятностей, в которой шарики выходят из нижней части графика, в таком масштабе, чтобы наибольшая вероятность охватывала все 16 символов. Итак, для следующей проблемы:
| O |
| ^ |
| ^ ^ |
| ^ ^ ^ |
| ^ ^ ^ ^ |
| ^ ^ ^ ^ ^ |
Ваша программа должна создать следующее решение (обратите внимание, что она должна иметь ту же ширину, что и входная программа, включая каналы в сторону:
# #
# #
# #
# #
# #
# #
# #
# #
# # # #
# # # #
# # # #
# # # #
# # # #
# # # #
# # # # # #
# # # # # #
Примеры
Ниже приведен пример, который должен проверить функциональность всех типов полей:
| O O |
| O ^ / <^\\\ |
| ^ > ^ |
| ^ ^ ^ =|
| ^ ^ | ^ <^ O |
| ^ > ^ | ^ O ^> v |
|| ^U ^ | = ^\ |
| ^ ^ ^ ^U ^\ ---^ |
| = ^ ^ = v |
Это должно привести к следующему выводу:
#
#
#
#
# #
# #
# #
# # # #
# # # #
# # # #
# # # #
## # # #
## # # # #
# ### # # # #
# # ### # # # #
# # ### # # # #
правила
Обе функции и полные программы представляют собой правильные ответы на этот вызов. Вы получите диаграмму в виде строки, разделенной новой строкой, и вам следует вернуть выходной граф в заданном формате. Применяются правила ввода / вывода по умолчанию . Хотя в выходных данных допускается завершающий и начальный переводы строк, каждая строка должна иметь точно такую же ширину, что и входные.
Для более креативных решений требуется, чтобы ваша программа выводила правильный результат более 90% времени для одной и той же диаграммы. В конце концов, это симуляция вероятности.
счет
Это код-гольф , поэтому выигрывает самая низкая оценка в байтах.
v
= [space]
?
v
и [space]
отличаются тем, как пушки взаимодействуют вокруг них.