Golfscript - 26 bytes
{:i.)+.,{;10*i%.}%i>|,}:f;
Editar: actualizado a la salida 1
si el decimal termina, en lugar de la longitud de la representación decimal.
Una versión bastante eficiente. El valor 67890 se ejecuta en aproximadamente 10 segundos y 99991 alrededor de 20 segundos. Es un poco más lento de lo que era antes (aproximadamente la mitad de rápido), porque el rango iterado se ha duplicado, la primera mitad del cual se ignora.
Alternativa, también 26 bytes
{:i.)+.n*{*i%.}%i>)^^,}:f;
Este funciona iterando sobre la cadena "\n"*(2*i+1)
, donde i
es el valor pasado a la función. El valor pasado al bloque cada vez es el valor ordinal de "\n"
, que es 10 .
El )^^
es un poco una solución alternativa. Cuando desconecta un carácter de una cadena, el resultado es el valor ordinal del carácter eliminado, como se mencionó anteriormente. Sin embargo, agregar ese valor nuevamente agregará la representación de cadena de ese número, en lugar del carácter, un comportamiento bastante no simétrico y, en mi opinión, un defecto de diseño. Si realmente quisieras hacer eso, encadenar primero solo costaría un byte.
Ya hay una copia adicional del valor final en la pila, por lo que elimino el valor final nuevamente )
, lo xo con la cadena y luego lo vuelvo a hacer, de modo que se restauran los caracteres que se agregaron o eliminaron. Si int op string
se tratara como un carácter, en lugar de su representación de cadena, )^^
podría reemplazarse por |
.
Tenga en cuenta que mientras las cadenas (que en Golfscript se almacenan como una matriz de entradas) mostrarán el valor de cada mod de carácter 256 , los valores de cada carácter pueden estar fuera de este rango. Cuando se prueba la unicidad (mediante operaciones de configuración) o la contención (mediante ?
), se compara el valor real, en lugar del valor de visualización.
Un archivo de parche para intérprete actual de Golfscript :
61c61
< to_gs
---
> Gstring.new([self])
Lo anterior solo afectará el comportamiento de string op int
(y viceversa), dondeop
es uno de
+-|&^
. Todo lo demás no se ve afectado, incluido el comportamiento de Gint`
.
Los siguientes 24 bytes solución de pasaría a ser válida:
{:i.)+.n*{*i%.}%i>|,}:f;
Y esto también soluciona muchos otros realmente feas .
Python - 48 bytes
f=lambda n:len(set(10**-~i%n for i in range(n)))
No es la solución más eficiente, pero razonable para valores inferiores a 100000 .
FWIW, el elemento central es idéntico a mi solución para Generar números cíclicos en decimal .
Una versión más eficiente del mismo 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)
El valor 99991 toma menos de un segundo.