El reto
Dado un tablero de bagatelas como el siguiente:
| |
| /\ / |
| \ /|
| \ \ /\ \ |
| \ / \ |
|\ / / \ |
| \ / \ |
| \ |
| \ / \ /\ \ |
|\ / / \ /|
| / |
| /\ / / |
| / |
|\ / / / |
| |
----------------------
su tarea es convertir una lista de 'tiros' en una puntuación.
El tablero siempre tendrá 20 caracteres (más 2 bordes) de ancho, pero de altura variable. Cada 'lanzamiento' es un número que representa dónde cae la pelota en el tablero, comenzando en 0 para el extremo izquierdo hasta 19 para el extremo derecho. Cada bola caerá hacia abajo a menos que encuentre a /
o a \
. Al encontrarse /
, la bola se desplaza una columna hacia la izquierda y \
la bola se desplaza una columna hacia la derecha. Después de ser desplazado, la pelota continúa hacia abajo como antes. El puntaje de un tiro depende de dónde golpea la pelota el fondo del tablero.
Los puntajes para cada posición final son los siguientes:
| |
----------------------
01234567899876543210
y son iguales para todos los tableros. La primera y la última fila siempre estarán vacías. La pelota está garantizada para llegar a la parte inferior, independientemente de donde se deja caer desde, por lo que no habrá tableros donde pueden quedar atrapados por \/
, \|
o |/
combinaciones.
Entrada
La entrada estará en STDIN y consistirá en el tablero seguido de una línea en blanco seguida de una lista de números separados por espacios que representan los lanzamientos.
Salida
Ouput debe ser el puntaje total para el juego dado.
Un par de ejemplos
Entrada
| |
| \ |
| \ |
| \ |
| \ |
| \ |
| \ |
| \ |
| \ |
| \ |
| \ |
| \ |
| \ |
| \ |
| \ |
| \ |
| \ |
| \ |
| |
| |
----------------------
1 4 2 19 0 2 4 3 17 13 16
Salida
9
Entrada
| |
| \ / |
| \ / |
| \ / |
| \ / |
| \ / |
| \ / |
| \ / |
| \ / |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
----------------------
15 10 3 8 18 19 0 6 7 10
Salida
72
Entrada
| |
| ////////////////// |
| \\\\\\\\\\\\\\\\\\ |
| ////////////////// |
| \\\\\\\\\\\\\\\\\\ |
| ////////////////// |
| \\\\\\\\\\\\\\\\\\ |
| ////////////////// |
| \\\\\\\\\\\\\\\\\\ |
| ////////////////// |
| \\\\\\\\\\\\\\\\\\ |
| |
----------------------
1 4 18 17 14 2 0 19 15
Salida
18
Scripts de prueba
He usado algunos scripts de prueba escritos por Joey y Ventero (espero que no les importe ...) para crear algunas pruebas para esta tarea:
Uso: ./test [your program and its arguments]
Esto es codegolf: la solución más corta gana.
Respuestas:
GolfScript,
6059 caracteresTuve la tentación de escribir una solución que funciona redefiniendo los símbolos
/
,\
yspace
, pero en realidad es bastante costosa (especialmente una vez que ya no puede usar el original\
).31%4%(
se mella de la solución de Keith Randall y asigna los códigos ASCII paraspace
,/
y\
a0
,-1
,1
respectivamente. (Ver historial de edición).fuente
./test ruby golfscript.rb peter.gs
? Le lancé algunas pruebas como entrada canalizada../test-bagatelle.sh `which golfscript.rb` bagatelle2.gs
Python 2,
147 132130 caracteresfuente
s+=min(p,19-p)
?for r in l[:-3]:p-=" /".find(r[p])
debería guardar algunos caracteres19-p+1 == 20-p
Pitón,
165159 caracteresComienza con una fila de puntajes y avanza de abajo hacia arriba, calculando cuáles serían los puntajes para las bolas que comienzan en cada fila.
fuente
list(sys.stdin)
en lugar dereadlines()
Ruby,
123117115107999897fuente
i-='\ /'...
en lugar de guardar una más Char