Зробити нуль з перших 'n' чисел


15

Виклик

Завдання полягає в тому, щоб написати код, який приймає позитивне ціле число '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

Оцінка балів

Це , тому найкоротший код виграє!


Зауважте, що це не обов`язок codegolf.stackexchange.com/questions/8655/… , тому що ця задача має на меті приймати лише n як вхідні дані та використовувати всі числа 1-n для порядку.
Маніш Кунду

Чи можемо ми представити себе +як Nі -як -N, чи це занадто далеко? (напр. 3-> [[-3,-3,3], [3,3,-3]])
Джонатан Аллан

@JonathanAllan Хіба це не зазначено у списку вихідних форматів? Або я неправильно трактував ваше запитання?
Маніш Кунду

Я маю на увазі, як 0і 1варіант, але використовуючи Nі -N(див. Мою редакцію вище)
Джонатан Аллан

2
@JonathanAllan Так, це звичайно дозволено. Обов’язково це згадайте у відповіді.
Маніш Кунду

Відповіді:



5

Желе , 9 байт

1,-ṗ×RSÐḟ

Спробуйте в Інтернеті!

Досвід

1,-ṗ×RSÐḟ  Main link. Input = n. Assume n=2.
1,-        Literal list [1, -1].
   ṗ       Cartesian power n. Get [[1, 1], [1, -1], [-1, 1], [-1, -1]]
    ×R     Multiply (each list) by Range 1..n.
       Ðḟ  ilter out lists with truthy (nonzero)
      S      Sum.

Желе , 9 байт

За пропозицією Джонатана Аллана виведіть список знаків.

1,-ṗæ.ÐḟR

Спробуйте в Інтернеті!


1
Як щодо (ab?) Використання лак-формату виводу з ,Nṗæ.ÐḟR?
Джонатан Аллан

Або, як варіант, цей вихід виводить, помножений на n.
користувач202729

NІ -Nвихід я запропонував було дозволено, так що економить один байт :) (просто потрібно згадати формат у відповідь)
Джонатан Аллана


3

Perl, 37 36 байт

perl -E 'map eval||say,glob join"{+,-}",0..<>' <<< 7

Чудово зроблено. Можна скинути -nі <<<якщо замінити $_на pop. Це фактично не покращує вашу оцінку, але робить загальний вираз коротшим;)
Кріс



2

Лушпиння , 10 байт

fo¬ΣΠmSe_ḣ

Спробуйте в Інтернеті!

Пояснення

Не надто складна.

fo¬ΣΠmSe_ḣ  Implicit input, say n=4
         ḣ  Range: [1,2,3,4]
     m      Map over the range:
      Se     pair element with
        _    its negation.
            Result: [[1,-1],[2,-2],[3,-3],[4,-4]]
    Π       Cartesian product: [[1,2,3,4],[1,2,3,-4],..,[-1,-2,-3,-4]]
f           Keep those
   Σ        whose sum
 o¬         is falsy (equals 0): [[-1,2,3,-4],[1,-2,-3,4]]


1

Швидкий , 116 байт

func f(n:Int){var r=[[Int]()]
for i in 1...n{r=r.flatMap{[$0+[i],$0+[-i]]}}
print(r.filter{$0.reduce(0){$0+$1}==0})}

Спробуйте в Інтернеті!

Пояснення

func f(n:Int){
  var r=[[Int]()]                         // Initialize r with [[]]
                                          // (list with one empty list)
  for i in 1...n{                         // For i from 1 to n:
    r=r.flatMap{[$0+[i],$0+[-i]]}         //   Replace every list in r with the list
  }                                       //   prepended with i and prepended with -i
  print(r.filter{$0.reduce(0){$0+$1}==0}) // Print all lists in r that sums to 0
}






1

Python 3 + numpy, 104 103 байти

import itertools as I,numpy as P
lambda N:[r for r in I.product(*[[-1,1]]*N)if sum(P.arange(N)*r+r)==0]

Вихід [-1, 1] відповідає знаку.


Ви можете видалити пробіл раніше ifза -1 байт
до

0

JavaScript (ES6), 69 61 байт

Збережено 8 байт, позбувшись k , як запропонував @Neil

Друкує всі рішення попередженням () .

f=(n,o='')=>n?f(n-1,o+'+'+n)&f(n-1,o+'-'+n):eval(o)||alert(o)

Тестові справи

Використання console.log () замість aler () для зручності використання.


Вам потрібно k? Приблизно так:f=(n,o='')=>n?['+','-'].map(c=>f(n-1,c+n+o)):eval(o)||alert(o)
Ніл

@Neil я насправді не ... Дякую.
Арнольд

0

Сітківка , 73 байти

.+
*
_
=_$`
+0`=
-$%"+
(-(_)+|\+(_)+)+
$&=$#2=$#3=
G`(=.+)\1=
=.*

