Dapatkan Nol Dari Angka 'n' Pertama

15

Tantangan

Tantangannya adalah untuk menulis kode yang mengambil bilangan bulat positif 'n' sebagai input dan menampilkan semua cara yang memungkinkan di mana angka dari 1 - n dapat ditulis, dengan tanda positif atau negatif di antaranya, sehingga jumlah mereka adalah sama dengan nol. Harap diingat bahwa Anda hanya dapat menggunakan penambahan atau pengurangan.

Misalnya, jika inputnya adalah 3, maka ada 2 cara untuk membuat penjumlahan 0:

 1+2-3=0
-1-2+3=0

Perhatikan bahwa, angkanya berurutan, mulai dari 1 hingga n (yaitu 3 dalam hal ini). Seperti terbukti dari contoh, tanda angka pertama juga bisa negatif, jadi berhati-hatilah.

Sekarang, 3 cukup sederhana. Mari kita buat daftar semua cara ketika kita mempertimbangkan angka 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

Jadi di sini, kita punya total 8 cara yang mungkin.


Masukan dan keluaran

Seperti yang dinyatakan sebelumnya, input akan menjadi bilangan bulat positif . Output Anda harus berisi semua cara yang memungkinkan angka-angka tersebut memberikan jumlah nol. Jika tidak ada cara yang memungkinkan untuk melakukan hal yang sama, Anda dapat menampilkan apa pun yang Anda suka.

Juga, Anda dapat mencetak output dalam format apapun yang Anda suka . Tapi, itu harus bisa dimengerti . Misalnya, Anda dapat mencetaknya seperti pada contoh di atas. Atau, Anda bisa saja mencetak tanda angka secara berurutan. Jika tidak, Anda juga dapat mencetak '0 dan' 1 secara berurutan, di mana '0' akan menampilkan tanda negatif dan '1' akan menampilkan tanda positif (atau sebaliknya).

Misalnya, Anda dapat mewakili 1 + 2-3 = 0 menggunakan:

1+2-3=0
1+2-3
[1,2,-3]
++-
110
001    

Namun, saya akan merekomendasikan menggunakan salah satu dari tiga format pertama untuk kesederhanaan. Anda dapat menganggap semua input valid.


Contohnya

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

Mencetak gol

Ini , jadi kode terpendek menang!

Manish Kundu
sumber
Harap dicatat bahwa ini bukan dupe dari codegolf.stackexchange.com/questions/8655/… , karena tantangan ini dimaksudkan untuk hanya mengambil n sebagai input dan menggunakan semua angka 1-n secara berurutan.
Manish Kundu
Semoga kami mewakili +sebagai Ndan -sebagai-N , atau apakah itu terlalu jauh? (eg 3-> [[-3,-3,3], [3,3,-3]])
Jonathan Allan
@ Jonathan Allan. Bukankah itu disebutkan dalam daftar format output? Atau apakah saya salah menafsirkan pertanyaan Anda?
Manish Kundu
Maksud saya suka opsi 0dan 1tetapi menggunakan Ndan -N(lihat edit saya di atas)
Jonathan Allan
2
@ Jonathan Allan Ya itu tentu saja diizinkan. Pastikan Anda menyebutkannya dalam jawaban.
Manish Kundu

Jawaban:

7

Haskell , 42 byte

f n=[l|l<-mapM(\i->[i,-i])[1..n],0==sum l]

Cobalah online!

benar-benar manusiawi
sumber
1
42 .
user202729
1
Bukankah seharusnya begitu 0==?
Laikoni
5

Jelly , 9 byte

1,-ṗ×RSÐḟ

Cobalah online!

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.

Jelly , 9 byte

Saran Jonathan Allan , berikan daftar tanda.

1,-ṗæ.ÐḟR

Cobalah online!

pengguna202729
sumber
1
Bagaimana dengan (ab?) Menggunakan format output lemah dengan ,Nṗæ.ÐḟR?
Jonathan Allan
Atau sebagai alternatif, output ini dikalikan dengan output n.
user202729
The Ndan -Noutput yang saya menyarankan telah diizinkan, sehingga menghemat satu byte :) (hanya perlu menyebutkan format dalam jawaban)
Jonathan Allan
5

Python 2 , 62 byte

f=lambda n,*l:f(n-1,n,*l)+f(n-1,-n,*l)if n else[l]*(sum(l)==0)

Cobalah online!

Tn. Xcoder menyimpan 4 byte dengan penggunaan argumen berbintang yang bagus.

