Цепочка сложения - это последовательность целых чисел, начинающаяся с 1, где каждое целое число, отличное от начального 1, является суммой двух предыдущих целых чисел.
Например, вот цепочка дополнений:
[1, 2, 3, 4, 7, 8, 16, 32, 39, 71]
Вот суммы, которые составляют цепочку сложений:
1 + 1 = 2
1 + 2 = 3
1 + 3 = 4
3 + 4 = 7
1 + 7 = 8
8 + 8 = 16
16 + 16 = 32
7 + 32 = 39
32 + 39 = 71
В этом задании вам дадут положительное целое число n
, и вы должны вывести одну из самых коротких цепочек сложений, которая заканчивается на n
.
Примеры - обратите внимание, что есть много возможных выходных данных, все, что вам нужно найти, это цепочка дополнений, которая так же коротка:
1: [1]
2: [1, 2]
3: [1, 2, 3]
4: [1, 2, 4]
5: [1, 2, 3, 5]
6: [1, 2, 3, 6]
7: [1, 2, 3, 4, 7]
11: [1, 2, 3, 4, 7, 11]
15: [1, 2, 3, 5, 10, 15]
19: [1, 2, 3, 4, 8, 11, 19]
29: [1, 2, 3, 4, 7, 11, 18, 29]
47: [1, 2, 3, 4, 7, 10, 20, 27, 47]
71: [1, 2, 3, 4, 7, 8, 16, 32, 39, 71]
Стандартные правила ввода / вывода и т. Д. Стандартные лазейки запрещены. Код гольф: побеждает побольше байтов.
code-golf
sequence
arithmetic
isaacg
источник
источник
Ответы:
Haskell , 57 байт
Решение грубой силы. Попробуйте онлайн!
объяснение
Бесконечный список
c
содержит все цепочки сложений, упорядоченные по длине. Он определяется индуктивно в терминах самого себя, беря списокx
изc
двух элементовx
и добавляя их сумму кx
. Функцияf
находит первый список,c
который заканчивается нужным номером.источник
Брахилог , 14 байт
Попробуйте онлайн!
Представление грубой силы, которое строит все возможные цепочки сложений, используя итеративное углубление, останавливаясь, когда цепочка, содержащая правильный аргумент, найдена. В отличие от большинства представлений Brachylog, это представление функции, которое вводится через свой правый аргумент (условно называемый «Выход») и выводит через его левый аргумент (условно называемый «Вход»); делает это несколько спорно, но самый высокий проголосовали мета ответ на эту тему говорит , что это законно (и делает это согласуется с нашими обычными по умолчанию I / O для функций). Если бы мы использовали ввод и вывод более обычным способом, это было бы 16 байтов (
∧≜;1{j⊇Ċ+}ᵃ⁽.∋?∧
), потому что правая часть программы не сможет использовать неявное ограничение (поэтому потребуется отключить его и дать новое явное ограничение стоимостью 2 байта).объяснение
Здесь интересная тонкость заключается в том, что происходит на первой итерации, когда входные данные представляют собой число, а не список, как на других итерациях; мы начинаем с числа 1, делаем две копии каждой цифры (делая число 11), а затем находим ее двухзначную подпоследовательность (также число 11). Затем мы берем сумму цифр, равную 2, и, как таковая, последовательность начинается так,
[1,2]
как мы хотим. На итераций в будущем, мы начинаем со списком , как[1,2]
, удваивая его[1,2,1,2]
, а затем взять два-элемента подпоследовательности ([1,1]
,[1,2]
,[2,1]
или[2,2]
); Очевидно, что суммы каждого из них будут действительными для следующих элементов цепочки сложения.Немного огорчает, что здесь нужна подсказка о порядке оценки, особенно
≜
компонент (кажется, что по умолчаниюᵃ
подсказка о порядке оценки принимается изнутри, а не снаружи, таким образом, довольно грубое использование для≜
того, чтобы вызвать проблему).источник
ᵃ
это одна из тех встроенных функций, которая редко появляется, но когда она вам нужна, она вам действительно нужна, поскольку не существует удаленного краткого способа ее реализации с использованием других управляющих конструкций. Как только я понял, что это былᵃ
вызов, все остальное пришло прямо оттуда.Желе , 17 байт
Выводит лексикографически первое решение в экспоненциальном времени.
Попробуйте онлайн!
Как это работает
источник
JavaScript (ES6),
8386 байтРедактировать: исправлено для вывода списка в обратном порядке
демонстрация
Показать фрагмент кода
источник
PHP, 195 байт
Попробуйте онлайн!
источник
Mathematica, 140 байт
,
каждый раз, когда вы запускаете его, создаете новую цепочку кратчайшего сложения
Попробуйте онлайн,
вставьте код с помощью ctrl + v, поместите ввод, т.е. [71] в конец кода, и нажмите shift + enter
источник
[1,2,4,5,9,18,36,72,77,149]
). Похоже, что ваша программа использует случайную выборку и не может найти оптимальное решение.Pyth, 13 байт
Тестирование
Дает лексикографически первую самую короткую цепочку. Это довольно медленно, но не так плохо -
19
завершается примерно через 30 секунд, используя pypy.Некоторые идеи из решения @ Dennis.
Мне действительно нравится этот - есть тонна изящных уловок, вовлеченных.
Объяснение:
Это все еще немного трудно понять, но позвольте мне попытаться объяснить более подробно.
Начнем с того
ySQ
, что дает все возможные упорядоченные подмножества[1, 2, ... Q]
, в порядке возрастания размера. Самая короткая цепочка сложений, безусловно, одна из них, но нам нужно ее найти.Первое, что мы сделаем, это отфильтруем список, чтобы сохранить только те списки, которые содержат
Q
. Мы делаем это с/#Q
.Далее мы упорядочиваем список по тому, что осталось после удаления результата определенной функции.
-D
заказы на остаток после удаления чего-либо.То, что мы удаляем, это то
sM^N2
, гдеN
находится список, из которого мы удаляем вещи.^N2
дает себе декартово произведениеN
всех возможных пар из двух элементовN
.sM
затем суммирует каждую из пар.Какой наименьший возможный результат после этого удаления? Что ж, самый маленький элемент в списке ввода определенно останется, потому что все числа положительны, поэтому любая сумма двух чисел будет больше, чем наименьшее число. И будет по крайней мере один номер, потому что мы проверили, что вход присутствует в списке. Поэтому наименьший возможный результат будет, когда каждое число, кроме наименьшего, является суммой двух других чисел в списке, а наименьшее число в списке равно 1. В этом случае ключ сортировки будет
[1]
. Эти требования означают, что список должен быть цепочкой дополнений.Итак, мы сортируем цепочки сложений вперед. Помните, что
y
его подмножества приводятся в порядке возрастания размера, поэтому список, который отсортирован вперед, должен быть одной из самых коротких цепочек сложений.h
выбирает этот список.источник