Un ejemplo clásico para presentar a las personas el concepto de una distribución de probabilidad discreta es la máquina de frijoles . Esta máquina tiene una gran cantidad de canicas que caen desde un pasadizo estrecho en la parte superior, después de lo cual golpean hileras de alfileres entrelazados, donde en cada alfiler golpea la canica puede caer a la izquierda o la derecha del alfiler. Finalmente, los pasadores se recogen en contenedores verticales en la parte inferior de la máquina. Un diagrama simple de esta máquina se ve así:
| O |
| ^ |
| ^ ^ |
| ^ ^ ^ |
| ^ ^ ^ ^ |
| ^ ^ ^ ^ ^ |
|_|_|_|_|_|_|
En este diagrama, O
significa la ubicación de donde caen las canicas. Cada uno ^
es un alfiler en el que la canica tiene un 50% de posibilidades de moverse al cuadrado a la izquierda o a la derecha del alfiler. Luego, las canicas se juntan en los contenedores en la parte inferior del dispositivo, y para un número suficientemente grande de canicas, la altura de las pilas de canicas en los contenedores se asemejará a una distribución binomial discreta.
Reto
Para este desafío, calculará la distribución de probabilidad resultante de las máquinas de frijoles en base a diagramas como el anterior. Los diagramas se interpretan como un "programa" bidimensional por el que pasan las canicas, ya sea hacia los campos laterales o los campos debajo del campo actual. Cuando las canicas alcanzan el fondo de la máquina, se cuentan para la distribución de probabilidad. Para mantenerlo interesante, estos diagramas contendrán algunos campos más que solo la fuente simple y los pines. Un diagrama de ejemplo es:
| O |
| ^ |
| ^ / |
| ^ | ^ |
| <^- = v |
| ^ ^ ^ ^ ^ |
Además, las canicas ahora tienen una dirección de rotación. Esta dirección es establecida por algunos campos y determina a qué campo siguiente se mueve la canica en varios otros campos.
Se definen los siguientes campos:
O
: Fuente. Genera canicas directamente debajo de él. La dirección de estas canicas es 50% izquierda, 50% derecha. Cada fuente produce la misma cantidad de canicas.U
: Lavabo. Cualquier canica que ingrese a este campo se elimina de la máquina de frijoles.: Espacio vacio. Si una canica llega a este campo, se moverá al campo de abajo.
-
: Suelo. Si una canica llega a este campo, se moverá al campo a la izquierda o al campo a la derecha, dependiendo de su dirección actual.^
: Splitter. Si una canica llega a este campo, tiene un 50% de movimiento al campo a la derecha o al campo a la izquierda del divisor. Esto también determina la dirección de la canica.v
: Unirse. Si una canica llega a este campo, se moverá al campo de abajo./
: Almohadilla inclinada. Si una canica llega a este campo, se moverá al campo a la izquierda de la plataforma, configurando la dirección de la canica.\
: Igual que el anterior, pero a la derecha.|
: Reflector. Si una canica llega a este campo, invertirá la dirección de la canica y la moverá al campo hacia la derecha o hacia la izquierda, en función de esta dirección inversa.=
: Cañón. Si una canica llega a este campo, la moverá hacia la derecha o hacia la izquierda en la dirección actual, hasta que la canica encuentre un campo que no sea,
-
oO
.<
: Igual que el anterior, pero siempre establecerá la dirección y se moverá hacia la izquierda.>
: Igual que el anterior, pero a la derecha.
Las siguientes garantías se dan con respecto al diagrama.
- Cada fila de entrada tendrá exactamente la misma longitud en los campos.
- El campo más a la izquierda y a la derecha de cada fila siempre será a
|
. - El diagrama no contendrá ninguna ruta posible a través de la cual las canicas puedan quedar atrapadas en la máquina durante una cantidad indeterminada de iteraciones, como
\/
o^^
. - El diagrama solo contendrá los campos mencionados anteriormente.
- Hay una o más fuentes
Resultado
Su tarea será generar un gráfico de barras ASCII de 16 líneas de altura de la distribución de probabilidad en la que las canicas salen del lado inferior del gráfico, escaladas de modo que la mayor probabilidad cubra los 16 caracteres. Entonces para el siguiente problema:
| O |
| ^ |
| ^ ^ |
| ^ ^ ^ |
| ^ ^ ^ ^ |
| ^ ^ ^ ^ ^ |
Su programa debe producir la siguiente solución (tenga en cuenta que debe tener el mismo ancho que el programa de entrada, incluidas las tuberías a un lado:
# #
# #
# #
# #
# #
# #
# #
# #
# # # #
# # # #
# # # #
# # # #
# # # #
# # # #
# # # # # #
# # # # # #
Ejemplos
El siguiente es un ejemplo que debería probar la funcionalidad de todos los diferentes tipos de campo:
| O O |
| O ^ / <^\\\ |
| ^ > ^ |
| ^ ^ ^ =|
| ^ ^ | ^ <^ O |
| ^ > ^ | ^ O ^> v |
|| ^U ^ | = ^\ |
| ^ ^ ^ ^U ^\ ---^ |
| = ^ ^ = v |
Debería dar como resultado el siguiente resultado:
#
#
#
#
# #
# #
# #
# # # #
# # # #
# # # #
# # # #
## # # #
## # # # #
# ### # # # #
# # ### # # # #
# # ### # # # #
Reglas
Ambas funciones y programas completos constituyen respuestas válidas para este desafío. Recibirá el diagrama como una cadena separada por una nueva línea y deberá devolver el gráfico de salida en el formato dado. Se aplican las reglas predeterminadas de entrada / salida . Si bien las líneas nuevas y finales se permiten en la salida, cada fila debe tener exactamente el mismo ancho que la entrada.
Para permitir soluciones más creativas, solo se requiere que su programa muestre el resultado correcto más del 90% del tiempo para el mismo diagrama. Es una simulación de probabilidad después de todo.
Tanteo
Este es el código de golf , por lo que gana la puntuación más baja en bytes.
fuente
v
=[space]
?v
y[space]
difieren en cómo los cañones interactúan a su alrededor.Respuestas:
Python 3 ,
431429410 bytesPruébalo en línea!
Esta respuesta es un esfuerzo de colaboración entre Wheat Wizard y CensoredUsername. Como referencia, este es el algoritmo sin golf.
-2 bytes del Sr. Xcoder
-19 bytes de CensoredUsername
fuente
but I can confirm it's doable in 519 characters of python 3 code ;) I don't think I can golf mine much more
- Nombre de usuario censuradoPython 2 , 731 bytes
Pruébalo en línea!
-17 bytes gracias a caird coinheringaahing
-12 bytes gracias a Nathan Shiraini
-56 bytes cambiando a sangría mixta (Python 2)
-28 gracias a CensoredUsername porque las probabilidades se normalizan al final, por lo que no es necesario que las probabilidades finales siempre sumen 1.
-7 bytes gracias a la calculadora felina mediante el uso de una
elif
declaración final más corta .-218 bytes fusionando las dos funciones
fuente
R
yL
comoR(r+1-N,C+N,P,N=N)
(primera llamada aR
), no es necesario elN=
al final; debería serR(r+1-N,C+N,P,N)
en su lugar.L
yR
^^ Además, su segundo nivel de sangría es de 4 espacios en todas partes, creo que podría hacerlo 2.C,
569568556 bytesGolfed
Sin golf
Ediciones
Ahorré 12 bytes cambiando mi macro de caso.
Notas
Mi código utiliza un sistema de enteros de base 3 para determinar hacia dónde se dirige la canica y hacia dónde se dirigirá (para cañones y demás).
Lo intenté, así que tuve que superar esa solución de Python, realmente lo hice.
fuente