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.
Odpowiedzi:
GolfScript,
6059 znakówKusiło mnie, aby napisać rozwiązanie, które działa na zasadzie redefinicji symboli
/
,\
ispace
, 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 dlaspace
,/
i\
do0
,-1
,1
odpowiednio. (Zobacz historię edycji).źródło
./test ruby golfscript.rb peter.gs
? Zamiast tego rzuciłem na nią kilka testów jako dane wejściowe../test-bagatelle.sh `which golfscript.rb` bagatelle2.gs
Python 2,
147 132130 znakówźródło
s+=min(p,19-p)
?for r in l[:-3]:p-=" /".find(r[p])
powinien zapisać kilka znaków19-p+1 == 20-p
Python,
165159 znakówZaczyna 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.
źródło
list(sys.stdin)
zamiastreadlines()
Ruby,
123117115107999897źródło
i-='\ /'...
zamiast tego możesz użyć, aby uratować jeszcze jednego char