Dada uma sequência em que a primeira linha contém espaços e um ponto ( .
, a "bola"), seguida por linhas que contêm espaços, barras ( /
) e barras invertidas ( \
), determine em qual coluna a bola aterrará após cair da posição inicial . Cada um o /
move para a esquerda por 1 coluna e cada \
um para a direita por 1 coluna.
Entrada de amostra
.
/ \ \
/ /
\ \/ \
\ /\
\ /\ \
\ /
Saída de amostra
A bola começa na coluna 5, bate /
na linha 3, depois os três \
nas linhas 5 a 7 para uma posição final de:
7
Observe que as colunas são indexadas em 1, principalmente para consistência com as convenções do editor de texto.
Casos de borda
Se a bola atingir um /
na primeira coluna, ficará eternamente presa na coluna 0. inexistente. Seu programa deve lidar com isso corretamente imprimindo 0
.
Se a bola atingir um dos lados de um \/
padrão, o resultado será indefinido. É permitido ao seu programa terminar sem saída, executar um loop infinito ou imprimir uma mensagem de erro (minha solução é impressa -1
), mas não deve imprimir nada que possa ser visto como uma saída válida.
Se a bola acertar a barra esquerda em um \\
padrão, ela deve terminar diretamente abaixo da barra direita, não à direita dela. A solução que eu originalmente imaginava era propensa a errar, então não siga esse caminho!
Pode ou não haver espaços após a .
ou a última /
ou \
em cada linha. Seu programa não deve contar com esse preenchimento disponível. Em uma nota semelhante, pode ou não haver linhas após a primeira linha.
Você pode assumir que a primeira linha terá zero ou mais espaços e exatamente um .
. Linhas subsequentes, se houver, terão zero ou mais espaços e zero ou mais barras.
Detalhes da implementação
Seu programa pode ler de um arquivo (especificado como argumento da linha de comando) ou ler da entrada padrão, conforme sua conveniência.
Seu programa deve gerar um único número na saída padrão. (Sim, uma nova linha à direita está correta. Sim, o número pode ter mais de um dígito.)
Casos de teste
Entrada:
.
Resultado:
1
Observe que a entrada aqui é exatamente um byte. Este é o menor caso que você deve conseguir lidar.
Entrada:
. \ \ \ \
Resultado:
6
Observe que não há espaços após essas barras.
Entrada:
. / /\\ / \ //\ \/// // \\/ \/\ /\/
Resultado:
0
Entrada:
. / / / \\\ /\\ / \
Resultado:
1
Entrada:
. \ / / \
Resultado:
4
Entrada:
. \ \/\/\/
Resultado:
(anything but a nonnegative number)
Considerações finais
Essa pergunta é semelhante à simulação de um computador do tipo bola de bilhar (com base na gravidade) , mas significativamente mais simples, portanto, esperamos que ganhe mais interesse.
Eu tenho uma solução de 169 caracteres em Python. Tenho certeza de que os talentosos jogadores de golfe daqui podem rasgar esse recorde em pedaços. : ^)
Como o código é golfe , a resposta mais curta em caracteres será aceita no final do mês!
fonte
Respostas:
Python, 143B
Usando o truque de recuo de espaço / tabulação. Eu não fiz nada particularmente inteligente aqui.
F
é o índice atual,l
é a linha atual;z
é indefinido e gera uma exceção, que definitivamente não é um número inteiro positivo, lidando com a\/
situação.fonte
05AB1E , 37 bytes
Entrada como uma sequência de linhas múltiplas. Saídas
\/
se a bola estiver presa.Experimente online ou verifique todos os casos de teste .
Explicação:
fonte
CJam, 61 bytes
Se a regra referente
\/
for levantada (e não somos obrigados a lidar com isso), isso pode ser reduzido para 41 bytes:fonte
Java 10,
213208190 bytesLança uma divisão com erro zero quando estamos presos dentro de a
\/
.-5 bytes graças a @EdgyNerd .
Explicação:
Experimente aqui.
fonte
Python 3 , 124 bytes
Experimente online!
Também funciona em Python 2.
Explicação
fonte
J , 95 bytes
Experimente online!
Retorna o infinito
_
quando a bola fica presa. Perdeu muitos bytes lidando com esse caso especial. Caso contrário, é mais ou menos uma simples redução de linhas. Certamente poderia ser jogado ainda mais.fonte