Golfscript - 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, будут восстановлены. Если бы int op string
обрабатывались как символ, а не его строковое представление, )^^
можно было бы заменить на |
.
Обратите внимание, что хотя строки (которые в Golfscript хранятся в виде массива целых чисел) будут отображать значение каждого символа мод 256 , сами значения каждого символа могут выходить за пределы этого диапазона. При проверке уникальности (через операции набора) или автономности (через ?
) сравнивается фактическое значение, а не отображаемое значение.
Файл патча для текущего интерпретатора Golfscript :
61c61
< to_gs
---
> Gstring.new([self])
Вышеуказанное повлияет только на поведение string op int
(и наоборот), где op
один из
+-|&^
. Все остальное остается неизменным, включая поведение Gint`
.
Следующее 24-байтовое решение станет действительным:
{:i.)+.n*{*i%.}%i>|,}:f;
И это также исправляет много других действительно уродливых обходных путей .
Python - 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 занимает меньше секунды.