Простая Багатель

13

Соревнование

Учитывая доску вещицы, как показано ниже:

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

Ваша задача - превратить список «бросков» в счет.

Доска всегда будет 20 символов (плюс 2 ребра) шириной, но переменной высоты. Каждый «бросок» - это число, обозначающее, где мяч падает на доску, начиная с 0 для крайнего левого угла и до 19 для крайнего правого. Каждый шар будет падать прямо вниз, если он не встретит a /или a \. При столкновении /мяч перемещается на одну колонку влево, а \мяч перемещается на одну колонку вправо. После смещения мяч продолжает двигаться прямо вниз, как и раньше. Счет за бросок зависит от того, где мяч коснулся нижней части доски.

Баллы за каждую финишную позицию следующие:

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

и одинаковы для всех плат. Первая и последняя строки всегда будут пустыми. Мяч гарантированно достигнет дна независимо от того, откуда он упал, поэтому не будет ни досок, на которых он может быть пойман \/, \|ни |/комбинаций.

вход

Ввод будет осуществляться через STDIN и будет состоять из доски, за которой следует пустая строка, за которой следует список чисел, представляющих броски, через пробел.

Выход

Ouput должен быть общим счетом для данной игры.

Пара примеров

вход

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

1 4 2 19 0 2 4 3 17 13 16

Выход

9

вход

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

15 10 3 8 18 19 0 6 7 10

Выход

72

вход

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

1 4 18 17 14 2 0 19 15

Выход

18

Тестовые сценарии

Я использовал несколько тестовых сценариев, написанных Джои и Вентеро (надеюсь, они не против ...), чтобы создать несколько тестов для этой задачи: -

Использование: ./test [your program and its arguments]

Это Codegolf - выигрывает самое короткое решение.

Gareth
источник
Вы могли бы также создать мой генерирующий скрипт для них :-). В конце концов я хотел сделать это публичным, но до тех пор, пока он все еще нуждается в настройке для многих задач, я не хотел этого делать.
Джои
@Joey Генерирующий скрипт был бы полезным инструментом для доступности.
Гарет
Оба набора тестов должны быть исправлены сейчас.
Гарет

Ответы:

3

GolfScript, 60 59 символов

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

Я был так искушен написать решение, которое работает путем переопределения символов /, \и space, но на самом деле это довольно дорого (особенно если вы больше не можете использовать оригинал \).

31%4%(это рваный из раствора Кита Рэндалла и отображает коду ASCII для space, /и \к 0, -1, 1соответственно. (См. Историю редактирования).

Питер Тейлор
источник
1
Удивительно долго для GolfScript. :-) А как ты заставил его работать с тестовым скриптом? Все, что я получил, это ошибки при попытке ./test ruby golfscript.rb peter.gs? Вместо этого я провел несколько тестов в качестве входных данных.
Гарет
./test-bagatelle.sh `which golfscript.rb` bagatelle2.gs
Питер Тейлор
4

Python 2, 147 132 130 символов

импорт системы
s = 0
л = лист (sys.stdin)
для t в l [-1] .split ():
 р = INT (т) + 1
 для r в l [: - 3]: p- = "/".find(r[p])
 S + = мин (р-1,20-р)
печать с
cemper93
источник
2
Может быть s+=min(p,19-p)?
Кит Рэндалл
2
for r in l[:-3]:p-=" /".find(r[p])следует сохранить несколько символов
gnibbler
1
Спасибо вам двоим. Особенно уловка Гнибблера действительно удивительна - но это не помешает узнать и более короткую три-функцию;)
cemper93
1
@gnibbler Это гениальный трюк.
Гарет
1
19-p+1 == 20-p
Lowjacker
3

Питон, 165 159 символов

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

Он начинается с ряда баллов и работает снизу вверх, вычисляя, какими будут баллы для шаров, начинающихся в каждом ряду.

Кит Рэндалл
источник
list(sys.stdin)вместоreadlines()
gnibbler
3

Рубин, 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
источник
1
Зачем использовать спасение? Разве вы не можете отрубить две строки из b в начальном задании?
Мигимару
@Migimaru: Действительно. Но мне нужно отрубить три строки, а не две.
Lowjacker
Правильно. Я имел в виду две другие линии. Сожалею.
Мигимару
1
i-='\ /'...вместо этого вы можете использовать еще один символ
gnibbler