sfondo
Una sequenza frattale è una sequenza di numeri interi in cui è possibile rimuovere la prima occorrenza di ogni numero intero e finire con la stessa sequenza di prima.
Una sequenza molto semplice si chiama parafrasi di Kimberling . Inizi con i numeri naturali positivi:
1, 2, 3, 4, 5, 6, 7, 8, 9, ...
Quindi riffle in alcuni spazi vuoti:
1, _, 2, _, 3, _, 4, _, 5, _, 6, _, 7, _, 8, _, 9, ...
E quindi riempi ripetutamente gli spazi vuoti con la sequenza stessa (compresi gli spazi vuoti):
1, 1, 2, _, 3, 2, 4, _, 5, 3, 6, _, 7, 4, 8, _, 9, ...
1, 1, 2, 1, 3, 2, 4, _, 5, 3, 6, 2, 7, 4, 8, _, 9, ...
1, 1, 2, 1, 3, 2, 4, 1, 5, 3, 6, 2, 7, 4, 8, _, 9, ...
1, 1, 2, 1, 3, 2, 4, 1, 5, 3, 6, 2, 7, 4, 8, 1, 9, ...
Questa è la nostra sequenza frattale! Ora prendiamo le somme parziali:
1, 2, 4, 5, 8, 10, 14, 15, 20, 23, 29, 31, 38, 42, 50, 51, 60, ...
E se ripetessimo questo processo? "Frattalizza" la nuova sequenza (ovvero le somme parziali ottenute dai passaggi precedenti):
1, _, 2, _, 4, _, 5, _, 8, _, 10, _, 14, _, 15, _, 20, _, 23, ...
1, 1, 2, _, 4, 2, 5, _, 8, 4, 10, _, 14, 5, 15, _, 20, 8, 23, ...
1, 1, 2, 1, 4, 2, 5, _, 8, 4, 10, 2, 14, 5, 15, _, 20, 8, 23, ...
1, 1, 2, 1, 4, 2, 5, 1, 8, 4, 10, 2, 14, 5, 15, _, 20, 8, 23, ...
1, 1, 2, 1, 4, 2, 5, 1, 8, 4, 10, 2, 14, 5, 15, 1, 20, 8, 23, ...
E prendere di nuovo le somme parziali:
1, 2, 4, 5, 9, 11, 16, 17, 25, 29, 39, 41, 55, 60, 75, 76, 96, ...
Risciacqua, ripeti. Si scopre che questo processo converge. Ogni volta che ripeti questo processo, un prefisso più grande della sequenza rimarrà fisso. Dopo un numero infinito di iterazioni, si finirà con OEIS A085765 .
Curiosità: questo processo convergerebbe nella stessa sequenza anche se non iniziassimo dai numeri naturali fintanto che inizia la sequenza originale 1
. Se la sequenza originale inizia con un'altra x
, otterremmox*A085765
invece.
La sfida
Dato un numero intero positivo N
, emette ilN
elemento th della sequenza convergente.
È possibile scrivere un programma o una funzione, prendendo l'input tramite STDIN (o l'alternativa più vicina), l'argomento della riga di comando o l'argomento della funzione e producendo il risultato tramite STDOUT (o l'alternativa più vicina), il valore di ritorno della funzione o il parametro della funzione (out).
È possibile scegliere se l'indice N
è basato su 0 o 1.
Casi test
La sequenza inizia con:
1, 2, 4, 5, 9, 11, 16, 17, 26, 30, 41, 43, 59, 64, 81, 82, 108, 117, 147, 151, 192, 203, 246, 248, 307, 323, 387, 392, 473, 490, 572, 573, 681, 707, 824, 833, 980, 1010, 1161, 1165, 1357, 1398, 1601, 1612, 1858, 1901, 2149, 2151, 2458, 2517
Quindi l'input 5
dovrebbe produrre output 9
.
Ecco un'implementazione di riferimento ingenua di CJam che genera i primi N
numeri (dati N
su STDIN). Nota che il tuo codice dovrebbe restituire solo l' N
elemento th, non l'intero prefisso.
N
il termine A085765 , giusto?