Гольфскрипт - 26 байт
{:i.)+.,{;10*i%.}%i>|,}:f;
Редагувати: оновлено для виведення, 1
якщо десятковий термін закінчується, а не довжина десяткового подання.
Досить ефективна версія. Значення 67890 працює приблизно за 10 секунд, а 99991 - близько 20 секунд. Це трохи повільніше, ніж було раніше (приблизно вдвічі швидше), тому що діапазон, який повторюється, був подвоєний, перша половина якого ігнорується.
Альтернативно, також 26 байт
{:i.)+.n*{*i%.}%i>)^^,}:f;
Цей працює за допомогою ітерації над рядком "\n"*(2*i+1)
, де i
є значення, передане функції. Значення, що передається блоку кожного разу, є порядковим значенням "\n"
, яке дорівнює 10 .
Це )^^
трохи обробка. Коли ви від'єднуєте символ із рядка, результатом є порядкове значення символу, що видаляється, як було сказано вище. Однак додавання цього значення додасть рядкове подання цього числа, а не символу - досить несиметричне поведінку, і на мою думку, недолік дизайну. Якщо ви насправді хотіли це зробити, попереднє поглиблення коштувало б лише один байт.
Додаткова копія підсумкового значення вже є в стеці, тому я знову )
видаляю остаточне значення , закреслюю його рядок, а потім знову xor, щоб будь-які символи, додані чи вилучені першим xor, були відновлені. Якщо int op string
трактуватись як персонаж, а не його рядкове представлення, )^^
можна було б замінити його |
.
Зауважте, що в той час як рядки (які в Golfscript зберігаються як масив вкладень) відображатимуть значення кожного символу mod 256 , значення кожного символу можуть самі бути поза цим діапазоном. Під час тестування на унікальність (за допомогою встановлених операцій) чи вмістності (через ?
) порівняно фактичне значення, а не значення відображення.
Файл виправлення для поточного інтерпретатора Golfscript :
61c61
< to_gs
---
> Gstring.new([self])
Сказане лише вплине на поведінку string op int
(і навпаки), де op
є один із
+-|&^
. Все інше залишається незмінним, включаючи поведінку Gint`
.
Наступне 24-байтне рішення набуде чинності:
{:i.)+.n*{*i%.}%i>|,}:f;
І це також фіксує безліч інших справді некрасивих робіт .
Пітон - 48 байт
f=lambda n:len(set(10**-~i%n for i in range(n)))
Не найефективніше рішення, але розумне для значень менше 100000 .
FWIW, основний елемент ідентичний моєму рішенню для створення циклічних чисел у десяткових числах .
Більш ефективна версія того ж коду ( 70 байт ):
def f(n):
a=[];i=10%n
while i not in a:a+=i,;i=i*10%n
return len(a)
Значення 99991 займає менше секунди.