Không tính tổng


25

Viết chương trình hoặc hàm đã cho n 1 trả về số lượng giải pháp cho ± 1 ± 2 ± 3 ± ... ± n = 0.

Với n = 6 không có giải pháp, vì vậy câu trả lời là 0. Với n = 4 có hai giải pháp, vì vậy câu trả lời là 2 (hai giải pháp là 1 - 2 - 3 + 4 = -1 + 2 + 3 - 4 = 0).

Đây là trình tự OEIS A063865 . Một số ví dụ đầu vào / xuất là:

n       a(n)
1       0
2       0
3       2
4       2
5       0
6       0
7       8
8       14
9       0
10      0
11      70
12      124
13      0
14      0
15      722
16      1314

Mã ngắn nhất trong byte thắng.



1
@M biếnKundu .
Erik the Outgolfer

2
@EriktheOutgolfer Tôi không biết về thách thức đó, nhưng câu trả lời cho vấn đề này có thể khác biệt đáng kể, xem ví dụ của tôi.
orlp

2
@M BiếnKundu Tôi vừa giải thích thử thách này khác nhau như thế nào ...
orlp

2
Có tôi đã thấy. Mặc dù thật không may là bạn vô tình làm hỏng câu hỏi của chính mình, nhưng bạn không nên buộc phải bỏ phiếu mà bạn không đồng ý.
Dennis

Câu trả lời:






5

C (gcc), 45 62 52 50 byte

f(n,r){n=n?f(n-1,r+n)+f(n-1,r-n):!r;}F(n){f(n,0);}

Câu trả lời Java 8 của cảng Kevin Cruijssen .

Hãy thử trực tuyến tại đây .

Lưu ý rằng do các cải tiến được đề xuất trong các nhận xét, mã tạo ra hành vi không xác định đến mức không hoạt động khi được biên dịch bằng tiếng kêu.

Cảm ơn etene đã chơi golf 3 byte. Cảm ơn Kevin Cruijssen vì đã chơi golf thêm 10 byte. Cảm ơn Christoph đã chơi golf thêm 2 byte.

Phiên bản bị đánh cắp:

f(n, r) { // recursive function - return type and parameter type are omitted, they default to int
    n = // instead of returning, we set n - dirty trick
        n ? // if n is not 0, recurse
        f(n-1,r+n) // +n
       +f(n-1,r-n) // -n
        !r; // else if r != 0 return 0 else return 1
}
F(n) { // function to start the recursion; again implicitly int(int)
    n = f(n, 0); // call the recursive function; this time we simply don't return
}

1
Bạn có thể tắt 3 byte bằng cách thay thế r?0:1bằng !r. 42 byte
etene

2
Có vẻ như bạn đang sử dụng đầu vào bổ sung ở đây để đặt giá trị ban đầu r, không được phép.
Shaggy

1
@etene Phát hiện tốt, cảm ơn bạn!
OOBalance

2
@KevinCruijssen tốt hơn nhưng điều thứ hai n=cũng không cần thiết : f(n,r){n=n?f(n-1,r+n)+f(n-1,r-n):!r;}F(n){f(n,0);}.
Christoph

2
@OOBalance lừa là hai bổ sung . Điều này có nghĩa là -x = ~x+1và do đó ~x = -x-1.
Christoph

5

05AB1E , 9 8 byte

Cảm ơn Emigna vì đã tiết kiệm một byte!

Mã số:

LæO·sLO¢

Sử dụng mã hóa 05AB1E . Hãy thử trực tuyến!

Giải trình

L           # Create the list [1, 2, .., input]
 æ          # Compute the powerset of this list
  O         # Sum each list
   ·        # Double each element
    sLO     # Compute the sum of [1, 2, .., input]
       ¢    # Count the number of occurrences

4

MATL , 14 13 byte

[la]Z^G:!Y*~s

Cảm ơn @Giuseppe vì đã tiết kiệm 1 byte!

Hãy thử trực tuyến! Hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình

Hãy xem xét n = 3như một ví dụ. Ngăn xếp được hiển thị lộn ngược, nghĩa là, mới nhất xuất hiện bên dưới.

[la]   % Push array [1 -1]
       % STACK: [1 -1]
Z^     % Cartesian power with inplicit input n
       % STACK: [ 1  1  1
                  1  1 -1
                  1 -1  1
                  1 -1 -1
                 -1  1  1
                 -1  1 -1
                 -1 -1  1
                 -1 -1 -1]
