Une simple bagatelle

13

Le défi

Étant donné une planche de bagatelle comme celle ci-dessous:

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

votre tâche consiste à transformer une liste de «lancers» en score.

La planche aura toujours 20 caractères (plus 2 bords) de large, mais de hauteur variable. Chaque «lancer» est un nombre représentant l'endroit où le ballon tombe dans le plateau, commençant à 0 pour l'extrême gauche jusqu'à 19 pour l'extrême droite. Chaque balle tombera directement à moins qu'elle ne rencontre a /ou a \. La rencontre avec a /déplace la balle d'une colonne vers la gauche et a \déplace la balle d'une colonne vers la droite. Après avoir été déplacé, le ballon continue tout droit comme auparavant. Le score d'un lancer dépend de l'endroit où le ballon touche le bas du plateau.

Les scores pour chaque position finale sont les suivants:

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

et sont les mêmes pour toutes les planches. Les première et dernière lignes seront toujours vides. La balle est garantie pour atteindre le fond , peu importe où il est passé de, donc il n'y aura pas de conseils où il peut se piégés par \/, \|ou des |/combinaisons.

Contribution

L'entrée se fera sur STDIN et consistera en un tableau suivi d'une ligne vierge suivie d'une liste de nombres séparés par des espaces représentant les lancers.

Production

Ouput devrait être le score total pour le jeu donné.

Quelques exemples

Contribution

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

1 4 2 19 0 2 4 3 17 13 16

Production

9

Contribution

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

15 10 3 8 18 19 0 6 7 10

Production

72

Contribution

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

1 4 18 17 14 2 0 19 15

Production

18

Scripts de test

J'ai utilisé des scripts de test écrits par Joey et Ventero (j'espère que cela ne les dérange pas ...) pour créer des tests pour cette tâche: -

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

C'est codegolf - la solution la plus courte l'emporte.

Gareth
la source
Vous pourriez aussi avoir mon script de génération pour eux :-). J'ai finalement voulu le rendre public, mais tant qu'il a encore besoin d'être peaufiné pour de nombreuses tâches, je ne voulais pas le faire.
Joey
@Joey Un script de génération serait un outil utile à disposition.
Gareth
Les deux ensembles de tests devraient être corrigés maintenant.
Gareth

Réponses:

3

GolfScript, 60 59 caractères

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

J'étais tellement tenté d'écrire une solution qui fonctionne en redéfinissant les symboles /, \et space, mais c'est en fait assez cher (surtout une fois que vous ne pouvez plus utiliser l'original \).

31%4%(est entaillé de la solution de Keith Randall et des cartes les codes ASCII pour space, /et \à 0, -1, 1respectivement. (Voir l'historique des modifications).

Peter Taylor
la source
1
Étonnamment long pour GolfScript. :-) Comment avez-vous réussi à le faire fonctionner avec le script de test? Je n'ai eu que des erreurs quand j'ai essayé ./test ruby golfscript.rb peter.gs? Je lui ai lancé des tests en tant qu'entrée canalisée.
Gareth
./test-bagatelle.sh `which golfscript.rb` bagatelle2.gs
Peter Taylor
4

Python 2, 147 132 130 caractères

importer sys
s = 0
l = liste (sys.stdin)
pour t dans l [-1] .split ():
 p = int (t) +1
 pour r dans l [: - 3]: p- = "/".find(r[p])
 s + = min (p-1,20-p)
imprimer s
cemper93
la source
2
Peut s+=min(p,19-p)- être ?
Keith Randall
2
for r in l[:-3]:p-=" /".find(r[p])devrait sauver quelques caractères
gnibbler
1
Merci à vous deux. Surtout le truc de gnibbler est vraiment génial - mais ça ne peut pas faire de mal de connaître une fonction tri plus courte aussi;)
cemper93
1
@gnibbler C'est une astuce de génie.
Gareth
1
19-p+1 == 20-p
Lowjacker
3

Python, 165 159 caractères

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

Il commence par une rangée de scores et fonctionne de bas en haut, calculant ce que seraient les scores des balles commençant à chaque rangée.

Keith Randall
la source
list(sys.stdin)au lieu 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
la source
1
Pourquoi utiliser le sauvetage? Vous ne pouvez pas couper deux lignes de b dans l'affectation initiale?
migimaru
@migimaru: En effet. Mais je dois couper trois lignes, pas deux.
Lowjacker
Droite. Je voulais dire deux lignes supplémentaires . Pardon.
migimaru
1
vous pouvez utiliser à la i-='\ /'...place pour enregistrer un autre caractère
gnibbler