Tidak
sumber
1
62 byte menggunakan *lbukannyal=[]
Mr. Xcoder
3

Perl, 37 36 byte

perl -E 'map eval||say,glob join"{+,-}",0..<>' <<< 7
Ton Hospel
sumber
Bagus sekali. Anda dapat menjatuhkan -ndan <<<jika Anda mengganti $_dengan pop. Sebenarnya tidak meningkatkan skor Anda, tetapi membuat keseluruhan ekspresi lebih pendek;)
Chris
2

05AB1E , 11 byte

®X‚¹ãʒ¹L*O_

Cobalah online!

Format output untuk input misalnya 3adalah:

[[-1, -1, 1], [1, 1, -1]]

Yaitu -1-2+3, 1+2-3,.

Erik the Outgolfer
sumber
2

Sekam , 10 byte

fo¬ΣΠmSe_ḣ

Cobalah online!

Penjelasan

Tidak terlalu rumit.

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]]
Zgarb
sumber
2

Python 3 , 105 byte

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

Cobalah online!

ovs
sumber
1

Swift , 116 byte

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})}

Cobalah online!

Penjelasan

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
}
Herman L.
sumber
1

Python 2 , 91 byte

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]

Cobalah online!

Mengembalikan daftar daftar yang memuaskan (misalnya, f (3) = [[- 1, -2,3], [1,2, -3]])

Chas Brown
sumber
1

Pyth , 13 byte

f!sT.nM*F_BMS

Coba di sini!

Tuan Xcoder
sumber
1

C (gcc) , 171 byte

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);}

Cobalah online! Penggunaan 0untuk 2tanda-tanda negatif dan positif.

Jonathan Frech
sumber
1

Bersih , 79 byte

import StdEnv
$n=[k\\k<-foldr(\i l=[[p:s]\\s<-l,p<-[~i,i]])[[]][1..n]|sum k==0]

Cobalah online!

Suram
sumber
1

Python 3 + numpy, 104 103 byte

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]

Output [-1, 1] sesuai dengan tanda.

pengguna2699
sumber
Anda dapat menghapus spasi sebelum ifuntuk -1 byte
ovs
0

JavaScript (ES6), 69 61 bytes

Saved 8 bytes by getting rid of k, as suggested by @Neil

Prints all solutions with alert().

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

Test cases

Menggunakan console.log () instead of alert() for user-friendliness.

Arnauld
sumber
Apakah Anda perlu k? Sesuatu seperti ini:f=(n,o='')=>n?['+','-'].map(c=>f(n-1,c+n+o)):eval(o)||alert(o)
Neil
@Neil saya benar-benar tidak ... Terima kasih.
Arnauld
0

Retina , 73 byte

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

_+
$.&

Cobalah online! Penjelasan:

.+
*

Konversikan input ke unary.

_
=_$`

Ubah nomornya menjadi daftar =angka -prefixed.

+0`=
-$%"+

Ganti masing-masing =secara bergantian dengan keduanya -dan +, duplikat jumlah baris setiap kali.

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

Hitung jumlah _s setelah -dan s secara terpisah+ s secara terpisah. Ini menjumlahkan angka negatif dan positif.

G`(=.+)\1=

Pertahankan hanya garis-garis di mana -s dan +s dibatalkan.

=.*

Hapus jumlah.

_+
$.&

Konversikan ke desimal.

Neil
sumber
0

Perl 6 , 43 byte

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

Cobalah
Mengembalikan urutan daftar

Diperluas:

{  # 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))

Brad Gilbert b2gills
sumber
0

J , 35 30 byte

-5 byte terima kasih kepada FrownyFrog!

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

Cobalah online!

Asli:

J , 35 byte

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

Bagaimana itu bekerja

Saya mengalikan daftar 1..n dengan semua daftar koefisien yang memungkinkan 1 / -1 dan menemukan yang menambahkan hingga nol.

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

Cobalah online!

Sebagai alternatif saya mencoba kata kerja eksplisit, menggunakan pendekatan produk kartesius dari +/-:

J , 37 byte

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

{(<"1@,.-) menemukan produk-produk kartesius misalnya:

{(<"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│
└───────┴────────┘

Sayang sekali bahwa itu kotak hasilnya, jadi saya menghabiskan beberapa byte untuk menghapus nilai-nilai

Cobalah online!

Galen Ivanov
sumber
@FrownyFrog Terima kasih, saya tidak senang dengan sisi kanan kode saya.
Galen Ivanov