Описание
Раньше было довольно много других проблем, связанных с этими цифрами, и я надеюсь, что этого нет среди них.
П е треугольное число равно сумме всех натуральных чисел вплоть до п , простые вещи. Есть страница википедии и запись в OEIS , для тех, кто хочет узнать больше.
Теперь Гаусс обнаружил, что каждое натуральное число может быть выражено как сумма трех треугольных чисел (включая их 0
), и хорошо иметь одно число более одного раза, например 0 + 1 + 1 = 2
.
Вызов
Ваша задача - написать программу или функцию, учитывая натуральное число (включая 0
), и печатать три треугольных числа, которые суммируют до аргумента. Вы можете распечатать числа, разделенные пробелами, в виде массива или другим способом, который вам нравится. Однако запрещено использовать любые встроенные функции для непосредственного получения массива, диапазона или любой другой формы коллекции, содержащей список треугольных чисел (например, один атом, который возвращает диапазон).
Контрольные примеры
9 -> 6 + 3 + 0 or 3 + 3 + 3
12 -> 6 + 6 + 0 or 6 + 3 + 3 or 10 + 1 + 1
13 -> 6 + 6 + 1
1 -> 1 + 0 + 0
0 -> 0 + 0 + 0
Примечание. Если существует более одной возможной комбинации, вы можете напечатать любую или все, но вы должны напечатать любую комбинацию только один раз, исключив все комбинации, которые являются результатом перестановки других комбинаций. Я был бы очень признателен за ссылку и объяснение, я очень люблю видеть, как вы решаете проблему;)
Это код-гольф , поэтому применяются стандартные лазейки. Пусть победит самый короткий ответ в байтах!
источник
a
не всегда будет треугольным числомn
и возвращают список первыхn
треугольных чисел являются разрешены? Это скорее направлено против какого-то определенного языка, хотя я не знаю, какой именно.Ответы:
05AB1E , 10 байтов
Код:
Объяснение:
Использует кодировку 05AB1E . Попробуйте онлайн!
источник
Python 2 , 99 байт
Попробуйте онлайн!
Я очень удивлен, что это короче
itertools
или тройное понимание списка! Он (в конце концов) выплевывает случайный ответ каждый раз, когда вы запускаете его.Два 102-х:
itertools выглядит 106:
источник
Желе , 12 байт
Попробуйте онлайн!
Как это устроено
источник
Брахилог , 13 байт
Попробуйте онлайн!
Как это устроено
источник
MATL , 18 байт
Это выводит первый результат в лексикографическом порядке.
Попробуйте это в MATL Online!
объяснение
источник
Haskell,
6659 байтСпасибо за то, что позволили вывести все решения, это было отвлекательно! Я был так счастлив, что мне не нужно было извлекать одно решение и иметь возможность просто дать им все, что я не заметил, сколько стоит отказ от перестановочных решений. Замечание @ Линн объяснило мне это и позволило мне сэкономить 7 байтов.
Это связывает более чем достаточно треугольных чисел
l
и проверяет все комбинации.источник
a>=b,b>=c
условий и просто добавление суффикса!!0
к вашему коду не является верным ответом? Вывод всех решений на самом деле вам здесь не поможет.Retina ,
6359 байтПопробуйте онлайн! Ссылка включает в себя тестовые случаи.
(1(?(1)\1))*
является обобщенным сопоставителем треугольных чисел, но для первого треугольного числа мы можем сохранить несколько байтов, используя^
для начального совпадения.источник
PHP , 351 байт
Попробуйте онлайн!
источник
Python 3 , 119 байт
Попробуйте онлайн!
Спасибо @WheatWizard за сохранение 12 байтов!
источник
map
(и, возможно, ваш фильтр) может быть написан короче, как понимание списка.map
[*filter(...)]
(x,y,z) for x,y,z in...
что дольше, чем ваше,l for l in...
что, вероятно, объясняет эту разницу.C / C ++ - 197 байт
Удар за ударом:
Необходим для печати. Может быть исключено для определенных версий C
Экономия места для цикла.
Рекурсивный треугольник оценки.
Этот парень делает тяжелую работу. Три вложенных цикла for выполняют итерацию a, b, c от 0 до n, обратите внимание, что каждая из b и c выполняет итерацию от предыдущего значения до n. Строго не нужно обрезать итерацию подобным образом, поскольку
return
приход через минуту решает проблему «дублирования».На внутреннем уровне, если сумма трех треугольников нумерует
==
желаемое значение, выведите треугольники и вернитесь.Вы можете юридически удалить
return
ключевое слово и преобразовать возвращаемый тип c в void, чтобы сохранить еще несколько байтов и распечатать все возможные решения. Именно по этой причине , что итерации ограничены, если все петли выбежали из0
кn
ней может вызвать дубликаты.источник
Mathematica, 63 байта
источник
First
который экономит колоссальные 2 байта ,(t=#;#&@@Select[Table[i(i+1)/2,{i,0,t}]~Tuples~{3},Tr@#==t&])&
для 62 байтов.CJam , 26 байт
Порт моего MATL ответа. Это анонимный блок, который ожидает входные данные в стеке и заменяет их выходным массивом.
Попробуйте онлайн!
источник
R , 66 байт
Алгоритм грубой силы; читает
n
из стандартного ввода и возвращает фрейм данных, где каждая строка представляет собой комбинацию из трех треугольных чисел, которые складываются вn
. При необходимости я могу вернуть только первую строку для +4 байта.Попробуйте онлайн!
источник
Java 8, 164 байта
Объяснение:
Попробуй это здесь.
источник
JavaScript, 108 байт
объяснение
x
представляет входwhile(a<=x)r.push(a=i++*i/2)
Создает массив всех треугольных чисел до хfor
Цикл печатает самое высокое треугольное число меньшеx
, затем вычитает это число отx
, в течение трех итераций. (в основном жадный алгоритм)источник
x = 103
:91 + 10 + 1 = 102
Pyth, 19 байт
Я так потренировался с Пифом, это неправда: /
Попробуйте это здесь .
источник
J , 36 байт
Попробуйте онлайн!
источник
Рубин
615755 байтВдохновленный ответом Линн на Python . Он генерирует случайные тройки, пока не будет достигнута желаемая сумма:
Требуется Ruby 2.4. В Ruby 2.3 и старше это синтаксическая ошибка, и
Range#sum
она не определена. Эта более длинная версия (64 байта) необходима для Ruby 2.3:Вот небольшой тест:
Попробуйте онлайн с Ruby 2.3!
источник
Javascript (ES6), 108 байт - исправлено
Принимает целое число в качестве входных данных, выводит массив,
[a, b, c]
содержащий отсортированный список номеров треугольниковa + b + c = x
, гдеa
наибольшее число треугольников меньше или равно входному значению, аb
наибольшее число треугольников меньше или равно входному минусуa
.объяснение
Показать фрагмент кода
источник
x-m-n
треугольное число, то есть, почему это работает?