Golfscript - 26 byte
{:i.)+.,{;10*i%.}%i>|,}:f;
Modifica: aggiornato all'output 1
se termina il decimale, anziché la lunghezza della rappresentazione decimale.
Una versione abbastanza efficiente. Il valore 67890 viene eseguito in circa 10 secondi e 99991 circa 20 secondi. È un po 'più lento di prima (circa la metà della velocità), perché l'intervallo iterato è stato raddoppiato, la prima metà è stata ignorata.
Alternativa, anche 26 byte
{:i.)+.n*{*i%.}%i>)^^,}:f;
Questo funziona ripetendo la stringa "\n"*(2*i+1)
, dove i
è il valore passato alla funzione. Il valore passato al blocco ogni volta è il valore ordinale di "\n"
, che è 10 .
Il )^^
è un po 'un work-around. Quando si annulla la rimozione di un carattere da una stringa, il risultato è il valore ordinale del carattere rimosso, come menzionato sopra. Tuttavia, aggiungendo nuovamente quel valore si aggiungerà la rappresentazione in forma di stringa di quel numero, piuttosto che il carattere - un comportamento abbastanza non simmetrico e, a mio avviso, un difetto di progettazione. Se davvero volessi farlo, stringere prima costerebbe solo un byte.
Una copia aggiuntiva del valore finale è già nello stack, quindi rimuovo di nuovo il valore finale )
, lo xo con la stringa e quindi lo xo di nuovo, in modo che tutti i caratteri aggiunti o rimossi dal primo xor vengano ripristinati. Se int op string
fossero trattati come un personaggio, piuttosto che la sua rappresentazione di stringa, )^^
potrebbero essere sostituiti da|
.
Si noti che mentre le stringhe (che in Golfscript sono memorizzate come una matrice di ints) visualizzeranno il valore di ciascun carattere mod 256 , i valori di ciascun carattere potrebbero essere al di fuori di questo intervallo. Quando si esegue il test di unicità (tramite operazioni impostate) o contenimento (tramite ?
), viene confrontato il valore effettivo, anziché il valore visualizzato.
Un file patch per l' attuale interprete Golfscript :
61c61
< to_gs
---
> Gstring.new([self])
Quanto sopra influenzerà solo il comportamento di string op int
(e viceversa), dove op
è uno dei
+-|&^
. Tutto il resto rimane inalterato, incluso il comportamento diGint`
.
La seguente soluzione a 24 byte diventerebbe quindi valida:
{:i.)+.n*{*i%.}%i>|,}:f;
E questo risolve anche molti altri aggettivi davvero brutti .
Python - 48 byte
f=lambda n:len(set(10**-~i%n for i in range(n)))
Non è la soluzione più efficiente, ma ragionevole per valori inferiori a 100000 .
FWIW, l'elemento principale è identico alla mia soluzione per generare numeri ciclici in decimale .
Una versione più efficiente dello stesso codice ( 70 byte ):
def f(n):
a=[];i=10%n
while i not in a:a+=i,;i=i*10%n
return len(a)
Il valore 99991 richiede meno di un secondo.