Klasycznym przykładem wprowadzenia ludzi w koncepcję dyskretnego rozkładu prawdopodobieństwa jest maszyna do fasoli . Ta maszyna ma dużą liczbę kulek spadających z wąskiego przejścia u góry, po czym uderzają w rzędy przeplatanych szpilek, gdzie na każdym szpilce marmur uderza w lewą lub prawą szpilkę. Na koniec szpilki są gromadzone w pionowych pojemnikach na dole maszyny. Prosty schemat tej maszyny wygląda następująco:
| O |
| ^ |
| ^ ^ |
| ^ ^ ^ |
| ^ ^ ^ ^ |
| ^ ^ ^ ^ ^ |
|_|_|_|_|_|_|
Na tym schemacie O
oznacza miejsce, z którego wypadają kulki. Każdy z nich ^
jest szpilką, przy której marmur ma 50% szansy na przejście do kwadratu po lewej lub prawej stronie szpilki. Kulki zbierają się następnie w pojemnikach na spodzie urządzenia, a dla wystarczająco dużej liczby kulek wysokość marmurowych stosów w pojemnikach będzie przypominać dyskretny rozkład dwumianowy.
Wyzwanie
W tym wyzwaniu będziesz obliczał wynikowy rozkład prawdopodobieństwa maszyn do fasoli na podstawie diagramów takich jak powyższy. Diagramy są interpretowane jako dwuwymiarowy „program”, przez który przechodzą kulki, w kierunku pól z boku lub pól poniżej bieżącego pola. Gdy kulki osiągną dno maszyny, są one liczone do rozkładu prawdopodobieństwa. Aby było ciekawie, te diagramy będą zawierały kilka dodatkowych pól niż tylko proste źródło i piny. Przykładowy diagram to:
| O |
| ^ |
| ^ / |
| ^ | ^ |
| <^- = v |
| ^ ^ ^ ^ ^ |
Co więcej, teraz wszystkie kulki mają kierunek obrotu. Ten kierunek jest ustalany przez niektóre pola i określa, do którego następnego pola marmur przesuwa się na kilka innych pól.
Zdefiniowane są następujące pola:
O
: Źródło. Odradza kulki bezpośrednio pod nim. Kierunek tych kulek to 50% w lewo, 50% w prawo. Każde źródło wytwarza taką samą ilość kulek.U
: Tonąć. Wszelkie kulki, które wejdą w to pole, są usuwane z maszyny do fasoli.: Pusta przestrzeń. Jeśli marmur dotrze na to pole, przeniesie się na pole poniżej.
-
: Podłoga. Jeśli marmur dotrze na to pole, przesunie się albo na pole po lewej, albo na pole po prawej, w zależności od bieżącego kierunku.^
: Rozdzielacz. Jeśli marmur dotrze na to pole, ma 50% ruchu do pola po prawej stronie lub pola po lewej stronie rozdzielacza. To także określa kierunek marmuru.v
: Przystąpić. Jeśli marmur dotrze na to pole, przeniesie się na pole poniżej./
: Nachylona podkładka. Jeśli marmur dotrze na to pole, przesunie się na pole po lewej stronie podkładki, ustawiając kierunek marmuru.\
: Taki sam jak poprzedni, ale po prawej stronie.|
: Odbłyśnik. Jeśli marmur dotrze na to pole, odwróci kierunek marmuru i przeniesie marmur na pole w prawo lub w lewo, w oparciu o ten odwrócony kierunek.=
: Cannon. Jeśli marmur dotrze na to pole, przesunie go w prawo lub w lewo w bieżącym kierunku, dopóki marmur nie napotka pola, które nie jest,
-
lubO
.<
: Taki sam jak poprzedni, ale zawsze ustawi kierunek i przesuwa się w lewo.>
: Taki sam jak poprzedni, ale po prawej stronie.
Poniższe gwarancje dotyczą diagramu.
- Każdy wiersz wejściowy będzie miał dokładnie taką samą długość w polach.
- Pole znajdujące się najbardziej po lewej i po prawej stronie każdego wiersza zawsze będzie oznaczało
|
. - Schemat nie będzie zawierał żadnych możliwych ścieżek, którymi kulki mogłyby utknąć w maszynie na nieokreśloną liczbę iteracji, takich jak
\/
lub^^
. - Schemat będzie zawierał tylko wyżej wymienione pola.
- Istnieje jedno lub więcej źródeł
Wynik
Twoim zadaniem będzie wygenerowanie 16-liniowego wykresu słupkowego ASCII o rozkładzie prawdopodobieństwa, w którym kulki wychodzą z dolnej części wykresu, skalowane w taki sposób, aby największe prawdopodobieństwo obejmowało wszystkie 16 znaków. Tak dla następującego problemu:
| O |
| ^ |
| ^ ^ |
| ^ ^ ^ |
| ^ ^ ^ ^ |
| ^ ^ ^ ^ ^ |
Twój program powinien wygenerować następujące rozwiązanie (zwróć uwagę, że powinien mieć taką samą szerokość jak program wejściowy, w tym rury z boku:
# #
# #
# #
# #
# #
# #
# #
# #
# # # #
# # # #
# # # #
# # # #
# # # #
# # # #
# # # # # #
# # # # # #
Przykłady
Oto przykład, który powinien przetestować funkcjonalność wszystkich różnych typów pól:
| O O |
| O ^ / <^\\\ |
| ^ > ^ |
| ^ ^ ^ =|
| ^ ^ | ^ <^ O |
| ^ > ^ | ^ O ^> v |
|| ^U ^ | = ^\ |
| ^ ^ ^ ^U ^\ ---^ |
| = ^ ^ = v |
Powinno to spowodować następujące wyniki:
#
#
#
#
# #
# #
# #
# # # #
# # # #
# # # #
# # # #
## # # #
## # # # #
# ### # # # #
# # ### # # # #
# # ### # # # #
Zasady
Zarówno funkcje, jak i pełne programy stanowią prawidłowe odpowiedzi na to wyzwanie. Otrzymasz diagram jako ciąg rozdzielony znakiem nowej linii i powinieneś zwrócić wykres wyjściowy w podanym formacie. Obowiązują domyślne reguły wejścia / wyjścia . Podczas gdy końcowe i końcowe znaki nowej linii są dozwolone w danych wyjściowych, każdy wiersz powinien mieć dokładnie taką samą szerokość jak dane wejściowe.
Aby umożliwić bardziej kreatywne rozwiązania, wymagane jest, aby Twój program wyświetlał poprawny wynik przez ponad 90% czasu dla tego samego diagramu. W końcu to symulacja prawdopodobieństwa.
Punktacja
To jest golf golfowy , więc wygrywa najniższy wynik w bajtach.
v
= [space]
?
v
i [space]
różnią się w jaki sposób działa wokół nich armata.