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!


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:



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!


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


3

Perl, 37 36 byte

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

Bagus sekali. Anda dapat menjatuhkan -ndan <<<jika Anda mengganti $_dengan pop. Sebenarnya tidak meningkatkan skor Anda, tetapi membuat keseluruhan ekspresi lebih pendek;)
Chris



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


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
}

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




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.



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.


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.


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.


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


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!


@FrownyFrog Terima kasih, saya tidak senang dengan sisi kanan kode saya.
Galen Ivanov
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.