从第一个“ n”数字取零


15

挑战

面临的挑战是编写一个代码,该代码以正整数“ n”作为输入,并显示所有可能的方式来写入从1到n的数字,并在两者之间使用正号或负号,以使它们的总和为等于零。请记住,您只能使用加法或减法。

例如,如果输入为3,则有两种方法使总和为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。
Manish Kundu

我们可以将+as N-as 表示为-N,还是太过分了?(例如3-> [[-3,-3,3], [3,3,-3]]
乔纳森·艾伦

@JonathanAllan输出格式列表中没有提到吗?还是我误解了你的问题?
Manish Kundu

我的意思是喜欢0and 1选项,但使用Nand -N(请参见上面的编辑)
Jonathan Allan '18

2
@JonathanAllan是的,那当然可以。确保在答案中提及。
Manish Kundu

Answers:



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字节

乔纳森·艾伦Jonathan Allan)的建议,输出标志清单。

1,-ṗæ.ÐḟR

在线尝试!


1
将(la)输出格式与lax一起使用,Nṗæ.ÐḟR怎么样?
乔纳森·艾伦,

或者,输出将输出乘以n
user202729 '18

我建议的N-N输出已被允许,这样可以节省一个字节:)(只需要在回答中提及格式)
Jonathan Allan


3

Perl,37岁 36字节

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

做得很好。您可以删除-n<<<如果替换$_pop。它实际上并没有提高您的分数,但是会使整体​​表达更短;)
克里斯(Chris



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]]

2

Python 3,105个字节

lambda n:[k for k in product(*[(1,-1)]*n)if sum(-~n*s for n,s in enumerate(k))==0]
from itertools import*

在线尝试!


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 2,91字节

lambda x:[s for s in[[~j*[1,-1][i>>j&1]for j in range(x)]for i in range(2**x)]if sum(s)==0]

在线尝试!

返回满意列表的列表(例如,f(3)= [[-1,-2,3],[1,2,-3]])




1

C(gcc),171字节

k,s;f(S,n,j)int*S;{if(j--)S[j]=~0,f(S,n,j),S[j]=1,f(S,n,j);else{for(s=k=0;k<n;k++)s+=S[k]*-~k;if(!s&&puts(""))for(k=0;k<n;)printf("%d",S[k++]+1);}}F(n){int S[n];f(S,n,n);}

在线尝试! 用途0阴性和2积极的迹象。



1

蟒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个字节之前的空间
ovs,

0

JavaScript(ES6),69 61字节

摆脱k节省了8个字节,如@Neil所建议

使用alert()打印所有解决方案。

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

测试用例

使用console.log()代替alert()来提高用户友好性。


需要k吗 像这样:f=(n,o='')=>n?['+','-'].map(c=>f(n-1,c+n+o)):eval(o)||alert(o)
尼尔

@Neil我真的不...谢谢。
Arnauld

0

视网膜,73字节

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

_+
$.&

在线尝试!说明:

.+
*

将输入转换为一元。

_
=_$`

将数字转换为 =前缀数字。

+0`=
-$%"+

=依次用-和分别替换+重复行数。

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

分别计算s和_s之后的-s 数+ s。这将负数和正数相加。

G`(=.+)\1=

仅保留-s和+s抵消的那些行。

=.*

删除计数。

_+
$.&

转换为十进制。


0

Perl 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

Ĵ 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谢谢,我对代码的右侧不满意。
Galen Ivanov
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.