Давайте определим последовательность: последовательность суммирования из n цифр (n-DSS) - это последовательность, которая начинается с n . Если последним числом было k , то следующим будет k + цифро-сумма (k) . Вот первые несколько n-DSS:
1-DSS: 1, 2, 4, 8, 16, 23, 28, 38, 49, 62, 70...
2-DSS: 2, 4, 8, 16, 23, 28, 38, 49, 62, 70, 77...
3-DSS: 3, 6, 12, 15, 21, 24, 30, 33, 39, 51, 57...
4-DSS: 4, 8, 16, 23, 28, 38, 49, 62, 70, 77, 91...
5-DSS: 5, 10, 11, 13, 17, 25, 32, 37, 47, 58, 71...
6-DSS: 6, 12, 15, 21, 24, 30, 33, 39, 51, 57, 69...
7-DSS: 7, 14, 19, 29, 40, 44, 52, 59, 73, 83, 94...
8-DSS: 8, 16, 23, 28, 38, 49, 62, 70, 77, 91, 101...
9-DSS: 9, 18, 27, 36, 45, 54, 63, 72, 81, 90, 99...
Для 1 это A004207 , хотя первые несколько цифр отличаются из-за немного другого определения. Для 3 это A016052 ; для 9, A016096 .
Сегодня задача состоит в том, чтобы найти последовательность с наименьшей n-значной суммой, в которой присутствует данное число. Это называется «Обратной функцией Колумбии» и называется A036233 . Первые двадцать терминов, начиная с 1:
1, 1, 3, 1, 5, 3, 7, 1, 9, 5, 5, 3, 5, 7, 3, 1, 5, 9, 7, 20
Некоторые другие хорошие тестовые случаи:
117: 9
1008: 918
Вам нужно обрабатывать только целые числа больше 0, и вы можете использовать ввод и вывод в любом стандартном формате. Как обычно, это код-гольф , поэтому выигрывает самый короткий ответ на каждом языке.
Ответы:
Haskell ,
1046463 байта(-26 благодаря H.PWiz, дополнительно -14 благодаря Sriotchilism O'Zaic, дополнительно -1 благодаря Коулу)
Это функция.
Попробуйте онлайн!
Объяснение:
Последовательность составных функций, которая возвращает y + цифровую сумму y. Сначала преобразуется в строку, затем выполняет гимнастику монады, чтобы получить сумму символов и оригинальное число (спасибо Коулу).
<*>
Оператор в этом контексте имеет тип и определениетак что мы можем написать выше, как
Это
read . pure
преобразует числоChar
в число, поэтому(+) . read . pure :: Char -> Int -> Int
добавляет цифру к накопленному значению. Это значение инициализируется указанным номером в сгибе.until
повторно применяет функцию к своему результату (в данном случае, y + цифровая сумма y), пока она не удовлетворяет требованию, указанному функцией в первом аргументе. Это дает наименьший элемент y-DSS, который больше или равен x.Бесконечный ленивый список y, такой, что наименьший элемент y-DSS> = x на самом деле x. Использует нотацию понимания списка Хаскеллом (о которой я также полностью забыл, спасибо вам всем).
Первый элемент этого списка, который является наименьшим y, удовлетворяющим требованию задачи.
источник
fmap
в первую очередь меня немного смущает.Python 2 ,
7371 байт-2 байта благодаря Эрику .
Попробуйте онлайн!
источник
l
кk>n
.Perl 6 , 44 байта
Попробуйте онлайн!
Наивное решение, которое проверяет каждую последовательность, пока не найдет ту, которая содержит ввод
Объяснение:
источник
Рубин , 51 байт
Попробуйте онлайн!
источник
Желе , 11 байт
Попробуйте онлайн!
Полная программа.
источник
MATL , 18 байт
Попробуйте онлайн! Или проверьте первые 20 значений .
объяснение
Для ввода
i
это продолжает увеличиватьсяn
до тех пор, пока не будут включены первыеi
членыn
-ой последовательностиi
. Достаточно проверитьi
условия для каждой последовательности, потому что последовательность увеличивается.источник
Forth (gforth) , 106 байтов
Попробуйте онлайн!
Код Объяснение
источник
Pyth , 13 байт
Попробуйте здесь или проверьте набор тестов .
Как это работает
В большинстве языков было бы легче зацикливаться на множестве натуральных чисел, найти первоеN К 1 N N N К
источник
fqQ.W<HQ+sjZ10
за 14. Я постоянно забываю о `и s как о способе получения цифр из целого числа!Желе , 9 байт
Монадическая ссылка, принимающая положительное целое число,
n
которое дает положительное целое число,a(n)
обратный колумбийскийn
.Попробуйте онлайн! Или посмотрите набор тестов .
Как
По сути, мы работаем в обратном направлении, многократно ищем добавленную стоимость, пока не можем ее найти:
Используя
13
в качестве примера ...источник
Python 2 , 85 байт
Попробуйте онлайн!
Это, безусловно, работает для всех тестовых случаев, плюс все записи 1..88, представленные в OEIS; но все - таки я не совсем уверен , что это доказуемо правильно. (Это одна из моих жалоб относительно Церкви модульного тестирования :)).
источник
a.index(n)
Wolfram Language (Mathematica) , 61 байт
Попробуйте онлайн!
источник
MathGolf , 13 байт
Попробуйте онлайн!
Отличный вызов! Это заставило меня найти несколько ошибок в неявном поп-поведении MathGolf, что добавило 1-2 байта к решению.
Чтобы доказать, что это всегда будет работать, это легко увидеть
n <= input
, потому чтоinput
это первый элементinput
последовательности. Я технически не доказал, что это решение всегда верно, но оно проходит каждый тестовый пример, который я тестировал.источник
05AB1E , 13 байтов
Попробуйте онлайн!
источник
Чисто , 86 байт
Попробуйте онлайн!
Expanded:
Меня беспокоит, что
digitToInt d
это дольше, чемtoInt d-48
источник
C (gcc) , 102 байта
Попробуйте онлайн!
источник
JavaScript, 65 байт
Попробуйте онлайн!
Он также работает как C, но стоит еще один байт
C (gcc) , 66 байт
Попробуйте онлайн!
источник
C # (интерактивный компилятор Visual C #) ,
83, 82 байтаПопробуйте онлайн!
источник
Japt ,
1514 байтТройка для обработки случаев, где
input=output
меня раздражает!Попытайся
источник
cQuents , 18 байтов
Попробуйте онлайн!
объяснение
источник
Forth (gforth) , 99 байтов
Попробуйте онлайн!
Во многом похоже на представление Реффу (106 байт) . Части гольфа:
Как это работает
источник
Древесный уголь , 26 байт
Попробуйте онлайн! Ссылка на подробную версию кода. Использует алгоритм @ ChasBrown. Если это окажется неверным, то для 29 байтов:
Попробуйте онлайн! Ссылка на подробную версию кода. Работает путем вычисления первого члена каждой последовательности суммирования цифр не менее чем
n
. Объяснение:Вход
n
.Цикл, пока мы не найдем последовательность суммирования цифр, содержащую
n
.Следующая последовательность начинается на одну единицу больше, чем количество последовательностей.
Цикл, пока член последовательности меньше
n
.Добавьте сумму цифр, чтобы получить следующий член последовательности.
Нажмите последний член в списке.
Выведите количество вычисленных списков, пока мы не найдем один содержащий
n
.источник
Красный , 103 байта
Попробуйте онлайн!
источник
CJam , 25 байтов
Попробуйте онлайн!
источник
Gaia , 16 байт
Попробуйте онлайн!
Возвращает список, содержащий наименьшее целое число.
Gaia , 16 байт
Попробуйте онлайн!
Использует наблюдение, сделанное г-ном Xcoder . Он не короче другого, но, тем не менее, это интересный подход.
Gaia , 16 байт
Попробуйте онлайн!
Третий подход не использует
N-find
,#
но все еще полагается на то же наблюдение, что и средний подход. Возвращает целое число, а не список.источник
Clojure , 106 байт
Попробуйте онлайн!
Это 99 байт, но это приводит к переполнению стека на больших входах (возможно, поможет настройка JVM):
источник
C # (интерактивный компилятор Visual C #) , 75 байт
Попробуйте онлайн!
источник
Шелуха ,
1410 байт-4 благодаря @ H.PWiz
Попробуйте онлайн!
источник
€mΩ≥¹SF+dN
(я все еще чувствую, что есть короче)V£⁰m¡SF+dN
чернила ,
130127 байтПопробуйте онлайн!
-3 bytes
путем преобразования в полную программу, которая принимает унарный ввод.Это слишком долго, чтобы не играть в гольф.
Ungolfed
источник
C (gcc) ,
807978 байтПопробуйте онлайн!
-2 от потолка
источник