Golfscript - 26 bytes
{:i.)+.,{;10*i%.}%i>|,}:f;
Editar: atualizado para a saída 1
se o decimal terminar, em vez do comprimento da representação decimal.
Uma versão bastante eficiente. O valor 67890 é executado em aproximadamente 10 segundos e 99991 em cerca de 20 segundos. É um pouco mais lento do que era antes (aproximadamente metade da velocidade), porque o intervalo iterado foi duplicado, a primeira metade do qual é ignorada.
Alternativa, também 26 bytes
{:i.)+.n*{*i%.}%i>)^^,}:f;
Este funciona iterando sobre a string "\n"*(2*i+1)
, onde i
é o valor passado para a função. O valor passado para o bloco de cada vez é o valor ordinal de "\n"
, que é 10 .
O )^^
é um pouco de uma solução alternativa. Quando você desmarca um caractere de uma sequência, o resultado é o valor ordinal do caractere removido, conforme mencionado acima. No entanto, anexar esse valor novamente anexará a representação de string desse número, em vez do caractere - comportamento bastante não simétrico e, na minha opinião, uma falha de design. Se você realmente quisesse fazer isso, a string primeiro custaria apenas um byte.
Uma cópia extra do valor final já está na pilha, portanto, removo o valor final novamente )
, xou-o com a string e, em seguida, xor novamente, para que todos os caracteres adicionados ou removidos pelo primeiro xor sejam restaurados. Se int op string
fosse tratado como um caractere, em vez de sua representação em cadeia, )^^
poderia ser substituído por|
.
Observe que, enquanto as strings (que no Golfscript são armazenadas como uma matriz de ints) exibem o valor de cada caractere mod 256 , os valores de cada caractere podem estar fora desse intervalo. Ao testar a exclusividade (via operações definidas) ou a contenção (via ?
), é o valor real que é comparado, em vez do valor de exibição.
Um arquivo de correção para o atual intérprete Golfscript :
61c61
< to_gs
---
> Gstring.new([self])
O exemplo acima afetará apenas o comportamento de string op int
(e vice-versa), onde op
é um dos
+-|&^
. Todo o resto permanece inalterado, incluindo o comportamento deGint`
.
A seguinte solução de 24 bytes se tornaria válida:
{:i.)+.n*{*i%.}%i>|,}:f;
E isso também corrige muitas outras soluções realmente feias .
Python - 48 bytes
f=lambda n:len(set(10**-~i%n for i in range(n)))
Não é a solução mais eficiente, mas é razoável para valores inferiores a 100000 .
FWIW, o elemento principal é idêntico à minha solução para Gerar números cíclicos em decimal .
Uma versão mais eficiente do mesmo código ( 70 bytes ):
def f(n):
a=[];i=10%n
while i not in a:a+=i,;i=i*10%n
return len(a)
O valor 99991 leva menos de um segundo.