G:     % Push n, range: gives [1 2 ... n]
       % STACK: [ 1  1  1
                  1  1 -1
                  1 -1  1
                  1 -1 -1
                 -1  1  1
                 -1  1 -1
                 -1 -1  1
                 -1 -1 -1],
                 [1  2  3]
!      % Transpose
       % STACK: [ 1  1  1
                  1  1 -1
                  1 -1  1
                  1 -1 -1
                 -1  1  1
                 -1  1 -1
                 -1 -1  1
                 -1 -1 -1],
                 [1
                  2
                  3]
Y*     % Matrix multiplication
       % STACK: [6
                 0
                 2
                -4
                 4
                -2
                 0
                -6]
~      % Logical negation
       % STACK: [0
                 1
                 0
                 0
                 0
                 0
                 1
                 0]
s      % Sum of vector. Implicit display
       % STACK: 2

4

Thạch , 8 byte

ŒPS€ċÆṁ$

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

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

ŒPS€ċÆṁ$  Main link. Argument: n

ŒP        Take the powerset of [1, ..., n].
  S€      Take the sum of each subset.
       $  Combine the two links to the left into a monadic chain.
     Æṁ       Compute the median of the sums, i.e, (1 + ... + n)/2.
    ċ         Count the occurrences of the median.

3

Python 2, 74 byte

def f(n):l=k=1;exec"l+=l<<n*k;k+=1;"*n;return(l>>n*n*-~n/4)%2**n*(~-n%4>1)

Thêm một đệ trình thú vị, tính toán chức năng tạo trực tiếp.


3

Octave (với Gói Truyền thông), 39 byte

