Cluck cluck. Ninguém sabe por que a galinha atravessou a rua, talvez houvesse um galo bonito do outro lado. Mas podemos descobrir como. Escreva um programa que, da esquerda para a direita, atravesse esta (ou qualquer) "estrada".
1356 | 1738
3822 | 1424
3527 3718
9809 | 5926
0261 | 1947
7188 4717
6624 | 9836
4055 | 9164
2636 4927
5926 | 1964
3144 | 8254
Seu programa "atravessa", movendo-se da esquerda para a direita. Você inicia com qualquer número na coluna da esquerda que desejar. A partir daí, você pode mover para qualquer caractere adjacente à direita. Se você começou no canto superior esquerdo, 1, pode ir para 3 ou 8. Todos os números que você acessa, incluindo o número inicial, são adicionados a uma soma. Os espaços não são adicionados à sua soma. "|" força você a subir ou descer, em vez de algum lugar à direita. (Você NÃO PODE avançar nesse personagem) Seu objetivo é chegar ao outro lado com a menor soma possível. Seu programa deve imprimir a soma no final e deve poder resolver qualquer estrada. De preferência, ele também pode ter entrada para uma estrada, mas não é necessário. Seu programa deve imprimir o caminho e a soma. Menos bytes de código vencidos.
Para esclarecer, você pode mover o diagnóstico, a menos que esteja em uma barra vertical. Você só pode mover para cima e para baixo quando estiver em uma barra vertical.
Para uma especificação mais clara das estradas, é basicamente uma sequência de texto (ou uma matriz de colunas ou linhas, se você preferir pensar dessa maneira) que segue as regras dos caracteres e não pode haver nada além desses caracteres. a estrada. Pode haver qualquer número, um espaço, uma barra ("|") ou uma nova linha. Se uma estrada foi pavimentada por um cara bêbado, como na resposta do ProgrammerDan, ainda é uma estrada válida e seu programa deve ser capaz de resolvê-la. Não é considerada uma estrada se for impossível chegar ao outro lado (por exemplo, não há como sair de uma linha reta de barras).
Seu programa não é necessário para determinar se uma estrada é inválida.
Tecla:
Qualquer número - adiciona o número à sua soma, avança.
Espaço - Avançar, nada é adicionado à sua soma.
"|" - Mover para cima ou para baixo, nada é adicionado à sua soma.
EDIT: Um exemplo de solução, conforme sugerido. Não posso fazer uma coisa horrivelmente grande, não consigo entrar em um IDE para resolvê-lo para mim ATM.
Pegue esta pequena estrada:
9191 | 8282
1919 | 2727
5555 5555
A solução seria um caminho de 1, 1, 1, 1, espaço, divisor, divisor, espaço, espaço, 2, 2, 2, 2 para um total de 12.
EDIT # 2: A solução para o primeiro caminho nesta questão, conforme determinado pelos programas Geobits e povos, é 0,2,0,1,,,, 1,4,1,4 para uma soma de 13.
fonte
|
seguidas?0,2,0,1, , , ,1,4,1,4 -> 13
Respostas:
Pyth,
168143141 bytes [agora compatível com Drunken Road]Meu caso de teste funciona, mas devido a um mal-entendido da minha parte, ele não funcionará corretamente com o exemplo inicial. Estou trabalhando para consertá-lo.Agora trabalhando para o exemplo original e estradas bêbadas
Algum código
REALMENTEum pouco menos feio:Teste aqui
Eu testei em uma estrada 10 + 9 x 40.
fonte
Java, 955 bytes
Obviamente, não vou ganhar nenhum prêmio, sendo Java e tudo, mas eu amo esse problema e queria lançar minha própria entrada.
Recursos e limites:
Ok, chega de jibba jabba. Versão Golfed:
De acordo com meu hábito, o github com o código não destruído .
Solução para a "primeira" estrada:
Segundo exemplo:
Amostra de Brian Tuck:
Exemplo "bêbado" de Brian:
Solução visualizada:
Desfrutar!
Edit: Agora estou apenas exibindo (duas estradas se fundem! Ele consegue?)
Solução:
(bônus: caminho do não-destruído):
Detalhes sobre o algoritmo
Foi solicitada uma explicação mais completa da técnica de Programação Dinâmica que empreguei, então aqui vai:
Estou usando um método de solução de marcação e pré-cálculo. Tem um nome próprio, mas há muito que o esqueci; talvez alguém possa oferecer isso?
Algoritmo:
Notas:
É isso aí. Digitalizamos de cima para baixo, da direita para a esquerda, uma vez; as únicas células tocadas (potencialmente) mais de uma vez são tubos, no entanto, cada tubo é "resolvido" apenas uma vez, mantendo-nos dentro da nossa janela O (m * n).
Para lidar com tamanhos de mapa "ímpares", optei por pré-digitalizar e normalizar comprimentos de linhas preenchendo caracteres nulos. Caracteres nulos contam como "custo zero" se move da mesma maneira que tubulações e espaços. Em seguida, ao imprimir a solução, paro de imprimir os custos ou os movimentos quando a borda da estrada normalizada é atingida ou um caractere nulo é atingido.
A beleza desse algoritmo é que é muito simples, aplica as mesmas regras a todas as células, produzindo uma solução completa resolvendo subproblemas de O (m * n) e, em termos de velocidade, é bastante rápido. Ele troca memória, criando efetivamente duas cópias na memória do roteiro, a primeira a armazenar dados de "melhor custo" e a segunda a armazenar dados de "melhor movimentação" por célula; isso é típico para programação dinâmica.
fonte
c
como-1>>>1
.