Considere esta versión ASCII de un mecanismo similar a una máquina de frijoles o un juego plinko / pachinko :
O
^
\ ^
^ ^ \
\ ^ / ^
U U U U U
1 2 3 4 5
El O
es una bola que se cae.
- Cuando golpea a
^
, hay una probabilidad de 50-50 de ir hacia la izquierda o hacia la derecha. - Cuando golpea a
/
, siempre sale a la izquierda. - Cuando golpea a
\
, siempre sale bien.
La pelota finalmente cae en uno de los U
canales numerados en la parte inferior. La pregunta es, ¿cuál es la probabilidad de que termine en cada canal?
Para este caso particular, las probabilidades son 0.0
, 0.1875
, 0.5625
, 0.125
, y 0.125
, en los canales de 1 a 5 respectivamente.
He aquí otro ejemplo con 3 canales en lugar de 5. Las probabilidades son 0.5
, 0.5
, y 0.0
:
O
/
^ ^
U U U
1 2 3
En este desafío, generalizaremos este problema a un mecanismo con cualquier número de capas configuradas de cualquier manera.
Reto
Escriba un programa o función que tome la representación ASCII de la estructura piramidal del mecanismo. (Entrada a través de stdin / línea de comando / función arg.)
Puede suponer que viene con espacios que lo ponen en la forma adecuada, por ejemplo
^
\ ^
^ ^ \
\ ^ / ^
O puede suponer que viene sin espacios, por ej.
^
\^
^^\
\^/^
(Si lo desea, puede suponer que hay una nueva línea final y / o algún patrón consistente de espacios finales).
La estructura de la pirámide de entrada puede tener cualquier número de niveles (también conocidos como líneas), incluido cero. Cada nivel tiene uno más ^
, /
o \
que el anterior, y hay levels + 1
canales en la parte inferior (que no son parte de la entrada).
Su programa / función debe imprimir / devolver la lista de las probabilidades de que la bola caiga en cada uno de los canales (en el orden de la izquierda a la derecha). Estos deben ser valores de coma flotante que, cuando se imprimen, tienen al menos 3 decimales (no se requieren ceros ni puntos decimales superfluos; 1
está bien para 1.000
, .5
está bien para 0.500
, etc.). Si escribió una función, puede imprimir los valores o devolver una lista / matriz de los flotantes.
Cualquier formato razonable de lista impresa está bien. por ejemplo 0.5 0.5 0.0
, [0.5 0.5 0.0]
, [0.5, 0.5, 0.0]
, {0.5, 0.5, 0.0}
, o 0.5\n0.5\n0.0
todo estaría bien.
Ejemplos
0 niveles: (se reduce a un trivial U
)
Entrada: [no input/empty string given]
Salida:1.0
1 nivel:
Entrada: ^
Salida:0.5 0.5
Entrada: /
Salida:1.0 0.0
Entrada: \
Salida:0.0 1.0
2 niveles: (segundo ejemplo anterior)
Entrada:
/
^ ^
Salida: 0.5 0.5 0.0
3 niveles:
Entrada:
^
^ ^
^ ^ ^
Salida: 0.125 0.375 0.375 0.125
Entrada:
\
/ \
/ / \
Salida: 0.0 0.0 0.0 1.0
4 niveles: (primer ejemplo anterior)
Entrada:
^
\ ^
^ ^ \
\ ^ / ^
Salida: 0.0 0.1875 0.5625 0.125 0.125
7 niveles:
Entrada:
^
/ ^
^ ^ /
/ \ / \
^ ^ / ^ \
^ \ ^ \ / ^
\ ^ ^ ^ \ ^ /
Salida: 0.0 0.09375 0.28125 0.4375 0.1875 0.0 0.0 0.0
Tanteo
La respuesta más corta en bytes gana. Tiebreaker es una publicación anterior.
fuente
Respuestas:
CJam,
50 48 45 44 4240 bytesEsto espera que la entrada no tenga espacio y tenga una nueva línea final. Por ejemplo:
Algoritmo
La idea básica es seguir analizando cada carácter (solo hay 4 caracteres diferentes) y realizar diferentes operaciones en la distribución de probabilidad (inicialmente una matriz que contiene 1 elemento de valor 1). Para cada fila de caracteres de entrada (comenzando con el primer carácter en la primera fila), mantenemos una matriz de probabilidad del mismo tamaño. Cada personaje actúa sobre la primera probabilidad de la lista y empuja el par resultante al final de la lista. Después de cada línea, sumamos pares de la lista para obtener el número exacto de elementos como los elementos de la siguiente línea.
Aquí están los cuatro caracteres y las acciones requeridas correspondientes a cada uno:
^
: Cuando se produce este personaje, divide la probabilidad actual en dos partes. Por ejemplo, si tenemos esto en la primera línea, tenemos que convertir el[1]
a[0.5 0.5]
/
: Cuando se produce este carácter, debemos<current probability> 0
colocar la probabilidad actual en la matriz.\
: Cuando se produce este carácter, debemos0 <current probability>
colocar la probabilidad actual en la matriz.\n
: Cuando se produce este personaje, tenemos una nueva línea. Por lo tanto, agrupamos todos los pares de los 3 caracteres anteriores y los sumamos para obtener la probabilidad de cada elemento para la siguiente línea. Por ej.[0 0.5 0.25 0.25]
se convierte a[0 0.75 0.25]
. Tenga en cuenta que el primer y el último elemento tienen un par implícito (con valor 0) antes y después de ellos.Ahora solo tenemos que identificar el personaje correcto y realizar la acción correcta. Vamos a usar las matemáticas habituales aquí para hacer eso. Los códigos ASCII para
^
,\
,/
y\n
son94
,92
,47
, y10
. Después de algunas pruebas, obtenemos esta ecuación simple para convertir estos números en 0, 1, 2 y 3:da:
En una matriz de longitud 4, la última
4f%
sería implícita. Entonces, simplemente hacemos%13
el código ASCII del personaje y elegimos la acción correcta de una serie de acciones.Explicación del código :
Pruébalo en línea aquí
fuente
Rubí 140
Función que toma como entrada la cadena (se puede formatear muy bien como una pirámide) y devuelve una matriz de flotantes.
Pruébelo en línea: http://ideone.com/kmsZMe
Implementación bastante sencilla. Aquí no tiene golf:
fuente
Ruby,
140158bytesNo sigas votando esto cuando haya una mejor versión de ruby .Aquí hay más trucos para ti.Función sin nombre con un argumento. No debe contener espacios. Puede o no contener una nueva línea final.
Pierde 9 bytes al tener que manejarTodos los casos de prueba funcionan correctamente, vea aquí en ideone .0 levels
(cadena vacía).fuente
split
, por ejemplo.Pyth,
434241 bytesEsto espera que la entrada esté sin espacios. Pruébelo en línea: Pyth Compiler / Executor
Pyth, 40 bytes (cuestionable)
Gracias a @isaacg, por guardar un byte. Tenga en cuenta que esta versión en realidad no funcionó en la versión de Pyth, cuando se hizo la pregunta. Hubo un pequeño error en el compilador. A pesar de que este código no usa nuevas características de Pyth (solo cosas que estuvieron en los documentos de Pyth durante mucho tiempo y deberían haber funcionado), esta podría no ser una respuesta válida. Decide por ti mismo.
Pruébelo en línea: Pyth Compiler / Executor
Explicación:
Por ejemplo, si actualmente tengo las probabilidades de entrada
G = [0.5, 0.5, 0.0]
y la filaH = "^/^"
sucede lo siguiente:[(0.5,"^"), (0.5,"/"), (0.0,"^")]
[[0.25,0.25], [0.5,0.0], [0.0, 0.0]]
[0, 0.25, 0.25, 0.5, 0.0, 0.0, 0.0]
[0,0.25], [0.25,0.5], [0.0,0.0], [0.0]]
[0.25, 0.75, 0.0, 0.0]
fuente
hk
.,K@[ZJhkcJ2)x"\/"ek-JK
C #,
274247 bytesNada sofisticado, programa completo que lee líneas (con o sin espacios, simplemente las elimina) desde STDIN e imprime resultados separados por espacios en STDOUT.
Código ordenado con comentarios:
fuente
Pitón 3, 113
Actualiza repetidamente el vector de probabilidad
P
en respuesta a cada línea. Este nuevo vector de probabilidadQ
se crea una entrada a la vez. Itera a través de las nuevas ranuras, y calcula la contribución de la clavija a su derecha comor
, al tiempo que calcula la contribución restante a la próxima ranura comop-r
.Espera que cada línea termine en al menos un espacio para evitar un problema en el que las líneas terminen en una barra invertida.
fuente
input()
pueda manejar eso.Python 3, 138 bytes
Funciona con cualquier espacio en blanco, ya que todos se filtran (por
if'!'<e
).Método:
r
de las probabilidades de alcanzar cualquier obstáculo y los canales implícitos debajo de ellos. Partimos de la lista[1]
.0
a la lista para el comedero principal. Decidimos si es el primer obstáculo comparando su índicep
con el siguiente número triangulart*-~t/2
.^:0.5 0.5; /:1 0; \:0 1
). Usamos el siguiente método:v = ord(char) mod 7 + 1
ceder^:4 /:6 \:2
v div 3 / 2
produce la primera fracción (^:0.5 /:1 \:0
)v mod 3 / 2
produce la segunda fracción (^:0.5 /:0 \:1
)t + 1
elementos de la lista finalr
.2 bytes gracias al consejo de chat de @ Sp3000.
fuente
Perl, 78
Toma entrada sin espacios.
Trate de mí .
fuente
TI-BASIC,
7376Toma entrada una línea a la vez y finaliza cuando se ingresa un espacio por sí solo, porque ni los saltos de línea en cadenas ni las cadenas vacías son legales en TI-BASIC.
Estoy bastante seguro de que obtuve el tamaño correcto (TI-BASIC está tokenizado, por lo que cada comando toma uno o dos bytes: seq () toma uno, inString () toma dos, dim () toma uno, y así sucesivamente. I contó el tamaño manualmente).
Aunque el carácter de barra diagonal inversa es válido en una cadena, tenga en cuenta que no hay forma de ingresar uno desde el interior del programa a menos que haya modificado su calculadora.
fuente
Javascript - 117
Intenté usar la recursión, pero eso fue demasiado largo ...
Sombrero de punta a xnor para la idea de resta, que afeitó a una docena o más de personajes.
Sin golf:
fuente