A Mere Bagatelle


13

La sfida

Data una tavola bagatelle come quella qui sotto:

|                    |
|    /\            / |
|      \            /|
|  \      \ /\    \  |
|   \   /       \    |
|\     /   /  \      |
|   \            / \ |
|    \               |
|  \    / \ /\    \  |
|\     /   /  \     /|
|                /   |
|    /\         /  / |
|              /     |
|\     /   /  /      |
|                    |
----------------------

il tuo compito è trasformare un elenco di "tiri" in un punteggio.

Il tabellone avrà sempre 20 caratteri (più 2 bordi) di larghezza, ma di altezza variabile. Ogni "tiro" è un numero che rappresenta il punto in cui la palla cade nel tabellone, a partire da 0 per l'estrema sinistra fino a 19 per l'estrema destra. Ogni palla cadrà verso il basso a meno che non incontri a /o a \. L'incontro a /sposta la palla di una colonna a sinistra, e \sposta la palla di una colonna a destra. Dopo essere stata spostata, la palla continua dritta come prima. Il punteggio per un tiro dipende da dove la palla colpisce il fondo del tabellone.

I punteggi per ciascuna posizione finale sono i seguenti:

|                    |
----------------------
 01234567899876543210

e sono uguali per tutte le schede. La prima e l'ultima riga saranno sempre vuote. La palla è garantito per raggiungere il fondo, indipendentemente da dove è caduto da, quindi non ci saranno tavole in cui si può ottenere intrappolati dal \/, \|o |/combinazioni.

Ingresso

L'input sarà su STDIN e sarà costituito dalla scheda seguita da una riga vuota seguita da un elenco separato da spazi di numeri che rappresentano i tiri.

Produzione

L'uscita dovrebbe essere il punteggio totale per il gioco dato.

Un paio di esempi

Ingresso

|                    |
| \                  |
|  \                 |
|   \                |
|    \               |
|     \              |
|      \             |
|       \            |
|        \           |
|         \          |
|          \         |
|           \        |
|            \       |
|             \      |
|              \     |
|               \    |
|                \   |
|                 \  |
|                    |
|                    |
----------------------

1 4 2 19 0 2 4 3 17 13 16

Produzione

9

Ingresso

|                    |
| \                / |
|  \              /  |
|   \            /   |
|    \          /    |
|     \        /     |
|      \      /      |
|       \    /       |
|        \  /        |
|                    |
|                    |
|                    |
|                    |
|                    |
|                    |
|                    |
|                    |
|                    |
|                    |
----------------------

15 10 3 8 18 19 0 6 7 10

Produzione

72

Ingresso

|                    |
| ////////////////// |
| \\\\\\\\\\\\\\\\\\ |
| ////////////////// |
| \\\\\\\\\\\\\\\\\\ |
| ////////////////// |
| \\\\\\\\\\\\\\\\\\ |
| ////////////////// |
| \\\\\\\\\\\\\\\\\\ |
| ////////////////// |
| \\\\\\\\\\\\\\\\\\ |
|                    |
----------------------

1 4 18 17 14 2 0 19 15

Produzione

18

Script di test

Ho usato alcuni script di test scritti da Joey e Ventero (spero che non gli dispiaccia ...) per creare alcuni test per questo compito: -

Uso: ./test [your program and its arguments]

Questo è codegolf: la soluzione più corta vince.


Potresti avere la mia sceneggiatura generatrice anche per loro :-). Alla fine volevo renderlo pubblico, ma fintanto che ha ancora bisogno di essere modificato per molte attività non volevo farlo.
Joey,

@Joey Uno script di generazione sarebbe uno strumento utile da avere a disposizione.
Gareth,

Entrambi i set di test dovrebbero essere corretti ora.
Gareth,

Risposte:


3

GolfScript, 60 59 caratteri

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

Ero così tentato di scrivere una soluzione che funziona ridefinendo i simboli /, \e space, ma in realtà è piuttosto costoso (soprattutto una volta che non è più possibile utilizzare l'originale \).

31%4%(viene scalfito dalla soluzione di Keith Randall e mappa i codici ASCII per space, /e \per 0, -1, 1rispettivamente. (Vedi cronologia delle modifiche).


1
Sorprendentemente lungo per GolfScript. :-) Come hai fatto a farlo funzionare con lo script di test? Tutto quello che ho avuto sono stati errori quando ho provato ./test ruby golfscript.rb peter.gs? Ho invece lanciato alcuni test come input convogliato.
Gareth,

./test-bagatelle.sh `which golfscript.rb` bagatelle2.gs
Peter Taylor,

4

Python 2, 147 132 130 caratteri

import sys
s = 0
l = lista (sys.stdin)
per t in l [-1] .split ():
 p = int (t) +1
 per r in l [: - 3]: p- = "/".find(r[p])
 s + = min (p-1,20-p)
stampa s

2
Forse s+=min(p,19-p)?
Keith Randall,

2
for r in l[:-3]:p-=" /".find(r[p])dovrebbe salvare alcuni caratteri
gnibbler

1
Grazie a voi due. Soprattutto il trucco di gnibbler è davvero fantastico - ma non può far male sapere anche una funzione tri più breve;)
cemper93

1
@gnibbler È un trucco geniale.
Gareth,

1
19-p+1 == 20-p
Lowjacker

3

Python, 165 159 caratteri

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())

Inizia con una fila di punteggi e si fa strada dal basso verso l'alto, calcolando quali sarebbero i punteggi per le palline che iniziano su ogni fila.


list(sys.stdin)invece direadlines()
gnibbler,

3

Rubino, 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}*?+

1
Perché usare il salvataggio? Non puoi tagliare due righe da b nell'assegnazione iniziale?
migimaru,

@migimaru: Davvero. Ma devo tagliare tre righe, non due.
Lowjacker,

Giusto. Intendevo altre due righe. Scusa.
migimaru,

1
puoi i-='\ /'...invece usare per salvare un altro
personaggio
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.