С учетом входных данных n
напишите программу или функцию, которая выводит / возвращает сумму цифровых сумм n
для всех базисов от 1 до n
.
Пример:
n = 5
Создайте диапазон [1...n]
:[1,2,3,4,5]
Для каждого элемента x
получите массив базовых x
цифр n
: [[1,1,1,1,1],[1,0,1],[1,2],[1,1],[1,0]]
биективен base- 1
из 5
IS[1,1,1,1,1]
базовый 2
(двоичный) из 5
is[1,0,1]
base- 3
из 5
IS[1,2]
base- 4
из 5
IS[1,1]
base- 5
из 5
IS[1,0]
Суммируйте цифры: 13
Тестовые случаи:
1 1
2 3
3 6
4 8
5 13
6 16
7 23
8 25
9 30
10 35
36 297
37 334
64 883
65 932
Последовательность может быть найдена на OEIS: A131383
Подсчет очков:
code-golf : выигрывает представление с наименьшим количеством очков.
227 -> 9999
. А также:1383 -> 345678
.Ответы:
Холст , 3 байта
Попробуй это здесь!
Холст бить желе?
источник
Haskell , 46 байтов
Попробуйте онлайн!
объяснение
Функция[ 0 … b ]N в лексикографическом порядке. Например:
\b n -> mapM(pure[0..b])[1..n]
генерирует все строкиИндексирование в него с помощью1 ), но мы суммируем результаты. Мы можем даже сохранить некоторые байты с (n+1) вместо обходного пути для base-1 поскольку мы пропускаем [1,…,1n times] что аналогично [n] при суммировании.
(!!n)
этого может использоваться для преобразованияn
в основаниеb+1
, однако это не будет работать для унарного (base-a <- [1..n]
помощью и использовать base-Использование
do
-notation просто объединяет все списки вместо их вложения:источник
APL (Dyalog Unicode) , 14 байтов
Попробуйте онлайн!
объяснение
Некоторые скобки подразумеваются и могут быть добавлены (легче, чем «официальные» скобки):
Это монадическая верхушка. Учитывая аргумент
Y
, эта функция ведет себя так:Две функции применяются по порядку. Начнем с правильного:
В этом поезде три функции, так что это вилка. Учитывая аргумент
Y
, он действует как:Мы можем легко свести это к следующему (monadic
⊢
возвращает свой аргумент, который называется идентичностью ):Теперь мы знаем, что
Y
это целое число (простой скаляр, то есть число или символ), так как нам дано одно. Следовательно⍳Y
, с⎕IO=1
, возвращает1 2 ... Y
.⍳Y
фактически возвращает массив с формойY
(Y
должен быть вектором), где каждый скаляр является индексом самого себя в массиве (поэтому monadic⍳
называется генератором индекса ). Эти индексы являются векторами, за исключением случая1≡⍴Y
, когда они являются скалярами (это наш случай).Давайте разберем среднюю функцию
(⍴⊤⊣)¨
, далее.⍴⊤⊣
является операндом¨
( каждого ), а функция является двоичной, поэтому¨
оператор сначала преобразует каждый аргумент длины 1 в форму другого (то есть берет элемент и использует его для замены каждого скаляра в другом аргументе). , а затем примените функцию к каждой паре двух аргументов. В этом случае,⍳Y
является вектором , иY
является скаляром, так что , еслиn≡⍴⍳Y
, тоY
будет преобразован вn⍴Y
(⍴
представляет собой форму (монадическая) и изменить форму (двоично) функций). То есть, в более простых сроках,Y
будет преобразован в массив, содержащийY
временаY
.Теперь для каждой пары давайте назовем левый аргумент
X
и правыйZ
(чтобы мы не конфликтовали с входными даннымиY
).⍴⊤⊣
это диадическая вилка, поэтому она расширится до:Давайте сделать простой первый шаг снижения
X⊣Z
кX
(диадическим⊣
является левой функцией):⍴
ВX⍴Z
это, опять же , Reshape функция, поэтомуX⍴Z
, в нашем случае, это простоX
разZ
.⊤
это функция кодирования . Учитывая два массива чисел, где левый массив является базой каждой цифры в результате (не обязательно должен быть целым или положительным), т. Е. Кодировка, а право - это массив чисел, возвращает транспонированный массив тех числа в указанной кодировке (транспонирование - это обращение размеров массива относительно его элементов). Представление цифры основано на частном деления числа и произведении менее значимых оснований. Если любая база есть0
, она действует как база + ∞. Скаляры аргументов все просты. ТакX
как является положительным целым числом, иX⍴Z
является вектором равных элементов, это на самом деле просто случай преобразованияX
в основаниеZ
и преобразования вX
цифры. ДляX⍴Z
вполне достаточно для наших целей.РезультатY1=[1,1,...,1]Y , поэтому сумма простоY×1=Y . Отсюда следует, что мы должны добавить
Y(⍴⊤⊣)¨⍳Y
, таким образом,Y
превращает в каждую базу от 1 доY
, возможно , с ведущими нулями. Тем не менее, есть одна проблема: в APL база 1 не имеет специального случая, в то время как эта задача имеет особый случай, поэтому мы должны включить сумму цифр базы-1Y
самих себя. К счастью, эта сумма простоY
, так какY
куда-нибудь в массив. Вот как мы это делаем:Я уже включил эту часть здесь. Dyadic
,
- это функция catenate , она объединяет свои аргументы на последних осях и ошибки, если это невозможно. Здесь мы просто объединяем скалярY
с векторомY(⍴⊤⊣)¨⍳Y
, так что мы увеличиваем сумму, по которой будем вычислятьY
, как объяснено выше.Последняя часть - это левая функция нашей вершины
+/∘∊
:∘
это оператор сочинения .f∘g Y
так же, какf g Y
. Тем не менее, мы используем его здесь, чтобы наш поезд не раскошелился на∊
. Итак, мы можем уменьшить:Теперь пришло время для суммы, но подождите ... есть проблема. Массив не является плоским, поэтому мы не можем просто суммировать его элементы, прежде чем сгладить его первым. Enlist функция
∊
сглаживает массив. Теперь, когда массив был сведен, мы, наконец, используем его+/
для суммирования./
является оператором уменьшения , он применяет двоичную функцию между элементами массива на его второй-последней оси с приоритетом справа налево. Если ранг (число измерений, то есть длина формы) массива не уменьшается, массив затем включается, хотя здесь это не так. Функция, которая применяется здесь+
, это плюсфункция, которая добавляет пары на последних осях двух массивов (и выдает ошибки, если массивы не могут быть добавлены таким образом). Здесь он просто добавляет два числа несколько раз, чтобы уменьшение было завершено.И вот, наш поезд
источник
+/∘∊⊢,⊢⊤¨⍨⊢⍴¨⍳
Руби ,
3937Единственный гольф здесь удаляет некоторые пробелы. Попробуйте онлайн
источник
n
(37b):->n{(2..n).sum{|b|n.digits(b).sum}+n}
Python 2 , 57 байт
Попробуйте онлайн!
источник
Java 8,
7665 байт-11 байт благодаря @ OlivierGrégoire .
Попробуйте онлайн.
Объяснение:
источник
i
, так что ... 65 байт.Desmos, 127 байт
Desmos, 56 байт
источник
^n
должно быть достаточно.\sum_{b=2}^{n+1}
кn+\sum_{b=2}^n
сохранению еще 2 байтовSAS,
8174 байтаВвод вводится после
cards;
оператора в новых строках, например:Выводит набор данных, содержащий ответ
s
(вместе с вспомогательными переменными), со строкой для каждого входного значенияUngolfed:
источник
Japt
-x
, 6 байтПопытайся
Попытайся
источник
J ,
2423 байтПопробуйте онлайн!
источник
05AB1E (legacy) , 5 байтов
Попробуйте онлайн!
Объяснение:
В 05AB1E (унаследованном) основание 1 из 5 составляет [0,0,0,0,0], а не [1,1,1,1,1]. Поэтому после суммирования диапазона добавьте вход для учета недостающей базы 1.
Я использую 05AB1E (устаревшее), потому что в текущем 05AB1E база 1 из 5 - [1]. Чтобы учесть это, мне нужно либо уменьшить результат на 1, либо удалить первый элемент диапазона, оба из которых будут стоить 1 байт.
источник
Perl 6 ,
4541 байт-4 байта благодаря Джо Кингу
Попробуйте онлайн!
источник
Пробел , 153 байта
Буквы
S
(пробел),T
(табуляция) иN
(новая строка) добавляются только как подсветка.[..._some_action]
добавлено только в качестве объяснения.Попробуйте онлайн (только с необработанными пробелами, вкладками и новыми строками).
Порт моего Java 8 ответа , потому что в Whitespace вообще нет встроенных преобразований Base.
Пример выполнения:
input = 3
Программа останавливается с ошибкой: выход не найден. (Хотя я мог бы добавить три завершающих символа новой строки,
NNN
чтобы избавиться от этой ошибки.)источник
R , 60 байтов
Попробуйте онлайн!
Сбой,
n>143
потому144^144
что больше, чемdouble
может получить. Спасибо Джошу Эллеру за предложение заменитьlog(n,i)
простоn
.Ниже будет работать для
n>143
; не уверен, в какой момент он перестанет работать.R , 67 байт
Попробуйте онлайн!
Использует классический
n%/%i^(0:log(n,i))%%i
метод для извлечения базовыхi
цифр дляn
каждой базыb>1
, затем суммирует их и накапливает суммуF
, которую инициализирует0
, затем добавляетn
(базовое1
представлениеn
)F
и возвращает результат. Ибоn=1
он пропускает базы и просто добавляетn
кF
.источник
0:log(n,i)
, вы не могли бы использовать0:n
? В любом базовом представлении n всегда будет не более n цифр, и все после начальныхlog(n,i)
цифр должно быть 0, поэтому это не повлияет на сумму.n=144
, так143^143
как вокруг1.6e308
и144^144
оцениваетInf
. Благодарность!Python 2 , 61 байт
Попробуйте онлайн!
Хотя это дольше решение Дениса, на котором оно основано, я нахожу метод слишком забавным, чтобы не делиться им.
Цель состоит в том, чтобы выполнить рекурсию как при обрезании последней цифры, так
n->n/b
и приращении базыb->b+1
, но мы хотим предотвратить увеличение базы после того, как одна или несколько цифр были обрезаны. Это достигается за счет того, что основаниеb
является поплавком, так что после обновленияn->n//b
поплавокb
заражаетсяn
своей плавучестью. Таким образом,n
является ли число с плавающей точкой или нет, это бит-флаг для того, удалили ли мы какие-либо цифрыn
.Мы требуем, чтобы условие
1/n==0
выполнялось для приращенияb
, которомуn
удовлетворяют целые числа, потому что деление по полу выполнено, но с плавающей точкой не получается. (n=1
также терпит неудачу, но мы все равно не хотим возвращаться к нему.) В противном случае, функции с плавающей запятой работают так же, как целые числа в функции, потому что мы осторожны при делении по этажамn//b
, и выводом является число с плавающей точкой.источник
C (gcc),
6756 байтПорт моего Java 8 ответа .
-11 байтов благодаря гольфу @ OlivierGrégoire на моем ответе на Java.
Попробуйте онлайн.
Объяснение:
источник
JavaScript (ES6), 42 байта
Эта версия почти идентична моему основному ответу, но полагается на арифметический недостаток, чтобы остановить рекурсию. Максимальное поддерживаемое значение зависит от размера стека вызовов.
Попробуйте онлайн!
JavaScript (ES6),
51 4844 байтПопробуйте онлайн!
комментарии
источник
APL (Dyalog Unicode) , 22 байта
Попробуйте онлайн!
источник
Шелуха , 6 байт
Я очень хочу, чтобы было что-то вроде
M
дляcmap
:(Попробуйте онлайн или протестируйте все!
объяснение
В качестве альтернативы 6 байтов
Попробуйте онлайн или протестируйте все!
объяснение
источник
Пари / ГП , 30 байт
Попробуйте онлайн!
источник
Желе , 4 байта
Попробуйте онлайн!
Как это устроено
источник
Атташе , 25 байт
Попробуйте онлайн!
объяснение
источник
Древесный уголь , 12 байт
Попробуйте онлайн! Ссылка на подробную версию кода. Древесный уголь не может конвертировать в базу 1, но, к счастью, сумма цифр такая же, как и в базеn + 1 , Объяснение:
источник
Сетчатка 0.8.2 , 49 байт
Попробуйте онлайн! Ссылка включает в себя тестовые случаи. Объяснение:
Преобразовать в одинарный.
Перечислите все числа от 2 доn + 1 (так как это проще, чем конверсия по основанию 1).
Используйте многократный divmod для преобразования исходного числа в каждую базу.
Удалите список баз, оставив только цифры преобразования базы.
Возьмите сумму и конвертируйте в десятичную.
источник
Десмос, 51 байт
Вдохновленный ответом Конора О'Брайена и глядя на запись OEIS, я придумал собственное решение Desmos:
Попробуйте онлайн!
источник
APL (NARS), 29 символов, 58 байтов
небольшой тест о том, как использовать:
источник