첫 번째 'n'숫자에서 0으로 만들기


15

도전

문제는 양의 정수 'n'을 입력으로 사용하고 1에서 n까지의 숫자를 쓸 수있는 모든 가능한 방법을 표시하는 코드를 작성하는 것입니다. 0과 같습니다. 더하기 또는 빼기 만 사용할 수 있습니다.

예를 들어, 입력이 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이되는 가능한 모든 방법이 포함되어야합니다. 동일한 방법 으로 가능한 방법이 없으면 원하는 것을 출력 할 수 있습니다 .

또한 원하는 형식으로 출력을 인쇄 할 수 있습니다 . 그러나 이해할 수 있어야합니다 . 예를 들어 위의 예와 같이 인쇄 할 수 있습니다. 또는 숫자의 부호를 순서대로 인쇄하면됩니다. 그렇지 않으면 '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

우리는 나타낼 수 +N-같은 -N, 또는 너무 멀리 그것을 복용하는 것이 무엇입니까? (예 3-> [[-3,-3,3], [3,3,-3]])
조나단 앨런

@JonathanAllan 출력 형식 목록에 언급되지 않았습니까? 아니면 내가 당신의 질문을 잘못 해석 했습니까?
Manish Kundu

나는 0and 1옵션을 의미 하지만 Nand를 사용합니다 -N(위의 편집 내용 참조)
Jonathan Allan

2
@JonathanAllan 그렇습니다. 답에서 그 점을 언급하십시오.
Manish Kundu

답변:



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
lax 출력 형식을 ,Nṗæ.ÐḟR? 와 함께 사용하는 방법은 무엇입니까?
Jonathan Allan

또는 출력에 출력을 곱한 값이 n있습니다.
user202729

N-N그 (단지 대답의 형식을 언급 할 필요) 한 바이트 : 저장 그래서 내가 제안 출력이 허용되었습니다
조나단 앨런


3

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


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

파이썬 NumPy와 3 +, 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

자바 스크립트 (ES6), 69 61 바이트

@Neil이 제안한 것처럼 k 를 제거하여 8 바이트를 절약 했습니다.

alert ()로 모든 솔루션을 인쇄합니다 .

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

테스트 사례

사용 을 console.log () 대신 경고 () 사용자 편의를위한합니다.


당신은 필요 k합니까? 이런 식으로 뭔가 :f=(n,o='')=>n?['+','-'].map(c=>f(n-1,c+n+o)):eval(o)||alert(o)

@ 닐 정말 ... 감사합니다.
Arnauld

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 바이트

FrownyFrog 덕분에 -5 바이트!

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

온라인으로 사용해보십시오!

기발한:

J , 35 바이트

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

작동 원리

나는 목록 1..n에 가능한 모든 계수 목록 1 / -1을 곱하고 0을 더하는 것을 찾습니다.

                    (             ) - 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.