Um exemplo clássico para apresentar às pessoas o conceito de uma distribuição de probabilidade discreta é a máquina de feijão . Essa máquina tem uma grande quantidade de bolas de gude caindo de uma passagem estreita no topo, após o que atingem fileiras de pinos entrelaçados, onde em cada pino o mármore bate, pode cair à esquerda ou à direita do pino. Finalmente, os pinos são coletados em caixas verticais na parte inferior da máquina. Um diagrama simples desta máquina é assim:
| O |
| ^ |
| ^ ^ |
| ^ ^ ^ |
| ^ ^ ^ ^ |
| ^ ^ ^ ^ ^ |
|_|_|_|_|_|_|
Neste diagrama, o O
significa o local de onde os mármores caem. Cada ^
um deles é um alfinete no qual o mármore tem 50% de chance de se mover para o quadrado à esquerda ou à direita do alfinete. As bolinhas de gude se reúnem nas caixas na parte inferior do dispositivo e, para um número grande de bolinhas, a altura das pilhas de mármore nas caixas será semelhante a uma distribuição binomial discreta.
Desafio
Para esse desafio, você calculará a distribuição de probabilidade resultante de máquinas de bean com base em diagramas como o acima. Os diagramas são interpretados como um 'programa' bidimensional pelo qual os mármores passam, em direção aos campos ao lado ou abaixo do campo atual. Quando os mármores atingem o fundo da máquina, eles são contados para a distribuição de probabilidade. Para mantê-lo interessante, esses diagramas conterão mais alguns campos do que apenas a fonte e os pinos simples. Um diagrama de exemplo é:
| O |
| ^ |
| ^ / |
| ^ | ^ |
| <^- = v |
| ^ ^ ^ ^ ^ |
Além disso, agora os mármores agora têm uma direção de rotação. Essa direção é definida por alguns campos e determina para qual próximo campo o mármore se move em vários outros campos.
Os seguintes campos são definidos:
O
: Fonte. Spawns mármores diretamente abaixo dele. A direção desses mármores é 50% esquerda, 50% direita. Cada fonte produz a mesma quantidade de bolinhas de gude.U
: Pia. Quaisquer bolinhas que entram neste campo são removidas da máquina de feijão.: Espaço vazio. Se um mármore chegar a esse campo, ele será movido para o campo abaixo.
-
: Chão. Se um mármore chegar a esse campo, ele será movido para o campo à esquerda ou para o campo à direita, dependendo da direção atual.^
: Divisor. Se um mármore chegar a esse campo, ele terá 50% de movimento para o campo à direita ou o campo à esquerda do separador. Isso também determina a direção do mármore.v
: Junte-se. Se um mármore chegar a esse campo, ele será movido para o campo abaixo./
: Almofada inclinada. Se um mármore chegar a esse campo, ele será movido para o campo à esquerda do bloco, definindo a direção do mármore.\
: Igual ao anterior, mas à direita.|
: Refletor. Se um mármore chegar a esse campo, ele reverterá a direção do mármore e moverá o mármore para o campo à direita ou à esquerda, com base nessa direção invertida.=
: Canhão. Se um mármore chegar a esse campo, ele será movido para a direita ou esquerda na direção atual, até encontrar um campo que não é,
-
ouO
.<
: Igual ao anterior, mas sempre definirá a direção e se moverá para a esquerda.>
: Igual ao anterior, mas à direita.
As seguintes garantias são dadas em relação ao diagrama.
- Cada linha de entrada terá exatamente o mesmo comprimento nos campos.
- O campo mais à esquerda e mais à direita de cada linha será sempre a
|
. - O diagrama não conterá caminhos possíveis pelos quais os mármores podem ficar presos na máquina por uma quantidade indeterminada de iterações, como
\/
ou^^
. - O diagrama conterá apenas os campos acima mencionados.
- Existem uma ou mais fontes
Resultado
Sua tarefa será gerar um gráfico de barras ASCII de 16 linhas de altura da distribuição de probabilidade na qual os mármores saem do lado inferior do gráfico, redimensionados para que a maior probabilidade cubra todos os 16 caracteres. Portanto, para o seguinte problema:
| O |
| ^ |
| ^ ^ |
| ^ ^ ^ |
| ^ ^ ^ ^ |
| ^ ^ ^ ^ ^ |
Seu programa deve produzir a seguinte solução (observe que ele deve ter a mesma largura que o programa de entrada, incluindo os tubos ao lado:
# #
# #
# #
# #
# #
# #
# #
# #
# # # #
# # # #
# # # #
# # # #
# # # #
# # # #
# # # # # #
# # # # # #
Exemplos
A seguir, é apresentado um exemplo que deve testar a funcionalidade de todos os diferentes tipos de campos:
| O O |
| O ^ / <^\\\ |
| ^ > ^ |
| ^ ^ ^ =|
| ^ ^ | ^ <^ O |
| ^ > ^ | ^ O ^> v |
|| ^U ^ | = ^\ |
| ^ ^ ^ ^U ^\ ---^ |
| = ^ ^ = v |
Isso deve resultar na seguinte saída:
#
#
#
#
# #
# #
# #
# # # #
# # # #
# # # #
# # # #
## # # #
## # # # #
# ### # # # #
# # ### # # # #
# # ### # # # #
Regras
Tanto as funções quanto os programas completos constituem respostas válidas para esse desafio. Você receberá o diagrama como uma sequência separada por nova linha e retornará o gráfico de saída no formato especificado. Aplicam- se as regras de entrada / saída padrão . Enquanto novas linhas à direita e à esquerda são permitidas na saída, cada linha deve ter exatamente a mesma largura que a entrada.
Para permitir soluções mais criativas, é necessário apenas que seu programa produza o resultado correto mais de 90% do tempo para o mesmo diagrama. Afinal, é uma simulação de probabilidade.
Pontuação
Isso é código-golfe , então a pontuação mais baixa em bytes vence.
v
= [space]
?
v
e [space]
diferem na maneira como os canhões interagem em torno deles.