Вызов
Задача состоит в том, чтобы написать код, который принимает положительное целое число n в качестве входных данных и отображает все возможные способы записи чисел от 1 до n с положительным или отрицательным знаком между ними, так что их сумма равна равно нулю. Пожалуйста, помните, что вы можете использовать только сложение или вычитание.
Например, если введено 3, то есть 2 способа сделать сумму 0:
1+2-3=0
-1-2+3=0
Обратите внимание, что числа расположены по порядку, начиная с 1 до n (в данном случае это 3). Как видно из примера, знак первого числа также может быть отрицательным, поэтому будьте осторожны.
Теперь 3 было довольно просто. Давайте перечислим все способы, когда мы рассмотрим число 7.
1+2-3+4-5-6+7=0
1+2-3-4+5+6-7=0
1-2+3+4-5+6-7=0
1-2-3-4-5+6+7=0
-1+2+3+4+5-6-7=0
-1+2-3-4+5-6+7=0
-1-2+3+4-5-6+7=0
-1-2+3-4+5+6-7=0
Итак, у нас есть 8 возможных способов.
Вход и выход
Как указывалось ранее, входное значение будет положительным целым числом . Ваш вывод должен содержать все возможные способы, которыми числа дают сумму нуля. В случае, если нет возможности сделать то же самое, вы можете вывести все что угодно .
Также вы можете распечатать вывод в любом формате, который вам нравится . Но это должно быть понятно . Например, вы можете распечатать его как в примере выше. Или вы можете просто распечатать знаки чисел по порядку. В противном случае вы также можете вывести «0» и «1» по порядку, где «0» будет отображать отрицательный знак, а «1» будет отображать положительный знак (или наоборот).
Например, вы можете представить 1 + 2-3 = 0, используя:
1+2-3=0
1+2-3
[1,2,-3]
++-
110
001
Однако я бы порекомендовал использовать любой из первых трех форматов для простоты. Вы можете считать все входные данные действительными.
Примеры
7 ->
1+2-3+4-5-6+7=0
1+2-3-4+5+6-7=0
1-2+3+4-5+6-7=0
1-2-3-4-5+6+7=0
-1+2+3+4+5-6-7=0
-1+2-3-4+5-6+7=0
-1-2+3+4-5-6+7=0
-1-2+3-4+5+6-7=0
4 ->
1-2-3+4=0
-1+2+3-4=0
2 -> -
8 ->
1+2+3+4-5-6-7+8=0
1+2+3-4+5-6+7-8=0
1+2-3+4+5+6-7-8=0
1+2-3-4-5-6+7+8=0
1-2+3-4-5+6-7+8=0
1-2-3+4+5-6-7+8=0
1-2-3+4-5+6+7-8=0
-1+2+3-4+5-6-7+8=0
-1+2+3-4-5+6+7-8=0
-1+2-3+4+5-6+7-8=0
-1-2+3+4+5+6-7-8=0
-1-2+3-4-5-6+7+8=0
-1-2-3+4-5+6-7+8=0
-1-2-3-4+5+6+7-8=0
счет
Это код-гольф , поэтому выигрывает самый короткий код!
источник
+
какN
и-
как-N
, или это заходит слишком далеко? (например3
->[[-3,-3,3], [3,3,-3]]
)0
и1
вариант, но с использованиемN
и-N
(см. Мое редактирование выше)Ответы:
Haskell , 42 байта
Попробуйте онлайн!
источник
0==
?Желе , 9 байт
Попробуйте онлайн!
Exp
Желе , 9 байт
По предложению Джонатана Аллана выведите список признаков.
Попробуйте онлайн!
источник
,Nṗæ.ÐḟR
?n
.N
И-N
выход я предложил было разрешено, так что экономит один байт :) (просто нужно упомянуть формат в ответ)Python 2 , 62 байта
Попробуйте онлайн!
Г-н Xcoder сэкономил 4 байта с изящным использованием звездных аргументов.
источник
*l
вместоl=[]
Perl,
3736 байтисточник
-n
и<<<
если вы замените$_
наpop
. Это на самом деле не улучшает ваш счет, но делает общее выражение короче;)05AB1E , 11 байт
Попробуйте онлайн!
Формат вывода, например, для ввода
3
:То есть
-1-2+3, 1+2-3
.источник
Wolfram Language (Mathematica) , 36 байт
Попробуйте онлайн!
источник
Шелуха , 10 байт
Попробуйте онлайн!
объяснение
Не слишком сложно.
источник
Python 3 , 105 байт
Попробуйте онлайн!
источник
Swift , 116 байт
Попробуйте онлайн!
объяснение
источник
Python 2 , 91 байт
Попробуйте онлайн!
Возвращает список удовлетворяющих списков (например, f (3) = [[- 1, -2,3], [1,2, -3]])
источник
APL (Dyalog) , 38 байт
Попробуйте онлайн!
источник
Pyth , 13 байт
Попробуй это здесь!
источник
C (GCC) , 171 байт
Попробуйте онлайн! Используется
0
для отрицательных и2
положительных признаков.источник
Чисто , 79 байт
Попробуйте онлайн!
источник
Python 3 + numpy,
104103 байтаВыходные данные [-1, 1] соответствуют знаку.
источник
if
за -1 байтJavaScript (ES6),
6961 байтСэкономили 8 байтов, избавившись от k , как предложено @Neil
Печатает все решения с предупреждением () .
Контрольные примеры
Использование console.log () вместо alert () для удобства пользователей.
Показать фрагмент кода
источник
k
? Как то так:f=(n,o='')=>n?['+','-'].map(c=>f(n-1,c+n+o)):eval(o)||alert(o)
Сетчатка , 73 байта
Попробуйте онлайн! Объяснение:
Преобразовать ввод в унарный.
Преобразуйте число в список
=
чисел с префиксом.Замените каждый
=
по очереди на оба-
и+
, дублируя количество строк каждый раз.Отдельно посчитайте количество
_
s после-
s и+
s. Это сумма отрицательных и положительных чисел.Оставьте только те строки, где
-
s и+
s отменяются.Удалить счет.
Преобразовать в десятичную.
источник
Perl 6 , 43 байта
Попробуйте это
Возвращает последовательность списков
Expanded:
1..$_ X* 1,-1
⇒(1, -1, 2, -2)
(…).rotor(2)
⇒((1, -1), (2, -2))
[X] …
⇒((1, 2), (1, -2), (-1, 2), (-1, -2))
источник
J ,
3530 байт-5 байт благодаря FrownyFrog!
Попробуйте онлайн!
Оригинал:
J 35 байт
Как это устроено
Я умножаю список 1..n на все возможные списки коэффициентов 1 / -1 и нахожу те, которые суммируются до нуля.
Попробуйте онлайн!
В качестве альтернативы я попробовал явный глагол, используя подход декартового произведения +/-:
J 37 байт
{(<"1@,.-)
находит декартовы произведения, например:Очень жаль, что он упаковывает результат, поэтому я потратил несколько байтов, чтобы распаковать значения
Попробуйте онлайн!
источник