Ha pasado un tiempo desde que mataste esa hidra , disfrutaste de la gloria durante años, pero ahora la gente te llama lavado, ha sido. Bueno, es hora de que demuestres que están equivocados, has escuchado el paradero de otra hidra. Simplemente mátalo y se te otorgará toda la gloria que mereces.
Llegas a la armería para recibir tus espadas, pero todas están fuera de las espadas normales, todo lo que les queda son Sectores. Un sector n dividirá el número de cabezas en una Hidra por n, pero solo se puede usar si el número de cabezas es divisible por n.
Una vez más, vas a escribir un código para ayudarte a matar la hidra. Su código tomará como entrada el número de cabezas de la hidra, comienza la pelea, el número de cabezas que la hidra crece en cada turno y una lista de n-sectores que puede usar. Su código generará un patrón óptimo de movimientos para matar la hidra lo más rápido posible
En cada turno de la pelea, puede seleccionar una sola espada para usar, si después de un corte la hidra tiene solo una cabeza que gana, si no crece las cabezas. Nunca puedes hacer ningún movimiento, y si no hay movimientos posibles disponibles, pierdes.
Si no es posible una solución, puede generar otra cosa que no sea una solución, por ejemplo, una lista vacía, nada, el número cero, etc.
Este es el código de golf, por lo que las respuestas se puntuarán como recuento de bytes, y menos será mejor.
Casos de prueba
Aquí hay algunos casos de prueba súper básicos, se agregarán más casos de prueba a pedido.
24 heads, 1 heads per turn, [2,3] -> [3,3,2,3]
25 heads, 2 heads per turn, [2,3] -> No solutions
4 heads, 2 heads per turn, [2] -> No solutions
4 heads, 3 heads per turn, [2,5] -> [2,5]
10 heads, 17 heads per turn, [2, 3, 7, 19] -> No solutions
10 heads, 6 heads per turn, [1,16] -> [1,16]
6 heads, 2 heads per turn, [2, 3, 5] -> [2, 5]
125 heads, 1 head per turn, [1, 2, 3, 127] -> [1, 1, 127]
Respuestas:
JavaScript (ES6),
111bytesGuardado 4 bytes gracias a @ThePirateBay
Eliminé la recursión de profundidad primero que intentaba usar para los bucles de amplitud mucho más seguros. Muestra la solución como una matriz si existe, se ejecuta para siempre si no existe Si esto no está permitido, aquí hay uno que finalmente se detiene (en la mayoría de los casos, de todos modos):
fuente
JavaScript,
191190 bytesSalvó un byte gracias a Step Hen
fuente
Python 2 ,
169195222 bytes+26 bytes para manejar adecuadamente la regeneración cíclica de la cabeza en púas de armas malas. (Gracias a @ThePirateBay por señalarlo)
+27 bytes para arreglar ciertos casos extremos que causan errores.
Pruébalo en línea!
fuente
VB.NET (.NET 4.5), 439 + 35 (importaciones) = 474 bytes
Requiere
Imports System.Collections.Generic
La función
Z
toma dosInt64
(número de cabezas y tasa de regeneración de cabezales) y aList(Of Int64)
(Sectores), y devuelve unList(Of Int64) (the ordered choice of Sectors). Returns
Nothing` si no hay solución.Asume que los sectores se presentan en orden de mayor a menor.
Los
Optional
parámetros son para las llamadas recursivas para guardar el estado. Rastrean el orden actual de los Sectores en uso, el orden más corto de Sectores de la historia y la cantidad de cabezas encontradas. Si volvemos a encontrar el mismo número de cabezas, debe haber una forma más corta de alcanzarlo.El único ordenamiento de Sectores que importa es que debo
1
ser el último si existe. De lo contrario, la hidra podría crecer sin límites porque en cada momento podría usar el1
Sector y nunca probar otro.Declaré una constante
N
para representarNothing
, reduciendo 6 bytes cada vez que quería usarNothing
.And
/Or
no están en cortocircuito, por lo que utilizo el operador condicional nulo (?.
) para evitar errores de objeto nulo. En código real, usaríaAndAlso
/OrElse
que hace cortocircuito.Pruébalo en línea!
Z
sin golf para facilitar la lecturafuente