Мы привыкли к термину «возведение в квадрат» n, чтобы означать вычисление n 2 . Мы также привыкли к тому, что термин «куб» n означает n 3 . При этом, почему мы не можем также треугольник число?
Как треугольник номер?
Прежде всего, давайте выберем номер
53716
.Поместите его в параллелограмм, длина стороны которого равна количеству цифр числа, и имеет две стороны, расположенные по диагонали, как показано ниже.
53716 53716 53716 53716 53716
Теперь мы хотим это, верно? Для этого обрежьте стороны, которые не вписываются в прямоугольный треугольник:
5 53 537 5371 53716
Возьмем суммы каждой строки, для этого примера, в результате чего
[5, 8, 15, 16, 22]
:5 -> 5 53 -> 8 537 -> 15 5371 -> 16 53716 -> 22
Подводить список
[5, 8, 15, 16, 22]
, в результате чего66
. Это треугольник этого числа!
Спецификации и правила
Входными данными будет неотрицательное целое число n ( n ≥ 0, n ∈ Z ).
Вы можете принимать входные данные и предоставлять выходные данные любым разрешенным способом .
Входные данные могут быть отформатированы как целое число, строковое представление целого числа или список цифр.
По умолчанию лазейки запрещены.
Это код-гольф , поэтому выигрывает самый короткий код в байтах!
Больше тестов
Вход -> Выход 0 -> 0 1 -> 1 12 -> 4 123 -> 10 999 -> 54 100000 -> 6 654321 -> 91
Вдохновение. Пояснения приветствуются!
источник
645321 -> 91
?645321
вместо654321
.Ответы:
Haskell , 13 байт
Попробуйте онлайн!
Принимает ввод в виде списка цифр. Вычисляет совокупные суммы, а затем суммирует их.
источник
Шелуха ,
4̷2 байтаСпасибо @ H.PWiz за
-2
байты!Попробуйте онлайн!
"Ungolfed" / Разъяснения
источник
Brain-Flak ,
65, 50,36 байтовПопробуйте онлайн!
После многих пересмотров я теперь очень горжусь этим ответом. Мне нравится алгоритм, и как хорошо он может быть выражен в мозге.
Большая часть подсчета байтов получается при обработке 0 на входе. Фактически, если бы мы могли предположить, что на входе не было нулей, это был бы красивый короткий 20-байтовый ответ:
Попробуйте онлайн!
Но, к сожалению, мозговые штурмы печально известны плохой обработкой крайних случаев.
объяснение
Во-первых, мое наблюдение:
Если длина ввода n цифр, первая цифра появится в треугольнике n раз, вторая цифра появится n-1 раз, и так далее до последней цифры, которая появится один раз. Мы можем воспользоваться этим, так как действительно легко вычислить, сколько цифр ввода осталось в мозговом штурме, а именно
Итак, вот как работает код.
источник
Pyth -
64 байтаПопробуйте это онлайн здесь .
Хороший 6-байтовый, который не использует встроенный префикс:
источник
s.e*bhk_
MATL , 3 байта
Попробуйте онлайн!
Принимает ввод в виде списка цифр.
источник
Желе , 3 байта
Попробуйте онлайн! Использует ту же технику, что и мой ответ Япта: кумулятивное сложение, затем сумма.
источник
Haskell , 25 байт
Принимает ввод как список цифр
Попробуйте онлайн!
Haskell , 41 байт
Принимает ввод как строковое представление
Попробуйте онлайн!
источник
Japt ,
764 байтаПопробуйте онлайн!
объяснение
Старое решение:
Попробуйте онлайн!
объяснение
источник
Brain-Flak , 28 байт
Попробуйте онлайн!
14 байтов, если нам не нужно поддерживать нули (что мы делаем)
Попробуйте онлайн!
У DJMcMayhem классный ответ здесь вы должны проверить. К сожалению для него, я не собирался позволять ему побеждать на его родном языке: P
Как это работает?
Начнем с простой версии.
Основное действие здесь состоит в том
({}<>{})<>
, что он берет вершину левого стека и добавляет к вершине правого стека. Зацикливая эту операцию, мы суммируем текущий стек (пока он не достигнет нуля), помещая сумму в стек выключения. Это довольно обыденно, интересная часть в том, что мы подводим итоги всех этих запусков как наш результат. Это рассчитает желаемое значение. Зачем? Хорошо, давайте посмотрим на пример123
. При первом захвате мы просто получаем 1, поэтому наше значение равно 1На следующем захвате мы возвращаем 1 плюс 2
На последнем забеге мы все трое вместе
Ты видишь треугольник? Сумма всех прогонов является «треугольником» списка.
Хорошо, но теперь нам нужно, чтобы он работал для нулей, здесь я использовал тот же трюк, что и DJMcMayhem, плюс немного модной работы. Вместо зацикливания, пока мы не достигнем нуля, мы зациклим, пока стек не станет пустым.
Затем я воспользовался этим советом , написанным никем иным, кроме вас, чтобы отыграть еще 2 байта.
И там у нас это есть. Я был бы удивлен, если бы было более короткое решение, но затем снова произошли более странные вещи.
источник
Unfortunately for him I wasn't about to let him win at his own language :P
Я не ожидаю от тебя ничего меньшего. : DJavaScript (ES6), 28 байт
Вводит в виде списка цифр.
источник
Python 3 , 37 байт
Попробуйте онлайн!
источник
len
чтобы ,sum
как хорошо, хотя я не верю , что помогает ничего.sum([])
0, но ничего неC # (.NET Core) , 59 байт
Попробуйте онлайн!
Существенно отличается от других ответов C #. Ввод представляет собой список цифр. Все тестовые примеры включены в ссылку TIO.
Может сохранить несколько байтов, если разрешено принимать входные данные в виде обратного списка цифр с начальным 0.
источник
number
, а не списком цифр?Python 3 , 35 байт
Я только что заметил, что это всего лишь небольшая доля ответа Business Cat в конце концов!
Попробуйте онлайн!
источник
J 7 байт
Попробуйте онлайн! Принимает список цифр, таких как
f 6 5 4 3 2 1
.объяснение
Чуть более верной была бы исходная проблема
[:+/@,]/
: «sum»+/
(,
) префиксы flatlined ( ) для input (]\
).источник
Вим ,
605932 нажатия клавишБольшое спасибо @CowsQuack за подсказку с рекурсивным макросом и
h
трюком, это сэкономило мне 27 байт!Попробуйте онлайн!
Ungolfed / Разъяснения
Это создаст треугольник, как описано (только если он будет выровнен по левому краю):
Буфер теперь выглядит так:
Объедините все строки в одну и создайте из нее вычисляемое выражение:
"
Регистр теперь содержит следующую строку (примечание отсутствует 0):Итак, все, что нам нужно сделать, это добавить ноль и оценить его:
источник
&
(весь матч) вместо команды\1
заменыqqYp$xq:exe"norm".col('.')."@q"⏎
может статьqqYp$xh@qq@q
. Этот рекурсивный макрос столкнется с ошибкой прерывания, когда в строке будет один символ, после чего он остановится.:s/./&+/g
. И:%j⏎
может статьV{J
. ИDi
может статьC
(я уже прокомментировал это в другом из ваших ответов Vim). Попробуйте онлайн!Python 2 ,
4945 байт-4 байта благодаря мистеру Xcoder.
Попробуйте онлайн!
Вводит в виде списка цифр.
источник
Утилиты Bash + GNU,
3224Ввод читать из STDIN.
Обновление: я вижу, что ввод может быть представлен в виде списка цифр. Мой список ввода разделен новой строкой.
Попробуйте онлайн .
объяснение
источник
APL, 4 байта
Это принимает входные данные в виде списка цифр, например:
объяснение
источник
Такси , 1478 байт
Попробуйте онлайн!
Un-golfed:
источник
Perl 5 , 19 + 1 (
-p
) = 20 байтПопробуйте онлайн!
Как?
$ \ содержит кумулятивную сумму, $ p содержит сумму цифр в текущей строке. Каждая строка параллелограмма - это просто предыдущая строка с добавленной следующей цифрой числа. Следовательно, это сумма предыдущей строки плюс новая цифра. Это перебирает все цифры, вычисляя суммы по ходу дела. Фактическая замена не имеет значения; это просто средство для перебора цифр без создания реального цикла. В конце $ \ печатается неявно с помощью
-p
опции.источник
Python 2 , 56 байт
Попробуйте онлайн!
источник
Желе ,
54 байтаМонадическая ссылка, принимающая список десятичных цифр и возвращающая треугольник числа, представленного в списке.
Попробуйте онлайн!
Как?
источник
€
все равно будет работать. Жаль ...Сетчатка , 13 байт
Попробуйте онлайн! Ссылка включает в себя тестовые случаи. Пояснение: На первом этапе генерируются все префиксы исходного числа, на втором этапе каждая цифра преобразуется в унарное, а на третьем этапе получается общее количество.
источник
Mathematica, 49 байтов
источник
#.Range[Length@#,1,-1]&
#.Range[Tr[1^#],1,-1]&
Tr@*Accumulate
Neim, 3 bytes
Explanation:
Try it online!
Alternative answer:
Explanation:
Try it online!
источник
Java 8, 53 bytes
I implemented a lambda for each acceptable input type. They each iterate through the number's digits, adding the proper multiple of each to an accumulator.
Integer as input (53 bytes)
Lambda from
Integer
toInteger
:String representation as input (72 bytes)
Lambda from
String
toInteger
:Digit array as input (54 bytes)
Lambda from
int[]
(of digits, largest place value first) toInteger
:источник
Pyt,
96 bytesExplanation:
источник
Python 3,
945854 bytesThanks to Mr. Xcoder for helping me save quite some bytes!
Try It Online!
Takes input as a string. It simply multiplies each digit by the number of times it needs to be added and returns their sum.
источник
0
. Ifp
must always be0
, you should replace thep
withp=0
in thelambda
declaration. However, you can just removep
entirely to get 54 bytesSNOBOL4 (CSNOBOL4), 79 bytes
Try it online!
Input from stdin, output to stdout.
источник
Common Lisp,
5352 bytesInput as list of digits.
Try it online!
-1 byte thanks to @ceilingcat.
источник
apply
is applied against very long lists because of thecall-arguments-limit
.