A Mere Bagatelle

13

O desafio

Dada uma placa de bagatela como a abaixo:

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

sua tarefa é transformar uma lista de 'arremessos' em uma pontuação.

O quadro sempre terá 20 caracteres (mais 2 arestas) de largura, mas de altura variável. Cada 'arremesso' é um número que representa onde a bola cai no tabuleiro, começando em 0 na extrema esquerda até 19 na extrema direita. Cada bola cairá diretamente, a menos que encontre a /ou a \. O encontro a /move a bola uma coluna para a esquerda e a \move a bola uma coluna para a direita. Depois de ser deslocada, a bola continua reta como antes. A pontuação para um arremesso depende de onde a bola bate no fundo do tabuleiro.

As pontuações para cada posição final são as seguintes:

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

e são iguais para todas as placas. A primeira e a última linha estarão sempre vazias. A bola é garantido para alcançar o fundo, independentemente de onde é retirado, então não haverá placas onde ele pode ficar preso por \/, \|ou |/combinações.

Entrada

A entrada estará em STDIN e consistirá no quadro seguido por uma linha em branco seguida por uma lista de números separados por espaço representando os arremessos.

Resultado

Ouput deve ser a pontuação total para o jogo em questão.

Alguns exemplos

Entrada

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

1 4 2 19 0 2 4 3 17 13 16

Resultado

9

Entrada

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

15 10 3 8 18 19 0 6 7 10

Resultado

72

Entrada

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

1 4 18 17 14 2 0 19 15

Resultado

18

Scripts de teste

Eu usei alguns scripts de teste escritos por Joey e Ventero (espero que eles não se importem ...) para criar alguns testes para esta tarefa: -

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

Este é o codegolf - a solução mais curta vence.

Gareth
fonte
Você poderia ter o meu script de geração para eles também :-). Eu finalmente quis tornar isso público, mas enquanto ele ainda precisar de ajustes para muitas tarefas, eu não queria fazer isso.
Joey
@ Joey Um script de geração seria uma ferramenta útil para ter disponível.
Gareth
Ambos os conjuntos de teste devem ser corrigidos agora.
Gareth

Respostas:

3

GolfScript, 60 59 caracteres

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

Eu estava tão tentado a escrever uma solução que funciona através da redefinição dos símbolos /, \e space, mas na verdade é bastante caro (especialmente uma vez que você não pode mais usar o original \).

31%4%(é cortado a partir de solução de Keith Randall e mapeia os códigos ASCII para space, /e \para 0, -1, 1respectivamente. (Veja o histórico de edições).

Peter Taylor
fonte
1
Surpreendentemente longo para o GolfScript. :-) Como você conseguiu trabalhar com o script de teste? Tudo o que recebi foram erros quando tentei ./test ruby golfscript.rb peter.gs? Joguei alguns testes nele como entrada canalizada.
Gareth
./test-bagatelle.sh `which golfscript.rb` bagatelle2.gs
Peter Taylor
4

Python 2, 147 132 130 caracteres

sys de importação
s = 0
l = lista (sys.stdin)
para t em l [-1] .split ():
 p = int (t) +1
 para r em l [: - 3]: p- = "/".find(r[p])
 s + = min (p-1,20-p)
imprimir s
cemper93
fonte
2
Talvez s+=min(p,19-p)?
Keith Randall
2
for r in l[:-3]:p-=" /".find(r[p])deve salvar alguns caracteres
gnibbler
1
Obrigado a vocês dois. Especialmente truque de gnibbler é verdadeiramente incrível - mas não pode ferir a conhecer uma função tri mais curto, também;)
cemper93
1
@gnibbler Esse é um truque genial.
Gareth
1
19-p+1 == 20-p
Lowjacker 02/09/11
3

Python, 165 159 caracteres

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

Começa com uma linha de pontuações e segue seu caminho de baixo para cima, calculando quais seriam as pontuações para bolas começando em cada linha.

Keith Randall
fonte
list(sys.stdin)em vez dereadlines()
gnibbler 01/09/11
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
fonte
1
Por que usar o resgate? Você não pode cortar duas linhas de b na tarefa inicial?
migimaru 5/09/11
@migimaru: De fato. Mas tenho que cortar três linhas, não duas.
Lowjacker 5/09/11
Certo. Eu quis dizer mais duas linhas. Desculpe.
migimaru 6/09/11
1
você pode usar i-='\ /'...em vez de salvar mais um caractere
gnibbler