_Ḟ1+¡
Questa è una soluzione iterativa senza built-in. Utilizza la stessa indicizzazione delle specifiche della sfida.
Provalo online!
sfondo
Sia f la funzione definita nelle specifiche della sfida e F la funzione di Fibonacci definita come al solito (cioè, con F (0) = 0 ). Per un numero intero non negativo n , abbiamo f (n) = F (n + 1) . Quando 0 ≤ x <1 , la specifica della sfida definisce f (n + x) come f (n) + (f (n + 1) - f (n)) x .
Chiaramente, questo influenza solo i casi di base, ma non la formula ricorsiva, cioè, f (n) = f (n - 1) + f (n - 2) detiene, come avverrebbe in F . Ciò significa che possiamo semplificare la definizione di argomenti non interi al più semplice f (n) = f (n) + f (n - 1) x .
Come altri hanno notato nelle loro risposte, la relazione ricorsiva vale anche per argomenti non interi. Questo è facilmente verificabile, come
Poiché f (0) = f (1) = 1 , f in costante nell'intervallo [0, 1] e F (0 + x) = 1 per tutte le x . Inoltre, f (-1) = F (0) = 0 , quindi f (-1 + x) = f (-1) + (f (0) - f (-1)) x = 0 + 1x = x . Questi casi di base trattano in [-1, 1) , quindi insieme alla formula ricorsiva, completano la definizione di f .
Come funziona
Come prima, n + x sia l'unico argomento del nostro programma monadico.
¡
è un rapido , nel senso che consuma alcuni collegamenti alla sua sinistra e li trasforma in un collegamento rapido . ¡
in particolare consuma uno o due collegamenti.
<F:monad|dyad><N:any>
chiama il collegamento N , restituendo r , ed esegue F per un totale di r volte.
<nilad|missing><F:monad|dyad>
imposta r sull'ultimo argomento della riga di comando (o un input da STDIN in loro assenza) ed esegue F per un totale di r volte.
Poiché 1
è un nilad (un collegamento senza argomenti), si applica il secondo caso e +¡
verrà eseguito +
n volte (un argomento non intero viene arrotondato per difetto). Dopo ogni chiamata a +
, l'argomento sinistro del collegamento rapido viene sostituito con il valore restituito e l'argomento destro con il valore precedente dell'argomento sinistro.
Per quanto riguarda l'intero programma, Ḟ
pavimenta l'input, producendo n ; quindi _
sottrarre il risultato dall'input, producendo ** x, che diventa il valore restituito.
1+¡
quindi chiama +¡
- come descritto prima - con l'argomento sinistro 1 = f (0 + x) e l'argomento destro x = f (-1 + x) , che calcola l'output desiderato.