Цифровой корень (также повторяющаяся цифровая сумма) положительного целого числа - это (однозначное число) значение, полученное в результате итеративного процесса суммирования цифр на каждой итерации, используя результат предыдущей итерации для вычисления суммы цифр. Процесс продолжается до достижения однозначного числа.
Например, цифровой корень 65536 равен 7 , потому что 6 + 5 + 5 + 3 + 6 = 25 и 2 + 5 = 7 .
Сортировка всех цифровых корней не имеет особого смысла, поскольку она будет начинаться с бесконечного числа 1 с.
Вместо этого мы создадим списки всех однозначных целых чисел вместе с их цифровыми корнями, затем все двузначные числа вместе с их цифровыми корнями, затем тройные, четверные и так далее.
Теперь для каждого из этих списков мы отсортируем его так, чтобы сначала появились все целые числа с цифровыми корнями, равными 1 , затем все целые числа с цифровыми корнями, равными 2, и так далее. Сортировка будет стабильной, так что список целых чисел с определенными цифровыми корнями должен быть в порядке возрастания после сортировки.
Наконец, мы объединим эти списки в одну последовательность. Эта последовательность начинается со всех однозначных чисел, затем со всех двузначных чисел (отсортированных по их цифровому корню), затем со всех трехзначных чисел и так далее.
Вызов:
Возьмите положительное целое число n в качестве входных данных и выведите n -ое число в последовательности, описанной выше. Вы можете выбрать, является ли список 0 -индексированным 1- индексированным.
Последовательность выглядит следующим образом:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 19, 28, 37, 46, 55, 64, 73, 82, 91, 11, 20, 29 ...
72, 81, 90, 99, 100, 109, 118, ...
981, 990, 999, 1000, 1009, 1018, 1027, ...
Тестовые случаи:
Тестовые случаи 1-индексированы.
n f(n)
9 9
10 10
11 19
40 13
41 22
42 31
43 40
44 49
45 58
600 105
601 114
602 123
603 132
604 141
605 150
4050 1453
4051 1462
4052 1471
4053 1480
4054 1489
4055 1498
Проще скопировать:
n = 9, 10, 11, 40, 41, 42, 43, 44, 45, 600, 601, 602, 603, 604, 605, 4050, 4051, 4052, 4053, 4054, 4055,
f(n) = 9, 10, 19, 13, 22, 31, 40, 49, 58, 105, 114, 123, 132, 141, 150, 1453, 1462, 1471, 1480, 1489, 1498
Разъяснения:
- Вы не можете вывести все n первых элементов. Вы должны только вывести n 'th.
- Код должен теоретически работать для всех целых чисел вплоть до 10 ^ 9 , но это нормально, если он истекает в TIO (или других интерпретаторах с ограничениями по времени) для входных данных, больших 999 .
- Пояснения приветствуются.
Это код-гольф , поэтому выигрывает самый короткий код на каждом языке! Не расстраивайтесь от других решений на языке, на котором вы хотите играть в гольф, даже если они короче, чем вы можете управлять!
Ответы:
Python 2 ,
7860524645 байт-6 байт благодаря ГБ .
-1 байт благодаря Якобу .
Попробуйте онлайн!
Наконец-то добрался до закрытой формы, 1-индексируется.
Python 2 , 78 байт
0 индексированные.
Попробуйте онлайн!
источник
Python 3 , 80 байт
Попробуйте онлайн!
1-индексироваться. Это лучшее, что я мог бы сделать в Python 3 (ну, за исключением 78-байтового , который является портом моего решения Python 2 ниже; я думаю, что это гораздо круче). Полные программы на Python 2 имеют преимущества для этой конкретной задачи, потому что
input()
требует преобразованияint
в Python 3 (+5 байт),exec
является функцией, а не оператором (+2 байта) и/
выполняет целочисленное деление по умолчанию, если его аргументы являются целыми числами в Py 2 (+1 байт), так что это определенно короче, чем перенос ответа ovs .Как это работает
Настроить
Это определяет рекурсивную функцию f, которая принимает один целочисленный аргумент i и другой, k , который по умолчанию равен 1 . В то время как k ≤ i , функция f возвращает f (i, 10k) , умножая k на 10 каждый раз, пока она не станет больше, чем i .
Целевой диапазон и правильная индексация
После этого набора операций у нас остается i , начальный вход и переменная k, которая представляет наименьшую степень на 10 больше, чем i . Таким образом, мы можем сгенерировать (целочисленный) диапазон [floor (k / 10), k) , который в основном включает все целые числа:
Поскольку мы игнорируем целые числа, меньшие чем x = floor (k / 10) , мы должны сдвинуть индексирование так, чтобы мы учитывали пропущенные числа. Очевидный способ состоит в том, чтобы вычесть их число x из i , чтобы мы проиндексировали их в списке (после сортировки, которая описана ниже), следовательно, имея ix . Однако, поскольку список содержит 9k / 10 , элементы и индексацию в списке с индексом -y для некоторого положительного значения y, получается y- й элемент с конца в Python, это просто эквивалентно индексации с помощью ik , следовательно, сохраняя 4 байта.
Сортировка каждого чанка по цифровому корню
Формула для цифровой корневой функции имеет вид 1 + ((n-1) mod 9) (см. Раздел « Формула конгруэнтности » в этой статье Википедии ). Так как 1 будет добавлен таким образом к каждому из них, при сортировке это излишне, поэтому у нас остается (n-1) mod 9 . Способ
%
работы оператора Python, когда в RHS заданы отрицательные числа, очень удобен, потому что вместо него можно использовать n pymod -9, чтобы сохранить еще один другой байт.Python 2 , 72 байта
Вдохновленный представлением Часа Брауна .
Попробуйте онлайн!
источник
Python 2 ,
737170 байтПопробуйте онлайн!
2 байта спасибо мистеру XCoder ; и 1 байт спасибо H.PWiz .
Это 0-индексированный.
источник
i%9
должно быть достаточно вместоi%9+1
... таким образом, вы побили мой 72 байт: DD:len(`~i`)
должен работатьЖеле ,
15 14 109 байтПопробуйте онлайн!
Как?
Использует версию для гольфа в закрытом виде, созданную ovs в своем ответе на Python ...
Формула, представленная ovs: 9 * (n% b) + (n / b) + b - 1, где b = 10 этаж (log (n, 10))
Теперь, если c - это количество десятичных цифр n, тогда b-1 - это c-1 девяток в десятичной дроби.
Это то же самое, что девятикратное значение с-1 в десятичном виде (например
111*9=999
).Кроме того, n / b - это начальная цифра n, а n% b - это остальные цифры в виде десятичного числа.
Формула типа b * x + y может быть реализована как преобразование
[x,y]
из базы b(то есть b ^ 1 * x + b ^ 0 * y = b * x + y )
Таким образом, мы можем взять число, например n (
7045
), разделить его на начальную и конечную цифры, поместив начальную цифру в конец ([[0,4,5],7]
), добавить одну ко всем цифрам первого элемента, чтобы обслужить добавление b-1 ([[1,5,6],7]
) преобразует их из десятичных списков в целые числа ([156,7]
) и преобразует их из базы девять (1411
).В приведенной ниже реализации мы добавляем одну ко всем цифрам обоих элементов при обработке b-1 (
[[0,4,5],8]
), конвертируем из десятичных списков в целые числа ([156,8]
), конвертируем из базы девять (1412
) и затем вычитаем ту, которую этот процесс добавил (1411
).Предыдущая, 14 байт:
Попробуйте онлайн!
Этот строит список до следующей степени 10 над входом, сортируя эти натуральные числа, а
[digitalRoot, digitCount]
затем находит значение по введенному индексу.источник
Haskell ,
9488 байтПопробуйте онлайн! 0 индексированные.
Объяснение:
Понимание списка генерирует последовательность как бесконечный список, в который мы индексируем
!!
:x
на единицу меньше текущего числа цифр и берется из бесконечного списка[0,1,2,3, ...]
i
перебирает диапазон от1
до9
и используется для сортировки по цифровым корнямn
перебирает все числа сx+1
цифрамиuntil(<10)(sum.map(read.pure).show)
вычисляет цифровой корень ( см. здесь для объяснения )n
добавляется в список, если его цифровой корень равенi
.источник
Сетчатка , 65 байт
Попробуйте онлайн! 1-индексироваться. Объяснение:
Составьте список строк
_
s от 0 до следующей степени 10 (эксклюзив).Сортируйте их все в порядке цифрового корня.
Преобразовать из одинарного в десятичное.
Сортируйте их в порядке длины.
Извлеките
n
элемент.источник
Pyth ,
36 31 25 24 2322 байта1-индексироваться.
Тестирование!
Как это работает (устарело)
источник
05AB1E ,
1911 байтПорт моего Python ответа .
-6 байт (!) Благодаря Кевину Круйссену .
Попробуйте онлайн!
источник
g<°©÷¹®%9*®O<
. Вот объяснение, которое я собирался опубликовать для него .Pyth , 23 байта
Попробуй это здесь.
-3 спасибо мистеру Xcoder
1-индексироваться.
источник
Perl 6 ,
6858 байтПроверьте это на основе 0
Проверьте это 1 на основе
Expanded:
источник
Рубин ,
4338 байтПопробуйте онлайн!
Первоначально порт с отличным Python-ответом от ovs, затем упростил еще несколько.
источник
Java 8, 68 байт
Скучный порт ответа @ovs на Python 2 , так что не забудьте его поддержать!
-1 байт благодаря @Jakob
Попробуйте онлайн.
источник
К4 , 38 байт
Решение:
Примеры:
Объяснение:
Порт Джонатана Аллана, поскольку у меня не хватает памяти для построения цифровых корней от 1 до 1e9.
Бонус:
Перевод решения ovs проще, но дольше:
источник
Желе , 19 байт
Попробуйте онлайн!
-1 спасибо мистеру Xcoder .
1-индексироваться.
источник
J, 24 байта
Это молчаливое выражение заключено в скобки, чтобы показать, что его следует рассматривать отдельно, а не как часть любого последующего выражения (например, аргументов).
Фраза '] /:' заказывает (по возрастанию '/:') исходный массив ']' на сумму '+ /' цифр. Выражение
преобразует число в символьный вектор с помощью "": ", затем применяет его обратное значение" ". - символ к номеру - применяется к каждому элементу «&>». Итак, 65536 -> '65536' -> 6 5 5 3 6.
Соединение степеней «^:» в конце выражения применяет код, который мы только что объяснили (слева), указанное количество раз. В этом случае указанное число раз равно бесконечности '_', что означает, что необходимо продолжать применять, пока результат не перестанет меняться.
Последний «0» означает применять все выражение слева к каждому скалярному (0-мерному) элементу справа, который будет массивом чисел, к которому мы хотим применить это.
источник
Эликсир , 239 байт
Попробуйте онлайн!
Объяснение поступает (медленно)! Я не думаю, что это может стать намного короче этого, но я всегда открыт для предложений
источник
Perl 5
-pF
, 27 байтПопробуйте онлайн!
Использует формулу @ ovs и объяснения @ JonathanAllen, чтобы создать хороший компактный кусок кода.
источник