Golfscript - 26 octets
{:i.)+.,{;10*i%.}%i>|,}:f;
Edit: mis à jour pour sortir 1
si la décimale se termine, plutôt que la longueur de la représentation décimale.
Une version assez efficace. La valeur 67890 s'exécute en environ 10 secondes et 99991 environ 20 secondes. C'est un peu plus lent qu'auparavant (environ la moitié de la vitesse), car la plage itérée a été doublée, la première moitié étant ignorée.
Alternative, également 26 octets
{:i.)+.n*{*i%.}%i>)^^,}:f;
Celui-ci fonctionne en itérant sur la chaîne "\n"*(2*i+1)
, où i
est la valeur transmise à la fonction. La valeur transmise au bloc à chaque fois est la valeur ordinale de "\n"
, qui est 10 .
C'est )^^
un peu une solution de contournement. Lorsque vous annulez un caractère d'une chaîne, le résultat est la valeur ordinale du caractère supprimé, comme mentionné ci-dessus. Cependant, l'ajout de cette valeur ajoutera la représentation sous forme de chaîne de ce nombre, plutôt que le caractère - un comportement assez asymétrique, et à mon avis, un défaut de conception. Si vous vouliez vraiment le faire, la première chaîne ne coûterait qu'un octet.
Une copie supplémentaire de la valeur finale est déjà sur la pile, donc je supprime à nouveau la valeur finale )
, la xor avec la chaîne, puis la xor à nouveau, afin que tous les caractères ajoutés ou supprimés par le premier xor soient restaurés. Si int op string
étaient traités comme un caractère, plutôt que sa représentation sous forme de chaîne, )^^
pourraient être remplacés par |
.
Notez que tandis que les chaînes (qui dans Golfscript sont stockées sous forme de tableau d'ints) afficheront la valeur de chaque caractère mod 256 , les valeurs de chaque caractère peuvent elles-mêmes être en dehors de cette plage. Lors du test d'unicité (via des opérations définies) ou de confinement (via ?
), c'est la valeur réelle qui est comparée, plutôt que la valeur d'affichage.
Un fichier patch pour l' interpréteur Golfscript actuel :
61c61
< to_gs
---
> Gstring.new([self])
Ce qui précède n'affectera que le comportement de string op int
(et vice versa), où op
est l'un des
+-|&^
. Tout le reste n'est pas affecté, y compris le comportement de Gint`
.
La solution suivante de 24 octets deviendrait alors valide:
{:i.)+.n*{*i%.}%i>|,}:f;
Et cela corrige également beaucoup d'autres solutions de contournement vraiment laides .
Python - 48 octets
f=lambda n:len(set(10**-~i%n for i in range(n)))
Pas la solution la plus efficace, mais raisonnable pour des valeurs inférieures à 100 000 .
FWIW, l'élément central est identique à ma solution pour Générer des nombres cycliques en décimal .
Une version plus efficace du même code ( 70 octets ):
def f(n):
a=[];i=10%n
while i not in a:a+=i,;i=i*10%n
return len(a)
La valeur 99991 prend moins d'une seconde.