Los libros Choose Your Own Adventure son una forma de literatura interactiva donde el lector debe tomar decisiones que afectan el resultado de la historia. En ciertos puntos de la historia, el lector tiene múltiples opciones que se pueden elegir, cada una de las cuales envía al lector a una página diferente del libro.
Por ejemplo, en un entorno de fantasía, uno debería decidir en la página 14 si aventurarse en una cueva misteriosa "saltando" a la página 22, o explorar el bosque cercano saltando a la página 8. Estos "saltos" se pueden expresar como pares de números de página, así:
14 22
14 8
En la mayoría de los casos, la historia tiene muchos finales pero solo unos pocos buenos. El objetivo es navegar por la historia para llegar a un buen final.
Tarea:
Dada una lista de "saltos" para un libro dado, su tarea es determinar una ruta que conduzca a un final específico. Como esto es bastante fácil, el verdadero desafío es hacerlo en la menor cantidad de caracteres posible.
Este es el código de golf .
Entrada de muestra (donde 1 es el comienzo y 100 es el objetivo):
1 10
10 5
10 13
5 12
5 19
13 15
12 20
15 100
Salida de muestra:
1 10 13 15 100
Entrada de muestra:
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
Salida de muestra:
1 15 2 12 80 100
Notas:
- La lista de saltos será ingresada por el usuario, ya sea desde un archivo o stdin. Puede elegir el que sea más conveniente.
- La entrada contendrá 1 salto por línea, con el origen y el destino separados por un solo espacio.
- No se garantiza que las líneas en la entrada estén en ningún orden específico.
- Una ruta exitosa comenzará en la página 1 y finalizará en la página 100.
- Puede suponer que hay al menos 1 camino hacia la meta. No necesita encontrar todos los caminos, ni tampoco encontrar el más corto. Solo encuentra al menos uno.
- El número de página más pequeño será 1. No hay límite para el número de página más grande. (Puede suponer que encajará en el rango de un int.)
- Los lazos pueden existir. Por ejemplo, la lista puede tener saltos de la página 5 a la 10, de la 10 a la 19 y de la 19 a la 5.
- Puede haber callejones sin salida. Es decir, una página de destino podría no tener un lugar al que saltar.
- Por el contrario, puede haber páginas inalcanzables. Es decir, una página de origen podría no ser el destino de ningún salto.
- No se garantiza el uso de todos los números de página entre 1 y 100.
- Su salida debe consistir en una ruta válida de números de página, comenzando con 1 y terminando en 100, separados por espacios.
Recuerde, este es el código de golf, por lo que gana la solución más corta.
EDITAR: se agregó otra muestra para probar.
fuente
Respuestas:
Golfscript,
5857 caracteresAdvertencia : esto es super ineficiente. Funciona cuadrando repetidamente la matriz de adyacencia y luego buscando una ruta; Si hay
E
bordes en el gráfico, encontrará cada ruta de longitud hasta 2 E (y las más cortas encontrará muchas veces). Debería darte un resultado para el primer caso de prueba en un tiempo razonable, pero si quieres probar el segundo, asegúrate de tener algunos conciertos libres de memoria y dar un largo paseo.Si desea una solución razonablemente eficiente, entonces ofrezco en 67 caracteres:
fuente
cat input | ruby1.9 golfscript.rb peter.gs
y todo lo que sucedió fue que mi MacBook se calentó mucho. ¿Cómo debo ejecutarlo?Python,
232213157143135132 caracteres (ruta más corta)Esta implementación puede manejar todos los casos límite descritos (bucles, callejones sin salida, páginas huérfanas, etc.) y garantiza que encontrará la ruta más corta hasta el final. Se basa en el algoritmo de ruta más corta de Djikstra.
fuente
Javascript: 189 caracteres
Esta es una solución recursiva que encuentra el camino más corto a través de la aventura.
Código de golf:
Para probar ( ADVERTENCIA: bucle infinito para entradas incorrectas ):
Copie una de las siguientes cadenas de entrada (o use un formato similar para elegir el suyo, elija su propia 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
Pegue eso en el indicador del violín de prueba .
Código formateado y comentado:
Para probar ( ADVERTENCIA: bucle infinito para entradas incorrectas ):
Copie una de las siguientes cadenas de entrada (o use un formato similar para elegir el suyo, elija su propia 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
Pegue eso en el indicador del violín de prueba .
fuente
var
palabra clave tienen alcance mundial :)Ruby 1.9, 98
Sin golf:
fuente
Perl, 88 caracteres
básicamente una versión perlizada de la entrada de Clueless; los partidos previos y posteriores son divertidos :)
fuente
Python -
239237236desafortunadamente, esta solución recursiva de cola es vulnerable a los bucles en la "historia" ...
Uso : cat ./test0 | ./sol.py Salida para el caso de prueba 1:
Salida para el caso de prueba 2:
fuente
Scala 2.9,
260256254252248247241239234227225212205 caracteresSin golf:
Uso:
Compilar
scalac filename
y ejecutar conscala C
. La entrada se toma víaSTDIN
.Para ejecutar en ideone.com, cambie
object C extends App
aobject Main extends Application
para ejecutarlo como Scala 2.8.fuente
PHP,
166146138 caracteresSin golf:
Uso:
fuente
STDIN
lugar de como argumentos.Los pondría a todos en una matriz 2d y buscaría todos los elementos con múltiples ciclos, si pueden alcanzar el último elemento, reuniría los elementos relacionados en orden en otra matriz de resultados, y de los resultados elegiría una matriz que sea más pequeña .
EDITAR => JAVA: También he usado la función recursiva, el código completo a continuación;
fuente