Il set up
Supponiamo che ti vengano dati n fusibili, con 1 ≤ n ≤ 5, ognuno dei quali è lungo un metro e dove ciascun fusibile ha una velocità di combustione associata di N metri per D ore.
Un fusibile può essere acceso a una o entrambe le estremità, successivamente spento a una o entrambe le estremità, riacceso, estinto, ecc., Tutte le volte che è necessario fino a quando il fusibile è completamente consumato. Sei in grado di accendere e spegnere istantaneamente le micce e puoi osservare esattamente l'istante in cui una miccia è completamente consumata (bruciata).
Non è possibile tagliare un fusibile né accenderlo da nessuna parte tranne che alle estremità.
Tale impostazione consente un sistema di temporizzazione estremamente preciso, misurando il tempo tra due eventi di illuminazione / consumo dei fusibili. Ad esempio, dati due fusibili con una velocità di combustione di 1 metro all'ora, è possibile misurare esattamente 45 minuti (3/4 ore) di
- contemporaneamente: accendere il primo fusibile ad entrambe le estremità, accendere il secondo fusibile ad un'estremità e segnare l'inizio dell'intervallo di tempo
- accendere la seconda estremità del secondo fusibile nel momento in cui il primo fusibile viene consumato (30 minuti dopo)
- segnando la fine dell'intervallo di tempo nel momento in cui viene consumato il secondo fusibile (15 minuti dopo)
La sfida
Dato un numero frazionario di ore t e un insieme di n frazioni che rappresentano le esatte velocità di combustione di n fusibili, scrivere un programma o una funzione che emetta / restituisca un valore di verità se t ore possono essere misurate con precisione attraverso la combustione sistematica dei fusibili o un falsa valore altrimenti.
L'input per il programma può essere uno dei seguenti:
- argomenti della riga di comando del modulo
TN/TD N1/D1 N2/D2 N3/D3 ...
- una stringa del modulo
TN/TD N1/D1 N2/D2 N3/D3 ...
lettastdin
o equivalente - una stringa del modulo
TN/TD N1/D1 N2/D2 N3/D3 ...
passata come argomento di funzione - una matrice di stringhe
["TN/TD", "N1/D1", "N2/D2", "N3/D3", ...]
passata come argomento di funzione
In tutti i casi t = TN
/ TD
, dove TN
, TD
∈ [1.10000].
Allo stesso modo, in tutti i casi: velocità di combustione per il fusibile i = N i / D i = N<i>
/ D<i>
, dove N<i>
, D<i>
∈ [1,10] ∀ i .
Si può presumere che ci saranno sempre tra 1 e 5 fusibili (inclusi) e che tutti gli ingressi siano validi e compresi nell'intervallo. Si può anche presumere che tutte le frazioni di input siano fornite in termini più bassi.
Per questa sfida non puoi usare numeri in virgola mobile con componenti frazionari. Cioè, se si utilizzano numeri in virgola mobile in qualsiasi punto dell'applicazione, questi possono assumere solo valori integrali con zero componente frazionario.
punteggio
Si tratta di una sfida di code-golf , quindi verrà premiata la sottomissione conforme più breve in byte.
Ingressi / uscite di esempio
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)
Felice fusione! :)