Eine bloße Bagatelle

13

Die Herausforderung

Bei einem Bagatelle-Brett wie dem folgenden:

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

Ihre Aufgabe ist es, eine Liste von "Würfen" in eine Partitur zu verwandeln.

Die Tafel wird immer 20 Zeichen (plus 2 Kanten) breit sein, aber von variabler Höhe. Jeder 'Wurf' ist eine Zahl, die angibt, wo der Ball ins Spielfeld fällt, beginnend bei 0 (ganz links) bis 19 (ganz rechts). Jeder Ball fällt gerade nach unten, es sei denn, er trifft auf a /oder a \. Wenn Sie auf a /treffen, wird der Ball um eine Spalte nach links und \der Ball um eine Spalte nach rechts verschoben. Nach dem Verschieben geht der Ball weiter wie zuvor. Die Punktzahl für einen Wurf hängt davon ab, wo der Ball den unteren Rand des Bretts berührt.

Die Punktzahlen für jede Endposition sind wie folgt:

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

und sind für alle Boards gleich. Die erste und die letzte Zeile sind immer leer. Es ist garantiert, dass der Ball den Boden erreicht, unabhängig davon, von wo er fallen gelassen wird. Es gibt also keine Bretter, an denen er gefangen werden kann \/, \|oder |/Kombinationen.

Eingang

Die Eingabe erfolgt auf STDIN und besteht aus der Tafel, gefolgt von einer Leerzeile, gefolgt von einer durch Leerzeichen getrennten Liste von Zahlen, die die Würfe darstellen.

Ausgabe

Ausgabe sollte die Gesamtpunktzahl für das gegebene Spiel sein.

Ein paar Beispiele

Eingang

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

1 4 2 19 0 2 4 3 17 13 16

Ausgabe

9

Eingang

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

15 10 3 8 18 19 0 6 7 10

Ausgabe

72

Eingang

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

1 4 18 17 14 2 0 19 15

Ausgabe

18

Testskripte

Ich habe einige Testskripte von Joey und Ventero verwendet (ich hoffe, es macht ihnen nichts aus ...), um einige Tests für diese Aufgabe zu erstellen:

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

Das ist Codegolf - kürzeste Lösung gewinnt.

Gareth
quelle
Sie könnten auch mein Skript für sie generieren lassen :-). Ich wollte das irgendwann öffentlich machen, aber solange es für viele Aufgaben noch optimiert werden muss, wollte ich das nicht tun.
Joey
@Joey Ein generierendes Skript wäre ein nützliches Werkzeug, um es zur Verfügung zu haben.
Gareth
Beide Testreihen sollten jetzt behoben sein.
Gareth

Antworten:

3

GolfScript, 60 59 Zeichen

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

Ich war so versucht , eine Lösung zu schreiben , das durch eine Neudefinition der Symbole funktioniert /, \und space, aber es ist eigentlich ziemlich teuer (vor allem , wenn Sie nicht mehr das Original verwenden können \).

31%4%(von Keith Randall Lösung eingekerbt und bildet den ASCII - Codes für space, /und \zu 0, -1, 1jeweils. (Siehe Verlauf bearbeiten).

Peter Taylor
quelle
1
Überraschend lang für GolfScript. :-) Wie bist du aber dazu gekommen, mit dem Testskript zu arbeiten? Alles, was ich bekam, waren Fehler, als ich es versuchte ./test ruby golfscript.rb peter.gs? Ich habe stattdessen einige Tests als Pipe-Eingang durchgeführt.
Gareth
./test-bagatelle.sh `which golfscript.rb` bagatelle2.gs
Peter Taylor
4

Python 2, 147 132 130 Zeichen

Import sys
s = 0
l = Liste (sys.stdin)
für t in l [-1] .split ():
 p = int (t) +1
 für r in l [: - 3]: p- = "/".find(r[p])
 s + = min (p-1,20-p)
drucke s
cemper93
quelle
2
Vielleicht s+=min(p,19-p)?
Keith Randall
2
for r in l[:-3]:p-=" /".find(r[p])sollte ein paar Zeichen sparen
Knabber
1
Danke euch beiden. Besonders Gnibblers Trick ist wirklich großartig - aber es kann nicht schaden, auch eine kürzere Tri-Funktion zu kennen;)
cemper93
1
@ Gnibbler Das ist ein genialer Trick.
Gareth
1
19-p+1 == 20-p
Lowjacker
3

Python, 165 159 Zeichen

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

Es beginnt mit einer Reihe von Punkten und arbeitet sich von unten nach oben vor. Dabei wird berechnet, was die Punkte für Bälle sind, die in jeder Reihe beginnen.

Keith Randall
quelle
list(sys.stdin)anstelle vonreadlines()
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
quelle
1
Warum Rettung verwenden? Kannst du nicht zwei Zeilen von b in der anfänglichen Zuordnung abhacken?
Migimaru
@ Migimaru: In der Tat. Aber ich muss drei Zeilen abhacken, nicht zwei.
Lowjacker
Richtig. Ich wollte zwei weitere Linien. Es tut uns leid.
Migimaru
1
Sie können i-='\ /'...stattdessen ein weiteres
Zeichen