Os livros Escolha sua própria aventura são uma forma de literatura interativa em que o leitor deve tomar decisões que afetam o resultado da história. Em certos pontos da história, o leitor tem várias opções que podem ser escolhidas, cada uma enviando o leitor para uma página diferente do livro.
Por exemplo, em um cenário de fantasia, talvez seja necessário decidir na página 14 se aventurar em uma caverna misteriosa "pulando" na página 22 ou explorar a floresta próxima pulando na página 8. Esses "saltos" podem ser expressos como pares de números de páginas, assim:
14 22
14 8
Na maioria dos casos, existem muitos finais para a história, mas apenas alguns bons. O objetivo é navegar na história para alcançar um bom final.
Tarefa:
Dada uma lista de "saltos" para um determinado livro, sua tarefa é determinar uma rota que levará a um final específico. Como isso é bastante fácil, o verdadeiro desafio é fazê-lo com o menor número possível de caracteres.
Isso é código de golfe .
Entrada de amostra (onde 1 é o início e 100 é o objetivo):
1 10
10 5
10 13
5 12
5 19
13 15
12 20
15 100
Saída de amostra:
1 10 13 15 100
Entrada de amostra:
15 2
1 4
2 12
1 9
3 1
1 15
9 3
12 64
4 10
2 6
80 100
5 10
6 24
12 80
6 150
120 9
150 120
Saída de amostra:
1 15 2 12 80 100
Notas:
- A lista de saltos será inserida pelo usuário, a partir de um arquivo ou stdin. Você pode escolher o que for mais conveniente.
- A entrada conterá 1 salto por linha, com a origem e o destino separados por um único espaço.
- As linhas na entrada não são garantidas em nenhuma ordem específica.
- Um caminho bem-sucedido começará na página 1 e terminará na página 100.
- Você pode assumir que há pelo menos 1 caminho para a meta. Você não precisa encontrar todos os caminhos, nem o mais curto. Basta encontrar pelo menos um.
- O menor número de página será 1. Não há limite para o maior número de página. (Você pode supor que ele caiba no intervalo de um int.)
- Podem existir loops. Por exemplo, a lista pode ter saltos das páginas 5 a 10, 10 a 19 e 19 a 5.
- Pode haver becos sem saída. Ou seja, uma página de destino pode não ter para onde ir.
- Por outro lado, pode haver páginas inacessíveis. Ou seja, uma página de origem pode não ser o destino de quaisquer saltos.
- Nem todos os números de página entre 1 e 100 têm garantia de uso.
- Sua saída deve consistir em uma rota válida de números de página, começando com 1 e terminando em 100, separados por espaços.
Lembre-se, este é um código de golfe, então a solução mais curta vence!
EDIT: Adicionada outra amostra para teste.
fonte
Respostas:
Golfscript,
5857 caracteresAviso : isso é supereficiente. Ele funciona quadrando repetidamente a matriz de adjacência e procurando uma rota; se houver
E
arestas no gráfico, ele encontrará todos os caminhos de comprimento até 2 E (e os mais curtos encontrará muitas vezes). Ele deve fornecer um resultado para o primeiro caso de teste em um tempo razoável, mas se você quiser tentar o segundo, verifique se você tem alguns shows de memória livre e faça uma longa caminhada.Se você deseja uma solução razoavelmente eficiente, ofereço 67 caracteres:
fonte
cat input | ruby1.9 golfscript.rb peter.gs
e tudo o que aconteceu foi que meu MacBook ficou muito quente. Como devo executá-lo?Python,
232213157143135132 caracteres (caminho mais curto)Essa implementação pode lidar com todos os casos de borda descritos (loops, becos sem saída, páginas órfãs etc.) e garante que encontrará o caminho mais curto para o final. É baseado no algoritmo de caminho mais curto do Djikstra.
fonte
Javascript: 189 caracteres
Esta é uma solução recursiva que encontra o caminho mais curto da aventura.
Código-Golfed:
Para testar ( AVISO: loop infinito para entrada incorreta! ):
Copie uma das seguintes seqüências de entrada (ou use um formato semelhante para escolher sua própria escolha sua própria aventura):
1 10\n10 5\n10 13\n5 12\n5 19\n13 15\n12 20\n15 100
15 2\n1 4\n2 12\n1 9\n3 1\n1 15\n9 3\n12 64\n4 10\n2 6\n80 100\n5 10\n6 24\n12 80\n6 150\n120 9\n150 120
Cole isso no prompt do violino de teste .
Código formatado e comentado:
Para testar ( AVISO: loop infinito para entrada incorreta! ):
Copie uma das seguintes seqüências de entrada (ou use um formato semelhante para escolher sua própria escolha sua própria aventura):
1 10\n10 5\n10 13\n5 12\n5 19\n13 15\n12 20\n15 100
15 2\n1 4\n2 12\n1 9\n3 1\n1 15\n9 3\n12 64\n4 10\n2 6\n80 100\n5 10\n6 24\n12 80\n6 150\n120 9\n150 120
Cole isso no prompt do violino de teste .
fonte
var
palavra-chave tem escopo global :)Ruby 1.9, 98
Ungolfed:
fonte
Perl, 88 caracteres
basicamente uma versão perlizada da entrada de Clueless; pré-partidas e pós-partidas são divertidas :)
fonte
Pitão -
239237236infelizmente, esta solução recursiva da cauda é vulnerável a loops na "história" ...
Uso : cat ./test0 | ./sol.py Saída para o caso de teste 1:
Saída para o caso de teste 2:
fonte
Scala 2.9,
260256254252248247241239234227225212205 caracteresUngolfed:
Uso:
Compilar
scalac filename
e executar comscala C
. A entrada é obtida viaSTDIN
.Para executar no ideone.com, altere
object C extends App
paraobject Main extends Application
para executá-lo como Scala 2.8.fonte
PHP,
166146138 caracteresUngolfed:
Uso:
fonte
STDIN
de argumentos.Eu colocaria todos eles em uma matriz 2D e pesquisaria todos os itens com loop múltiplo; se eles atingirem o último item, eu coletaria itens relacionados em ordem em outra matriz de resultados e, a partir dos resultados, eu escolheria uma matriz menor. .
EDIT => JAVA: Eu também usei função recursiva, código completo abaixo;
fonte