A Bare Bateltelle


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 - виграє найкоротше рішення.


Ви також можете створити мій сценарій для них :-). Я врешті-решт хотів оприлюднити цю публіку, але поки вона все ще потребує налаштування для багатьох завдань, я не хотіла цього робити.
Joey

@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

Пітон 2, 147 132 130 символів

імпортувати sys
s = 0
l = список (sys.stdin)
для t в l [-1] .split ():
 p = int (t) +1
 для r in l [: - 3]: p- = "/".find(r evidencep])
 s + = min (p-1,20-p)
друк s

2
Можливо s+=min(p,19-p)?
Кіт Рендалл

2
for r in l[:-3]:p-=" /".find(r[p])слід зберегти кілька символів
gnibbler

1
Дякую вам двом. Особливо хитрість гніблера справді приголомшлива - але це також не завадить знати коротшу
тричі

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}*?+

1
Навіщо використовувати порятунок? Ви не можете відрізати два рядки від b у початковому призначенні?
migimaru

@migimaru: Дійсно. Але я повинен відсікти три лінії, а не два.
Lowjacker

Правильно. Я мав у виду дві інші лінії. Вибачте.
migimaru

1
ви можете використовувати i-='\ /'...замість цього, щоб зберегти ще одне char
gnibbler
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.