A configuração
Suponha que você receba n fusíveis, com 1 ≤ n ≤ 5, cada um com um metro de comprimento e cada fusível com uma taxa de queima associada de N metros por D horas.
Um fusível pode ser aceso em uma ou em ambas as extremidades, subsequentemente extinto em uma ou em ambas as extremidades, religado, reintegrado etc., tantas vezes quantas forem necessárias até que o fusível seja totalmente consumido. Você é capaz de acender e apagar fusíveis instantaneamente e pode observar o instante exato em que um fusível é totalmente consumido (queimado).
Um fusível não pode ser cortado nem aceso em qualquer lugar, exceto nas extremidades.
Essa configuração permite um sistema de tempo infinitamente preciso, medindo o tempo entre dois eventos de iluminação / consumo de fusível. Por exemplo, considerando dois fusíveis com uma taxa de queima de 1 metro por hora, você pode medir exatamente 45 minutos (3/4 horas)
- simultaneamente: acendendo o primeiro fusível nas duas extremidades, acendendo o segundo fusível em uma extremidade e marcando o início do seu intervalo de tempo
- acendendo a segunda extremidade do segundo fusível no instante em que o primeiro fusível é consumido (30 minutos depois)
- marcando o final do seu intervalo de tempo no instante em que o segundo fusível é consumido (15 minutos depois)
O desafio
Dado um número fracionário de horas t , e um conjunto de n frações representando taxas exatas de queima de n fusíveis, escreva um programa ou função que produza / retorne um valor verdadeiro se t horas puder ser medido com precisão através da queima sistemática dos fusíveis, ou valor falso caso contrário.
A entrada para o programa pode ser uma das seguintes:
- argumentos de linha de comando do formulário
TN/TD N1/D1 N2/D2 N3/D3 ...
- uma cadeia de caracteres da forma
TN/TD N1/D1 N2/D2 N3/D3 ...
lidastdin
ou equivalente - uma cadeia de caracteres do formulário
TN/TD N1/D1 N2/D2 N3/D3 ...
passada como argumento de função - uma matriz de strings
["TN/TD", "N1/D1", "N2/D2", "N3/D3", ...]
passadas como argumento de função
Em todos os casos t = TN
/ TD
, onde TN
, TD
∈ [1,10000].
Da mesma forma, em todos os casos: taxa de queima do fusível i = N i / D i = N<i>
/ D<i>
, onde N<i>
, D<i>
∈ [1,10] ∀ i .
Você pode assumir que sempre haverá entre 1 e 5 fusíveis (inclusive) e que todas as entradas são válidas e estão dentro do alcance. Você também pode assumir que todas as frações de entrada são fornecidas nos termos mais baixos.
Você não pode usar números de ponto flutuante com componentes fracionários para este desafio. Ou seja, se você usar números de ponto flutuante em qualquer lugar do aplicativo, eles poderão assumir apenas valores integrais com zero componente fracionário.
Pontuação
Este é um desafio de código-golfe , portanto, o menor envio compatível em bytes será concedido.
Exemplo de entradas / saídas
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 fusão! :)