Cluck cluck. Nadie sabe por qué el pollo cruzó la calle, tal vez había un gallo atractivo al otro lado. Pero podemos averiguar cómo. Escriba un programa que, de izquierda a derecha, cruce este (o cualquier) "camino".
1356 | 1738
3822 | 1424
3527 3718
9809 | 5926
0261 | 1947
7188 4717
6624 | 9836
4055 | 9164
2636 4927
5926 | 1964
3144 | 8254
Su programa lo "cruza", moviéndose de izquierda a derecha. Empiezas en cualquier número en la columna de la izquierda que quieras. Desde allí, puedes moverte a cualquier personaje adyacente a la derecha. Si comenzó en la esquina superior izquierda, 1, puede ir a 3 u 8. Cada número al que va, incluido el número inicial, se agrega a una suma. Los espacios no se suman a su suma. "|" te obliga a moverte hacia arriba o hacia abajo, en lugar de hacia la derecha. (NO PUEDES avanzar en este personaje) Tu objetivo es llegar al otro lado con la suma más pequeña posible. Su programa debe imprimir la suma al final y debe poder resolver cualquier camino. Preferiblemente, también podría tener entrada para un camino, pero no es obligatorio. Su programa debe imprimir tanto la ruta como la suma. Pocos bytes de código gana.
Para aclarar, puede moverse con diagnóstico a menos que esté en una barra vertical. Solo puedes moverte hacia arriba y hacia abajo cuando estás en una barra vertical.
Para una especificación más clara de las carreteras, es básicamente una cadena de texto (o una matriz de columnas o filas, si prefiere pensar de esa manera) que sigue las reglas de los caracteres, y no puede haber nada PERO esos caracteres en El camino. Puede haber cualquier número, un espacio, una barra ("|") o una nueva línea. Si un borracho pavimentó un camino, como en la respuesta de ProgrammerDan, sigue siendo un camino válido y su programa debe ser capaz de resolverlo. No se considera un camino si es imposible llegar al otro lado (por ejemplo, no hay salida de una línea recta de barras).
Su programa no está obligado a determinar si una carretera no es válida.
Clave:
Cualquier número: agrega el número a su suma, avance.
Espacio: avance, no se agrega nada a su suma.
"|" - Mover hacia arriba o hacia abajo, no se agrega nada a su suma.
EDITAR: una solución de ejemplo, como se sugiere. No puedo hacer uno terriblemente grande, no puedo obtener un IDE para resolverlo en mi cajero automático.
Toma este pequeño camino:
9191 | 8282
1919 | 2727
5555 5555
La solución sería una ruta de 1, 1, 1, 1, espacio, divisor, divisor, espacio, espacio, 2, 2, 2, 2 para un total de 12.
EDITAR # 2: La solución al primer camino en esta pregunta, según lo determinado por Geobits y los programas de la gente, es 0,2,0,1,,,, 1,4,1,4 por un total de 13.
fuente
|
seguidos?0,2,0,1, , , ,1,4,1,4 -> 13
Respuestas:
Pyth,
168143141 bytes [ahora borracho camino compatibles]Mi caso de prueba funciona, pero debido a un malentendido de mi parte, no funcionará correctamente con el ejemplo inicial. Estoy trabajando en arreglarlo.Ahora trabajando para ejemplo original y caminos borrachos
Algún código
REALMENTE unpoco menos feo:Pruébalo aquí
Lo probé en una carretera de 10 + 9 x 40.
fuente
Java, 955 bytes
Obviamente no voy a ganar ningún premio, siendo Java y todo, pero me encanta este problema y quería incluir mi propia entrada.
Características y límites:
Ok, suficiente jibba jabba. Versión de golf:
Según mi costumbre, github con el código no golfista .
Solución para el "primer" camino:
Segundo ejemplo
Muestra de Brian Tuck:
El ejemplo de Brian "borracho":
Solución visualizada:
¡Disfrutar!
Editar: Ahora solo estoy presumiendo (¡dos caminos se fusionan! ¿Puede hacerlo?)
Solución:
(bonificación: camino desde ungolfed):
Detalles sobre el algoritmo
Se solicitó una explicación más completa de la técnica de programación dinámica que empleé, así que aquí va:
Estoy usando un método de solución de marcar y precomputar. Tiene un nombre propio, pero hace tiempo que lo he olvidado; quizás alguien más pueda ofrecerlo?
Algoritmo:
Notas:
Eso es. Escaneamos de arriba a abajo, de derecha a izquierda, una vez; las únicas celdas tocadas (potencialmente) más de una vez son tuberías, sin embargo, cada tubería solo se "resuelve" una vez, manteniéndonos dentro de nuestra ventana O (m * n).
Para manejar tamaños de mapa "extraños", elegí simplemente preescanear y normalizar longitudes de filas rellenando con caracteres nulos. Los caracteres nulos cuentan como movimientos de "costo cero" igual que las tuberías y los espacios. Luego, al imprimir la solución, detengo los costos de impresión o los movimientos cuando se alcanza el borde de la carretera normalizada o se alcanza un carácter nulo.
La belleza de este algoritmo es que es muy simple, aplica las mismas reglas a cada celda, produce una solución completa al resolver subproblemas O (m * n), y en términos de velocidad es bastante rápido. Cambia la memoria, creando efectivamente dos copias en la memoria del mapa de carreteras, la primera para almacenar datos de "mejor costo" y la segunda para almacenar datos de "mejor movimiento" por celda; Esto es típico de la programación dinámica.
fuente
c
como-1>>>1
.