Mere Bagatelle

13

Wyzwanie

Biorąc pod uwagę tablicę bagatelle taką jak ta poniżej:

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

Twoim zadaniem jest przekształcenie listy rzutów w wynik.

Plansza będzie miała zawsze 20 znaków (plus 2 krawędzie), ale o zmiennej wysokości. Każdy „rzut” to liczba reprezentująca miejsce, w którym piłka wpada na planszę, zaczynając od 0 dla skrajnie lewej, aż do 19 dla skrajnie prawej. Każda piłka spadnie prosto w dół, chyba że napotka a /lub a \. Spotkanie /przesuwa piłkę o jedną kolumnę w lewo, a \przesuwa piłkę o jedną kolumnę w prawo. Po przesunięciu piłka kontynuuje grę prosto w dół, jak poprzednio. Wynik rzutu zależy od tego, gdzie piłka uderzy w spód planszy.

Wyniki dla każdej pozycji końcowej są następujące:

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

i są takie same dla wszystkich tablic. Pierwszy i ostatni wiersz zawsze będą puste. Piłka jest zagwarantowane, aby dosięgnąć dna, niezależnie od tego, gdzie jest on spadł z, więc nie będzie żadnych płyt, gdzie można go dostać uwięzionych przez \/, \|lub |/ich kombinacje.

Wejście

Dane wejściowe będą na STDIN i będą się składały z planszy, po której będzie pusta linia, a następnie rozdzielona spacjami lista liczb reprezentujących rzuty.

Wynik

Ouput powinien być całkowitym wynikiem dla danej gry.

Kilka przykładów

Wejście

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

1 4 2 19 0 2 4 3 17 13 16

Wynik

9

Wejście

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

15 10 3 8 18 19 0 6 7 10

Wynik

72

Wejście

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

1 4 18 17 14 2 0 19 15

Wynik

18

Skrypty testowe

Użyłem kilku skryptów testowych napisanych przez Joeya i Ventero (mam nadzieję, że nie mają nic przeciwko ...), aby utworzyć testy dla tego zadania: -

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

To jest codegolf - wygrywa najkrótsze rozwiązanie.

Gareth
źródło
Mógłbyś też mieć dla nich mój skrypt generujący :-). W końcu chciałem to upublicznić, ale tak długo, jak długo wymaga dostosowania do wielu zadań, nie chciałem tego robić.
Joey
@Joey Skrypt generujący byłby przydatnym narzędziem, które ma być dostępne.
Gareth
Oba zestawy testów powinny zostać teraz naprawione.
Gareth

Odpowiedzi:

3

GolfScript, 60 59 znaków

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

Kusiło mnie, aby napisać rozwiązanie, które działa na zasadzie redefinicji symboli /, \i space, ale w rzeczywistości jest dość drogie (zwłaszcza gdy nie możesz już używać oryginału \).

31%4%(jest ponacinane z roztworu Keitha Randall i odwzorowuje kody ASCII dla space, /i \do 0, -1, 1odpowiednio. (Zobacz historię edycji).

Peter Taylor
źródło
1
Zaskakująco długo jak na GolfScript. :-) Jak udało ci się jednak pracować ze skryptem testowym? Wszystko, co dostałem, to błędy, kiedy próbowałem ./test ruby golfscript.rb peter.gs? Zamiast tego rzuciłem na nią kilka testów jako dane wejściowe.
Gareth
./test-bagatelle.sh `which golfscript.rb` bagatelle2.gs
Peter Taylor
4

Python 2, 147 132 130 znaków

import sys
s = 0
l = lista (sys.stdin)
dla t w l [-1] .split ():
 p = int (t) +1
 dla rw l [: - 3]: p- = "/".find(r[p])
 s + = min (p-1,20-p)
drukuj s
cemper93
źródło
2
Może s+=min(p,19-p)?
Keith Randall,
2
for r in l[:-3]:p-=" /".find(r[p])powinien zapisać kilka znaków
gnibbler
1
Dziękuję wam dwoje. Zwłaszcza sztuczka gnibblera jest naprawdę niesamowita - ale nie zaszkodzi też poznać krótszą funkcję tri;)
cemper93
1
@gnibbler To genialna sztuczka.
Gareth
1
19-p+1 == 20-p
Lowjacker
3

Python, 165 159 znaków

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

Zaczyna się od rzędu wyników i działa od dołu do góry, obliczając wyniki dla piłek rozpoczynających się w każdym rzędzie.

Keith Randall
źródło
list(sys.stdin)zamiastreadlines()
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
źródło
1
Dlaczego warto korzystać z pomocy Czy nie możesz odciąć dwóch linii odb w początkowym zadaniu?
migimaru,
@migimaru: Rzeczywiście. Ale muszę odciąć trzy linie, a nie dwie.
Lowjacker
Dobrze. Chodziło mi dwie kolejne linie. Przepraszam.
migimaru
1
i-='\ /'...zamiast tego możesz użyć, aby uratować jeszcze jednego char
gnibblera