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.
Respostas:
GolfScript,
6059 caracteresEu estava tão tentado a escrever uma solução que funciona através da redefinição dos símbolos
/
,\
espace
, 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 paraspace
,/
e\
para0
,-1
,1
respectivamente. (Veja o histórico de edições).fonte
./test ruby golfscript.rb peter.gs
? Joguei alguns testes nele como entrada canalizada../test-bagatelle.sh `which golfscript.rb` bagatelle2.gs
Python 2,
147 132130 caracteresfonte
s+=min(p,19-p)
?for r in l[:-3]:p-=" /".find(r[p])
deve salvar alguns caracteres19-p+1 == 20-p
Python,
165159 caracteresComeç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.
fonte
list(sys.stdin)
em vez dereadlines()
Ruby,
123117115107999897fonte
i-='\ /'...
em vez de salvar mais um caractere