I numeri del fucile sono una sequenza con una definizione piuttosto semplice ma con una struttura interessante. Inizia con i numeri naturali:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...
Ora prendi tutti i numeri in indici divisibili per 2 , raggruppali in coppie e scambia i numeri in ciascuna coppia:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, ...
^ ^ ^ ^ ^ ^ ^
<---> <---> <-----> <----
1, 4, 3, 2, 5, 8, 7, 6, 9, 12, 11, 10, 13, 16, ...
Ora fai lo stesso con gli indici divisibili per 3 :
1, 4, 3, 2, 5, 8, 7, 6, 9, 12, 11, 10, 13, 16, ...
^ ^ ^ ^
<------> <--------->
1, 4, 8, 2, 5, 3, 7, 6, 10, 12, 11, 9, 13, 16, ...
E poi per 4 , 5 , 6 e così via:
1, 4, 8, 2, 5, 3, 7, 6, 10, 12, 11, 9, 13, 16, ...
1, 4, 8, 6, 5, 3, 7, 2, 10, 12, 11, 14, 13, 16, ...
1, 4, 8, 6, 12, 3, 7, 2, 10, 5, 11, 14, 13, 16, ...
1, 4, 8, 6, 12, 14, 7, 2, 10, 5, 11, 3, 13, 16, ...
...
Dopo k tali passaggi, verranno fissati i primi k + 1 numeri. Quindi possiamo definire la sequenza infinita di numeri di Fucile a pompa come limite per lasciare k all'infinito. I primi 66 numeri sono:
1, 4, 8, 6, 12, 14, 16, 9, 18, 20, 24, 26, 28, 22, 39, 15, 36, 35, 40, 38, 57, 34, 48, 49, 51, 44,
46, 33, 60, 77, 64, 32, 75, 56, 81, 68, 76, 58, 100, 55, 84, 111, 88, 62, 125, 70, 96, 91, 98, 95,
134, 72, 108, 82, 141, 80, 140, 92, 120, 156, 124, 94, 121, 52, 152, 145, ...
Curiosità: nonostante sia ottenuto solo permutando i numeri naturali, questa sequenza non contiene numeri primi.
La sfida
Dato un numero intero n > 0
, trova il n
numero del fucile. È 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 restituendo l'output o stampandolo su STDOUT (o l'alternativa più vicina).
Questo è il golf del codice, quindi vince l'invio più breve (in byte).
Classifiche
Questo sta ottenendo più risposte di quanto pensassi, oltre a diverse persone che competono nella stessa lingua. Quindi ecco uno snippet di stack per generare sia una classifica regolare che una panoramica dei vincitori per lingua.
Per assicurarti che la tua risposta venga visualizzata, ti preghiamo di iniziare la risposta con un titolo, usando il seguente modello Markdown:
# Language Name, N bytes
dov'è N
la dimensione del tuo invio. Se si migliora il punteggio, è possibile mantenere i vecchi punteggi nel titolo, colpendoli. Per esempio:
# Ruby, <s>104</s> <s>101</s> 96 bytes
10
, 21
, 25
e 30
non compaiono né, per esempio.
k
iterazione, l' k
elemento th nell'array viene trasposto nella 2k
posizione th, e non viene toccato di nuovo fino alla 2k
iterazione, momento in cui viene trasposto nella 4k
posizione th, all'infinito. Un numero primo non viene trasposto fino a quando non arriva il suo turno, per così dire, quindi tutti i numeri primi vengono spostati in avanti. Ma possiamo facilmente fare un elenco delle vittime innocenti semplicemente stampando il primo elemento da trasporre all'iterazione 2 e ad ogni iterazione dispari. L'elenco è: 2, 3, 5, 7, 10, 11, 13, 21, 17, 19, 30, 23, 27, 25, 29, 31, 45, 42, 37, 54, 41, 43, 65, ...