最初の「n」個の数字からゼロにする


15

チャレンジ

課題は、入力として正の整数「n」を取り、その合計がゼロに等しい。加算または減算のみを使用できることに注意してください。

たとえば、入力が3の場合、合計を0にする方法は2つあります。

 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    

ただし、簡単にするために、最初の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

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を順番に使用するためのものです。
マニッシュクン

+as Nおよび-as を表す-Nことができますか、それとも行き過ぎていますか?(例3-> [[-3,-3,3], [3,3,-3]]
ジョナサンアラン

@JonathanAllan出力形式のリストで言及されていませんか?または、あなたの質問を間違って解釈しましたか?
マニッシュクン

0and 1オプションのような意味ですが、and を使用Nします-N(上記の編集を参照)
ジョナサンアラン

2
@JonathanAllanはい、確かに許可されています。答えにそれを必ず記載してください。
マニッシュクン

回答:



5

ゼリー、9バイト

1,-ṗ×RSÐḟ

オンラインでお試しください!

Exp

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
(ab?)でlax出力形式を使用するのは,Nṗæ.ÐḟRどうですか?
ジョナサンアラン

または、この出力は、出力にを掛けたものnです。
user202729

Nそして-Nそれが(ちょうど答えでフォーマットを言及する必要があります)1バイト:)節約できますので、私が提案した出力は、許可されています
ジョナサン・アラン


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

Swift、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バイト
OVS

0

JavaScript(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)

テストケース

ユーザーフレンドリーのためにalert ()の代わりにconsole.log()を使用します


必要kですか?このようなもの:f=(n,o='')=>n?['+','-'].map(c=>f(n-1,c+n+o)):eval(o)||alert(o)
ニール

@ニール私は本当にしない...ありがとう。
アーナウルド

0

網膜、73バイト

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

_+
$.&

オンラインでお試しください!説明:

.+
*

入力を単項に変換します。

_
=_$`

=数字を接頭辞付き数字のリストに変換します。

+0`=
-$%"+

それぞれ=を順番に両方で置き換え-+、行数を毎回複製します。

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

_sの後-のsの数を個別にカウントし、+ sます。これは、負の数と正の数を合計します。

G`(=.+)\1=

行だけおいてください-ねをし、+ sがキャンセルされるします。

=.*

カウントを削除します。

_+
$.&

10進数に変換します。


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

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のすべての可能なリストを掛け、合計がゼロになるものを見つけます。

                    (             ) - 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ありがとう、コードの右側に満足できませんでした。
ガレンイワノフ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.