_+
$.&

Спробуйте в Інтернеті! Пояснення:

.+
*

Перетворити вхід в одинаковий.

_
=_$`

Перетворіть номер у список =-префіксованих чисел.

+0`=
-$%"+

Замініть кожен =по черзі на обидва -і +, дублюючи кількість рядків кожен раз.

(-(_)+|\+(_)+)+
$&=$#2=$#3=

Окремо підраховують кількість _s після -s і +s. Це підсумовує від’ємні та додатні числа.

G`(=.+)\1=

Зберігайте лише ті рядки, у яких -s і +s скасовуються.

=.*

Видаліть рахунки.

_+
$.&

Перетворити в десятковий.


0

Перл 6 , 43 байти

{grep *.sum==0,[X] (1..$_ X*1,-1).rotor(2)}

Спробуйте це
Повертає послідовність списків

Розширено:

{  # bare block lambda with implicit parameter 「$_」

  grep              # only return the ones
    *.sum == 0,     # that sum to zero

    [X]             # reduce with cross meta operator

      (
          1 .. $_   # Range from 1 to the input

        X*          # cross multiplied by

          1, -1

      ).rotor(2)    # take 2 at a time (positive and negative)
}

1..$_ X* 1,-1(1, -1, 2, -2)
(…).rotor(2)((1, -1), (2, -2))
[X] …((1, 2), (1, -2), (-1, 2), (-1, -2))


0

J , 35 30 байт

-5 байт завдяки FrownyFrog!

>:@i.(]#~0=1#.*"1)_1^2#:@i.@^]

Спробуйте в Інтернеті!

Оригінал:

J , 35 байт

[:(#~0=+/"1)>:@i.*"1(_1^[:#:@i.2^])

Як це працює

Я помножую список 1..n на всі можливі списки коефіцієнтів 1 / -1 і знаходжу ті, які складають нуль.

                    (             ) - the list of coefficients
                             i.     - list 0 to 
                               2^]  - 2 to the power of the input
                     _1^[:          - -1 to the power of 
                          #:@       - each binary digit of each number in 0..n-1 to 
                 *"1                - each row multiplied by
            >:@i.                   - list 1..n
  (#~      )                        - copy those rows
     0=+/"1                         - that add up to 0
[:                                  - compose   

Спробуйте в Інтернеті!

Як альтернатива я спробував явне дієслово, використовуючи підхід декартового продукту +/-:

J , 37 байт

3 :'(#~0=+/"1)(-y)]\;{(<"1@,.-)1+i.y'

{(<"1@,.-) знаходить декартові продукти, наприклад:

{(<"1@,.-) 1 2 3
┌───────┬────────┐
│1 2 3  │1 2 _3  │
├───────┼────────┤
│1 _2 3 │1 _2 _3 │
└───────┴────────┘

┌───────┬────────┐
│_1 2 3 │_1 2 _3 │
├───────┼────────┤
│_1 _2 3│_1 _2 _3│
└───────┴────────┘

Шкода, що він відображає результат, тому я витратив кілька байт, щоб розблокувати значення

Спробуйте в Інтернеті!


@FrownyFrog Дякую, я не був задоволений правильною стороною свого коду.
Гален Іванов
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.