@(n)sum((2*de2bi(0:2^n-1)-1)*(1:n)'==0)

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

Giải trình:

Lấy một phạm vi 0 ... n ^ 2-1 và chuyển đổi nó thành nhị phân. Điều này đưa ra một ma trận với tất cả các kết hợp 01 . Nhân với 2 và trừ 1 để có ma trận với tất cả các kết hợp -1+1 .

Lấy sản phẩm chấm có phạm vi 1 ... n để có được tất cả các kết hợp ± 1 ± 2 ... ± n . Đếm số lượng bằng không.

Về cơ bản cùng một điều, cùng một số byte:

@(n)nnz(~((2*de2bi(0:2^n-1)-1)*(1:n)'))


3

Python 2 và 3, 50 byte

Phương pháp đệ quy như hầu hết các câu trả lời:

f=lambda n,r=0:f(n-1,r+n)+f(n-1,r-n)if n else r==0

Dùng thử trực tuyến

Cuộc gọi đệ quy kép mất quá nhiều byte ... Có lẽ có một cách để đơn giản hóa nó.


3

Java 8, 72 71 70 byte

n->f(0,n)int f(int r,int n){return n>0?f(r+n,--n)+f(r+~n,n):r==0?1:0;}

Cảng @Arnauld JavaScript (ES6) câu trả lời 's .
-2 byte nhờ @ OlivierGrégoire .

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

Giải trình:

n->                 // Method with integer parameter and integer return-type
  f(0,n)            //  Call the recursive method with 0 and this parameter

int f(int r,int n){ // Recursive method with integer as both two parameters and return-type
  return n>0?       //  If `n` is not 0 yet:
    f(r+n,--n)      //   Recursive call with `r+n` (and `n` lowered by 1 first with `--n`)
    +f(r+~n,n)      //   + Recursive call with `r-n` (and `n` also lowered by 1)
   :r==0?           //  Else-if `r` is 0
     1              //   Return 1
    :               //  Else:
     0;}            //   Return 0

3

Haskell , 55 byte

Một cách tiếp cận đơn giản về tính toán tất cả các khoản tiền đó và kiểm tra xem có bao nhiêu số không.

f 0=[0]
f n=[(n+),(n-)]>>=(<$>f(n-1))
g x=sum[1|0<-f x]

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

EDIT: @ H.PWiz có một giải pháp ngắn gọn và thanh lịch hơn bằng cách sử dụng mapM!


3

Tiện ích Bash + GNU, 63 byte

Bash có thể có thể làm tốt hơn thế này với các hàm đệ quy, nhưng tôi không thể cưỡng lại loại evalquái vật / thoát / mở rộng này:

p=eval\ printf\ %s
$p\\\\n \$[$($p \\\{+,-}{1..$1})]|grep -c ^0

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


Cập nhật: Tôi không nghĩ bash có thể làm tốt hơn với các hàm đệ quy. Đây là điều tốt nhất tôi có thể làm cho số điểm 90 . evalchết tiệt rồi


3

Brachylog , 12 byte

⟦₁{{ṅ|}ᵐ+0}ᶜ

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

Giải trình

⟦₁               The range [1, …, Input]
  {       }ᶜ     Count the number of times the following predicate succeeds on that range:
   {  }ᵐ           Map for each element of the range:
    ṅ                Negate
     |               Or do nothing
        +0         The sum of the elements after the map is 0








1

Bình thường, 14 13 byte

lf!s.nT*F_BRS

Hãy thử nó ở đây

Giải trình

lf!s.nT*F_BRS
            SQ  Take the list [1, ..., <implicit input>].
         _BR    Get the pairs [[1, -1], [2, -2], ...].
       *F       Take the Cartesian product.
 f!s.nT         Find the ones where the flattened sum is 0.
l               Take the length.


1

Stax , 9 byte

è%é┐╬@₧╠¬

Chạy và gỡ lỗi nó

Một trong những câu trả lời ngắn nhất cho đến nay đã bị Jelly đánh bại.

Tôi cảm thấy việc kiểm tra một cách rõ ràng những dấu hiệu nào bằng 0 không phải là rất golf, vì vậy thay vào đó tôi lấy bộ điều khiển và kiểm tra xem có bao nhiêu bộ trong tập hợp có tổng bằng một nửa số tam giác thứ n. Phương pháp này, không đáng ngạc nhiên, có độ phức tạp cùng thời gian với việc kiểm tra dấu hiệu nào bằng 0.

Tương đương ASCII:

RS{|+Hmx|+#


0

J , 28 byte

(*>:){1j3#1+//.@(*/)/@,.=@i.

Sử dụng định nghĩa khác từ OEIS ở đâu a(n) = coefficient of x^(n(n+1)/4) in Product_{k=1..n} (1+x^k) if n = 0 or 3 mod 4 else a(n) = 0.

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

Giải trình

(*>:){1j3#1+//.@(*/)/@,.=@i.  Input: n
                          i.  Range [0, n)
                        =     Self-Classify. Forms an identity matrix of order n
          1           ,.      Stitch. Prepend 1 to each row
                    /         Reduce using
                                Convolution
                 */               Product table
           +//.                   Sum along anti-diagonals
      1j3#                    Copy each once, padding with 3 zeroes after
     {                        Index at n*(n+1)
  >:                            Increment n
 *                              Times n

0

Husk , 9 byte

#½Σḣ¹mΣṖḣ

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

Giải trình

#½Σḣ¹mΣṖḣ  Implicit input
        ḣ  [1..input]
       Ṗ   Powerset
     mΣ    Sum each list
#          Count occurrence of
   ḣ¹        [1..input]
 ½Σ          Half of sum

0

Gol> <> , 26 byte

:IFPlMF2K+}:@-}||0lMF$z+|h

Hãy thử trực tuyến! hoặc Chạy các trường hợp thử nghiệm từ 1 đến 16!

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

:IFPlMF2K+}:@-}||0lMF$z+|h

Main outer loop
:IFPlMF ...... ||
:        Duplicate top; effectively generate two explicit zeroes
         Top is the loop counter `i`;
         the rest is the generated 2**i sums
 I       Take input as number
  F ........... |  Pop n and loop n times
   P     i++
    lM   Push stack length - 1, which is 2**(i-1)
      F ...... |   Loop 2**(i-1) times

Main inner loop: generate +i and -i from 2**(i-1) previous sums
2K+}:@-}
          Stack: [... x i]
2K        [... x i x i]    Copy top two
  +}      [x+i ... x i]    Add top two and move to the bottom
    :@    [x+i ... i i x]  Duplicate top and rotate top 3
      -}  [i-x x+i ... i]  Subtract and move to the bottom

Counting zeroes
0lMF$z+|h
0lM        Push zero (zero count) and 2**n (loop count)
   F...|   Loop 2**n times
    $z+    Swap top two; Take logical not; add to the count
        h  Print top as number and halt
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.