La puesta en marcha
Suponga que tiene n fusibles, con 1 ≤ n ≤ 5, cada uno de los cuales tiene un metro de largo, y donde cada fusible tiene una velocidad de combustión asociada de N metros por D horas.
Se puede encender un fusible en uno o ambos extremos, luego apagarlo en uno o ambos extremos, volver a encenderlo, volver a apagarlo, etc., tantas veces como sea necesario hasta que el fusible se haya consumido por completo. Puede encender y apagar los fusibles instantáneamente, y puede observar el instante exacto en que un fusible se consume por completo (se quema).
Un fusible no se puede cortar ni se puede encender en ninguna parte, excepto en sus extremos.
Tal configuración permite un sistema de sincronización infinitamente preciso, midiendo el tiempo entre dos eventos de iluminación / consumo de fusibles. Por ejemplo, con dos fusibles con una velocidad de combustión de 1 metro por hora, puede medir exactamente 45 minutos (3/4 horas) por
- simultáneamente: encender el primer fusible en ambos extremos, encender el segundo fusible en un extremo y marcar el inicio de su intervalo de tiempo
- encender el segundo extremo del segundo fusible en el instante en que se consume el primer fusible (30 minutos después)
- marcando el final de su intervalo de tiempo en el instante en que se consume el segundo fusible (15 minutos después)
El reto
Dado un número fraccionario de horas t , y un conjunto de n fracciones que representan velocidades de combustión exactas de n fusibles, escriba un programa o función que genere / devuelva un valor verdadero si t horas se pueden medir con precisión mediante la quema sistemática de los fusibles, o un valor falso de lo contrario.
La entrada al programa puede ser cualquiera de los siguientes:
- argumentos de la línea de comandos del formulario
TN/TD N1/D1 N2/D2 N3/D3 ...
- una cadena de la forma
TN/TD N1/D1 N2/D2 N3/D3 ...
leídastdin
o equivalente - una cadena del formulario
TN/TD N1/D1 N2/D2 N3/D3 ...
pasado como argumento de función - una serie de cadenas
["TN/TD", "N1/D1", "N2/D2", "N3/D3", ...]
pasadas como argumento de función
En todos los casos t = TN
/ TD
, donde TN
, TD
∈ [1,10000].
Asimismo, en todos los casos: velocidad de combustión del fusible i = N i / D i = N<i>
/ D<i>
, donde N<i>
, D<i>
∈ [1,10] ∀ i .
Puede suponer que siempre habrá entre 1 y 5 fusibles (inclusive), y que todas las entradas son válidas y están dentro del rango. También puede suponer que todas las fracciones de entrada se dan en los términos más bajos.
No puede usar números de coma flotante con componentes fraccionales para este desafío. Es decir, si usa números de coma flotante en cualquier lugar de su aplicación, solo pueden tomar valores integrales con componente fraccional cero.
Puntuación
Este es un desafío de código de golf , por lo tanto, se otorgará la victoria al envío más breve en bytes.
Ejemplo de entradas / salidas
input: 29/6 3/2 2/3 3/5 3/7 7/5
output: true
One solution:
- light both ends of fuse 1, mark start of interval
- on fuse 1 consumption: light both ends of fuse 2, light one end of fuse 5
- on fuse 5 consumption: extinguish one end of fuse 2, light both ends of fuse 3,
light both ends of fuse 4
- on fuse 2 consumption: extinguish one end of fuse 3, extinguish both ends of
fuse 4
- on fuse 3 consumption: relight one end of fuse 4
- on consumption of fuse 4: mark end of interval (29/6 hours)
input: 2/1 3/1 5/1 7/1
output: false
input: 5/1 6/1 1/6 9/1 1/9
output: true
One solution:
- light fuse 1 at one end, light fuse 2 at both ends, light fuse 4 at both ends
- on fuse 1 consumption: extinguish one end of fuse 2, mark start of interval
- on fuse 4 consumption: relight one end of fuse 2
- on fuse 2 consumption: mark end of interval (5 hours)
¡Feliz fusión! :)