Un classico esempio per introdurre le persone al concetto di distribuzione discreta delle probabilità è la macchina da fagioli . Questa macchina ha una grande quantità di biglie che cadono da uno stretto passaggio nella parte superiore, dopo di che colpiscono file di perni intrecciati, dove ad ogni perno il marmo colpisce potrebbe cadere a sinistra o a destra del perno. Infine, i perni sono raccolti in bidoni verticali nella parte inferiore della macchina. Un semplice diagramma di questa macchina è simile al seguente:
| O |
| ^ |
| ^ ^ |
| ^ ^ ^ |
| ^ ^ ^ ^ |
| ^ ^ ^ ^ ^ |
|_|_|_|_|_|_|
In questo diagramma, O
indica la posizione da cui cadono i marmi. Ciascuno ^
è un perno in corrispondenza del quale il marmo ha una probabilità del 50% di spostarsi sul quadrato a sinistra o a destra del perno. I marmi si raccolgono quindi sui contenitori nella parte inferiore del dispositivo e, per un numero sufficiente di marmi, l'altezza delle pile di marmo nei contenitori assomiglierà a una distribuzione binomiale discreta.
Sfida
Per questa sfida, calcolerai la distribuzione di probabilità risultante delle macchine bean in base a diagrammi come quello sopra. I diagrammi sono interpretati come un "programma" bidimensionale attraverso il quale passano i marmi, verso campi laterali o sotto il campo corrente. Quando i marmi raggiungono il fondo della macchina vengono contati per la distribuzione di probabilità. Per mantenerlo interessante, questi diagrammi conterranno alcuni campi in più rispetto alla semplice sorgente e ai pin. Un diagramma di esempio è:
| O |
| ^ |
| ^ / |
| ^ | ^ |
| <^- = v |
| ^ ^ ^ ^ ^ |
Inoltre, i marmi ora hanno ciascuno una direzione di rotazione. Questa direzione è impostata da alcuni campi e determina in quale campo successivo il marmo si sposta in molti altri campi.
Sono definiti i seguenti campi:
O
: Fonte. Genera marmi direttamente sotto di esso. La direzione di questi marmi è del 50% a sinistra, del 50% a destra. Ogni fonte produce la stessa quantità di marmi.U
: Lavello. Tutti i marmi che accedono a questo campo vengono rimossi dalla macchina bean.: Spazio vuoto. Se un marmo arriva in questo campo, si sposterà nel campo sottostante.
-
: Pavimento. Se un marmo arriva in questo campo, si sposterà sul campo a sinistra o sul campo a destra, a seconda della sua direzione corrente.^
: Splitter. Se un marmo arriva in questo campo, ha il 50% di spostarsi sul campo a destra o sul campo a sinistra dello splitter. Questo determina anche la direzione del marmo.v
: Aderire. Se un marmo arriva in questo campo, si sposterà nel campo sottostante./
: Pad inclinato. Se un marmo arriva in questo campo, si sposterà nel campo a sinistra del pad, impostando la direzione del marmo.\
: Uguale al precedente, ma a destra.|
: Riflettore. Se un marmo arriva in questo campo, invertirà la direzione del marmo e lo sposterà nel campo a destra oa sinistra, in base a questa direzione invertita.=
: Cannone. Se un marmo arriva in questo campo, lo sposta a destra o a sinistra nella direzione corrente, fino a quando il marmo incontra un campo che non lo è,
-
oO
.<
: Uguale al precedente, ma imposta sempre la direzione e si sposta verso sinistra.>
: Uguale al precedente, ma a destra.
Le seguenti garanzie sono fornite per quanto riguarda il diagramma.
- Ogni riga di input avrà esattamente la stessa lunghezza nei campi.
- Il campo più a sinistra e più a destra di ogni riga sarà sempre a
|
. - Il diagramma non conterrà alcun percorso possibile attraverso il quale i marmi possono rimanere bloccati nella macchina per una quantità indeterminata di iterazioni, come
\/
o^^
. - Il diagramma conterrà solo i campi sopra menzionati.
- Ci sono una o più fonti
Risultato
Il tuo compito sarà quello di generare un grafico a barre ASCII alto 16 righe della distribuzione di probabilità in cui i marmi escono dal lato inferiore del grafico, ridimensionato in modo che la probabilità più grande copra tutti i 16 caratteri. Quindi per il seguente problema:
| O |
| ^ |
| ^ ^ |
| ^ ^ ^ |
| ^ ^ ^ ^ |
| ^ ^ ^ ^ ^ |
Il tuo programma dovrebbe produrre la seguente soluzione (nota che dovrebbe avere la stessa larghezza del programma di input, compresi i tubi a lato:
# #
# #
# #
# #
# #
# #
# #
# #
# # # #
# # # #
# # # #
# # # #
# # # #
# # # #
# # # # # #
# # # # # #
Esempi
Di seguito è riportato un esempio che dovrebbe testare la funzionalità di tutti i diversi tipi di campo:
| O O |
| O ^ / <^\\\ |
| ^ > ^ |
| ^ ^ ^ =|
| ^ ^ | ^ <^ O |
| ^ > ^ | ^ O ^> v |
|| ^U ^ | = ^\ |
| ^ ^ ^ ^U ^\ ---^ |
| = ^ ^ = v |
Dovrebbe risultare nel seguente output:
#
#
#
#
# #
# #
# #
# # # #
# # # #
# # # #
# # # #
## # # #
## # # # #
# ### # # # #
# # ### # # # #
# # ### # # # #
Regole
Sia le funzioni che i programmi completi costituiscono risposte valide per questa sfida. Riceverai il diagramma come una stringa separata da nuova riga e dovresti restituire il grafico di output nel formato specificato. Si applicano le regole di input / output predefinite . Mentre nell'output sono consentiti il trascinamento e le nuove righe iniziali, ogni riga deve avere esattamente la stessa larghezza dell'input.
Per consentire soluzioni più creative, è necessario solo che il tuo programma produca il risultato corretto più del 90% delle volte per lo stesso diagramma. Dopotutto è una simulazione di probabilità.
punteggio
Questo è code-golf , quindi vince il punteggio più basso in byte.
v
= [space]
?
v
e [space]
differiscono nel modo in cui i cannoni interagiscono intorno a loro.