Una simple bagatela

13

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.

Gareth
fuente
También podría tener mi script generador para ellos :-). Eventualmente quise hacer eso público, pero mientras todavía necesite ajustes para muchas tareas, no quería hacer eso.
Joey
@Joey Un script generador sería una herramienta útil para tener disponible.
Gareth
Ambos conjuntos de prueba deberían arreglarse ahora.
Gareth

Respuestas:

3

GolfScript, 60 59 caracteres

n/{},)\);{1>:x,,{.x=31%4%(+}%}%[10,.-1%+]+0@[~]{2${=}/+}/\;

Tuve la tentación de escribir una solución que funciona redefiniendo los símbolos /, \y space, 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 para space, /y \a 0, -1, 1respectivamente. (Ver historial de edición).

Peter Taylor
fuente
1
Sorprendentemente largo para GolfScript. :-) ¿Cómo lo hiciste funcionar con el script de prueba? Todo lo que obtuve fueron errores cuando lo intenté ./test ruby golfscript.rb peter.gs? Le lancé algunas pruebas como entrada canalizada.
Gareth
./test-bagatelle.sh `which golfscript.rb` bagatelle2.gs
Peter Taylor
4

Python 2, 147 132 130 caracteres

sys de importación
s = 0
l = lista (sys.stdin)
para t en l [-1] .split ():
 p = int (t) +1
 para r en l [: - 3]: p- = "/".find(r[p])
 s + = min (p-1,20-p)
imprimir m
cemper93
fuente
2
Tal vez s+=min(p,19-p)?
Keith Randall
2
for r in l[:-3]:p-=" /".find(r[p])debería guardar algunos caracteres
gnibbler
1
Gracias a los dos. Especialmente el truco de gnibbler es realmente asombroso, pero no está de más saber también una función tri más corta;)
cemper93
1
@gnibbler Ese es un truco genial.
Gareth
1
19-p+1 == 20-p
Lowjacker
3

Pitón, 165 159 caracteres

import sys
A=list(sys.stdin)
C=range(10)
C+=C[::-1]
for L in A[-4::-1]:C=[C[i+ord(L[i+1])%31%4-1]for i in range(20)]
print sum(C[int(x)]for x in A[-1].split())

Comienza 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.

Keith Randall
fuente
list(sys.stdin)en lugar dereadlines()
gnibbler
3

Ruby, 123 117 115 107 99 98 97

*b,_,_,n=*$<
p eval n.split.map{|k|i=k.to_i+1
b.map{|l|i-='\ /'.index(l[i])-1}
[i-1,20-i].min}*?+
Lowjacker
fuente
1
¿Por qué usar rescate? ¿No puedes cortar dos líneas de b en la asignación inicial?
migimaru
@migimaru: De hecho. Pero tengo que cortar tres líneas, no dos.
Lowjacker
Correcto. Quise decir dos líneas más . Lo siento.
migimaru
1
se puede utilizar i-='\ /'...en lugar de guardar una más Char
gnibbler