Kiếm số 0 từ số đầu tiên


15

Thử thách

Thách thức là viết một mã lấy số nguyên dương 'n' làm đầu vào và hiển thị tất cả các cách có thể viết các số từ 1 - n, với dấu dương hoặc âm ở giữa, sao cho tổng của chúng là bằng không. Xin nhớ rằng bạn chỉ có thể sử dụng phép cộng hoặc phép trừ.

Ví dụ: nếu đầu vào là 3, thì có 2 cách để tính tổng 0:

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

Lưu ý rằng, các số theo thứ tự, bắt đầu từ 1 đến n (là 3 trong trường hợp này). Vì rõ ràng từ ví dụ, dấu của số đầu tiên cũng có thể âm, vì vậy hãy cẩn thận.

Bây giờ, 3 đã khá đơn giản. Hãy để chúng tôi liệt kê tất cả các cách khi chúng tôi xem xét số 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

Vì vậy, ở đây, chúng tôi đã có tổng cộng 8 cách có thể.


Đầu vào và đầu ra

Như đã nêu trước, đầu vào sẽ là một số nguyên dương . Đầu ra của bạn phải chứa tất cả các cách có thể trong đó các số cho tổng bằng không. Trong trường hợp không có cách nào có thể làm tương tự, bạn có thể xuất bất cứ thứ gì bạn thích.

Ngoài ra, bạn có thể in đầu ra ở bất kỳ định dạng nào bạn muốn . Nhưng, nó nên được hiểu . Ví dụ, bạn có thể in nó như trong ví dụ trên. Hoặc, bạn chỉ có thể in các dấu hiệu của các số theo thứ tự. Mặt khác, bạn cũng có thể in '0' và '1' theo thứ tự, trong đó '0' sẽ hiển thị dấu âm và '1' sẽ hiển thị dấu dương (hoặc ngược lại).

Ví dụ: bạn có thể biểu thị 1 + 2-3 = 0 bằng cách sử dụng:

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

Tuy nhiên, tôi khuyên bạn nên sử dụng bất kỳ định dạng nào trong ba định dạng đầu tiên để đơn giản. Bạn có thể giả sử tất cả các đầu vào là hợp lệ.


Ví dụ

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

Chấm điểm

Đây là , vì vậy đoạn mã ngắn nhất sẽ thắng!


Xin lưu ý rằng đây không phải là bản sao của codegolf.stackexchange.com/questions/8655/ mẹo , bởi vì thử thách này có nghĩa là chỉ lấy n làm đầu vào và sử dụng tất cả các số 1-n theo thứ tự.
Manish Kundu

Chúng tôi có thể đại diện +như N-như -N, hoặc là lấy nó quá xa? (ví dụ 3-> [[-3,-3,3], [3,3,-3]])
Jonathan Allan

@Jonathan ALLan Không được đề cập trong danh sách các định dạng đầu ra? Hay tôi đã giải thích sai câu hỏi của bạn?
Manish Kundu

Tôi có nghĩa là thích 01tùy chọn nhưng sử dụng N-N(xem chỉnh sửa của tôi ở trên)
Jonathan Allan

2
@Jonathan ALLan Có, điều đó chắc chắn được cho phép. Hãy chắc chắn rằng bạn đề cập đến điều đó trong câu trả lời.
Manish Kundu

Câu trả lời:



5

Thạch , 9 byte

1,-ṗ×RSÐḟ

Hãy thử trực tuyến!

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.

Thạch , 9 byte

Jonathan AllanĐề nghị của , đưa ra một danh sách các dấu hiệu.

1,-ṗæ.ÐḟR

Hãy thử trực tuyến!


1
Làm thế nào về (ab?) Bằng cách sử dụng định dạng đầu ra lỏng lẻo với ,Nṗæ.ÐḟR?
Jonathan Allan

Hoặc cách khác, này sản lượng đầu ra nhân n.
dùng202729

Đầu ra N-Nđầu ra mà tôi đề xuất đã được cho phép, để tiết kiệm một byte :) (chỉ cần đề cập đến định dạng trong câu trả lời)
Jonathan Allan


3

Perl, 37 36 byte

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

Hoàn thành tốt Bạn có thể thả -n<<<nếu bạn thay thế $_bằng pop. Nó không thực sự cải thiện điểm số của bạn, nhưng nó làm cho biểu thức tổng thể ngắn hơn;)
Chris



2

Husk , 10 byte

fo¬ΣΠmSe_ḣ

Hãy thử trực tuyến!

Giải trình

Không quá phức tạp.

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

Hãy thử trực tuyến!

Giải trình

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

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

Hãy thử trực tuyến! Sử dụng 0cho tiêu cực và 2cho các dấu hiệu tích cực.



1

Python 3 + gọn gàng, 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]

Đầu ra là [-1, 1] tương ứng với dấu hiệu.


Bạn có thể xóa khoảng if
trắng

0

JavaScript (ES6), 69 61 byte

Đã lưu 8 byte bằng cách loại bỏ k , như được đề xuất bởi @Neil

In tất cả các giải pháp với cảnh báo () .

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

Các trường hợp thử nghiệm

Sử dụng console.log () thay vì alert () để thân thiện với người dùng.


Bạn có cần kkhông Một cái gì đó như thế này:f=(n,o='')=>n?['+','-'].map(c=>f(n-1,c+n+o)):eval(o)||alert(o)
Neil

@Neil Tôi thực sự không ... Cảm ơn.
Arnauld

0

Võng mạc , 73 byte

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

_+
$.&

Hãy thử trực tuyến!Giải trình:

.+
*

Chuyển đổi đầu vào thành unary.

_
=_$`

Chuyển đổi số thành danh sách = số -pixixed.

+0`=
-$%"+

Thay thế =lần lượt bằng cả hai -+ , nhân đôi số dòng mỗi lần.

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

Đếm riêng số _s sau -s và+ s. Điều này tổng hợp các số âm và dương.

G`(=.+)\1=

Chỉ giữ lại những dòng mà -s và +s hủy bỏ.

=.*

Xóa số đếm.

_+
$.&

Chuyển đổi thành số thập phân.


0

Perl 6 , 43 byte

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

Thử nó
Trả về một chuỗi danh sách

Mở rộng:

{  # 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 nhờ FrownyFrog!

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

Hãy thử trực tuyến!

Nguyên:

J , 35 byte

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

Làm thế nào nó hoạt động

Tôi nhân danh sách 1..n với tất cả các danh sách có thể có hệ số 1 / -1 và tìm những danh sách có giá trị bằng 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   

Hãy thử trực tuyến!

Để thay thế, tôi đã thử một động từ rõ ràng, sử dụng cách tiếp cận của sản phẩm cartesian của +/-:

J , 37 byte

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

{(<"1@,.-) tìm các sản phẩm cartesian chẳng hạn:

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

Thật tệ là nó đóng hộp kết quả, vì vậy tôi đã dành một số byte để bỏ hộp các giá trị

Hãy thử trực tuyến!


@FrownyFrog Cảm ơn bạn, tôi không hài lòng với bên phải mã của mình.
Galen Ivanov
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.