Golfscript - 26 bajtów
{:i.)+.,{;10*i%.}%i>|,}:f;
Edycja: zaktualizowane, aby wyświetlało dane wyjściowe, 1
jeśli liczba dziesiętna zakończy się, a nie długość reprezentacji dziesiętnej.
Dość wydajna wersja. Wartość 67890 działa w około 10 sekund, a 99991 około 20 sekund. Jest nieco wolniejszy niż wcześniej (mniej więcej o połowę szybciej), ponieważ iterowany zasięg został podwojony, z czego pierwsza połowa jest ignorowana.
Alternatywnie, również 26 bajtów
{:i.)+.n*{*i%.}%i>)^^,}:f;
Ten działa poprzez iterowanie ciągu "\n"*(2*i+1)
, gdzie i
jest wartość przekazywana do funkcji. Wartość przekazana w każdym bloku jest numerem porządkowym wartość "\n"
, która jest 10 .
To )^^
jest trochę obejścia. Kiedy odczytujesz znak z ciągu, wynikiem jest wartość porządkowa usuniętego znaku, jak wspomniano powyżej. Jednak ponowne dołączenie tej wartości spowoduje dodanie reprezentacji ciągu tej liczby zamiast znaku - dość niesymetryczne zachowanie, a moim zdaniem wada projektowa. Jeśli tak naprawdę chciałbyś to zrobić, najpierw strajkowanie kosztowałoby tylko jeden bajt.
Dodatkowa kopia wartości końcowej znajduje się już na stosie, więc ponownie )
usuwam wartość końcową , xor ją za pomocą łańcucha, a następnie xor ponownie, aby przywrócić wszystkie znaki, które zostały dodane lub usunięte przez pierwszy xor. Gdyby int op string
był traktowany jako znak, a nie jego ciąg znaków, )^^
mógłby zostać zastąpiony przez |
.
Zauważ, że chociaż ciągi znaków (które w Golfscript są przechowywane jako tablica liczb całkowitych) będą wyświetlać wartość każdego znaku mod 256 , wartości każdego znaku mogą być poza tym zakresem. Podczas testowania niepowtarzalności (za pomocą operacji ustawiania) lub ograniczania (za pośrednictwem ?
) porównywana jest rzeczywista wartość, a nie wartość wyświetlana.
Plik łatki dla bieżącego interpretera Golfscript :
61c61
< to_gs
---
> Gstring.new([self])
Powyższe wpłynie tylko na zachowanie string op int
(i odwrotnie), gdzie op
jest jedno z
+-|&^
. Wszystko inne pozostaje nienaruszone, w tym zachowanie Gint`
.
Następujące 24-bajtowe rozwiązanie stałoby się wtedy prawidłowe:
{:i.)+.n*{*i%.}%i>|,}:f;
To naprawia również wiele innych naprawdę brzydkich obejść .
Python - 48 bajtów
f=lambda n:len(set(10**-~i%n for i in range(n)))
Nie jest to najbardziej wydajne rozwiązanie, ale rozsądne w przypadku wartości mniejszych niż 100000 .
FWIW, rdzeń jest identyczny z moim rozwiązaniem generowania liczb cyklicznych w systemie dziesiętnym .
Bardziej wydajna wersja tego samego kodu ( 70 bajtów ):
def f(n):
a=[];i=10%n
while i not in a:a+=i,;i=i*10%n
return len(a)
Wartość 99991 zajmuje mniej niż sekundę.