Давайте создадим систему чисел, в которой наибольшая цифра в n-м значении (считая справа налево) длины числа m всегда равна m - n + 1. Чтобы привести пример наибольшего числа из 5 цифр, выражаемого в этой системе написано 12345. За исключением числа цифр, доступных для использования в определенном месте, все остальные приращения являются стандартными. А именно, когда цифра должна превысить свой предел, мы добавляем ее к следующей цифре.
Вот как будет представлен счет в этой системе:
1; 10; 11; 12; 100; 101; 102; 103; 110; 111; 112; 113; 120; 121; 122; 123; 1000; 1001 ...
Ваша задача - написать функцию, которая берет стандартный номер 10 и преобразует его в мою систему нумерации.
Более короткий код предпочтительнее. Бонн Шанс!
** Если вам нужны цифры после 9 (вы должны), вы можете использовать буквы или вы можете вернуть двузначное число в качестве элемента списка.
Тестовые случаи
10 -> 111
20 -> 1003
30 -> 1023
50 -> 1123
100 -> 10035
23116 -> 1234567
21977356 -> 123456789A
Последний случай может быть невероятно медленным в зависимости от того, как вы реализовали. Вам не нужно запускать его, если он занимает слишком много времени или использует слишком много памяти. Тем не менее, обратите внимание, что существуют способы, чтобы он работал быстро и используя мало памяти.
источник
100 -> 10035
вместо того100 -> 10033
, вы можете проверить?Ответы:
Mathematica, 64 байта
Безымянная функция, принимающая положительный целочисленный аргумент и возвращающая список целых чисел.
Join[{{1}},Array[Range,#-1,3]-1]
возвращает вложенный список{ {1}, {0,1,2}, {0,1,2,3}, ..., {0,1,...,#} }
. ЗатемTuples
возвращает (отсортированный) набор всех кортежей, в которых лежит первый элемент, в котором находится{1}
второй элемент{0,1,2}
и т. Д .; это#
цифры -d в этой системе нумерации.Join@@Array[...,#]
возвращает массив всех чисел в этой системе нумерации с не более чем#
цифрами иPart[...,#]
извлекает#
такое число.Это безнадежно медленно! Он работает нормально для ввода до 9. Для большего ввода проверьте его, заменив конец
,#],#]&
на,Ceiling[0.9Log[#]]],#]&
; это позволяет более реалистично ограничить количество цифр, необходимое для того, чтобы перейти в систему нумерации достаточно далеко, чтобы найти ту, которая нам нужна.источник
Mathematica, 93 байта
Чистая функция с первым аргументом
#
. Если задано неотрицательное целое число, оно выведет правильный список цифр (даже обрабатывает0
правильно!).объяснение
Nest[f,expr,n]
дает результат примененияf
коexpr
n
времени. В данном случаеexpr
это список{0}
иn
входное целое число#
. Функцияf
сложная:источник
y___,z_:0
для увеличения длины списка!Perl 6 , 38 байт
Принимает положительное целое число и выводит список целых чисел, представляющих цифры.
Объяснение:
источник
Pyth - 14 байт
Просто возвращает
nth
значение, которое соответствует «шаблону значений меньше места».Тестовый пакет .
источник
2018967
, где последняя цифра равна 10?Haskell, 65 байт
i
увеличивает числа в системе счисления с цифрами в обратном порядке.iterate
создает бесконечный список всех этих чисел, начиная с нуля, который представлен[]
. Тогда все, что осталось сделать, это взять (!!
) требуемый номер иreverse
его.Последняя строка - это функция, а не определение функции, поэтому она не может отображаться как есть в файле исходного кода. Вместо этого поместите только другие строки в исходный код и используйте последнюю строку в интерпретаторе (или привяжите функцию к имени, добавив
f=
к последней строке).Пример использования:
(8 байт можно было бы сохранить, если бы
[5,3,0,0,1]
было разрешено представление результата.)источник
Haskell, 49 байтов
Первая строка является вспомогательным определением, а вторая - функцией. Он принимает целое число и возвращает список целых чисел. Попробуйте онлайн!
объяснение
Я определяю
x
как бесконечный список представлений, упомянутых в тексте запроса; основная функция просто уменьшает свой аргумент и индексирует вx
. Первая строка работает так:Вы видите, что
x
это определяется само по себе, но Haskell ленив, так что это не проблема.источник