การนับศูนย์รวม


25

เขียนโปรแกรมหรือฟังก์ชั่นที่ให้n ≥ 1ส่งคืนจำนวนโซลูชันเป็น± 1 ± 2 ± 3 ± ... ± n = 0

สำหรับ n = 6 ไม่มีวิธีแก้ปัญหาดังนั้นคำตอบคือ 0 สำหรับ n = 4 มีสองวิธีดังนั้นคำตอบคือ 2 (ทั้งสองคำตอบคือ 1 - 2 - 3 + 4 = -1 + 2 + 3 - 4 = 0)

นี่คือ OEIS ลำดับA063865 ตัวอย่างอินพุต / เอาท์พุต ได้แก่ :

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

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ



1
@ManishKundu หืมมมฉันบอกได้เลยว่ามันดูเหมือนเป้าหมายล่อลวงที่เป็นไปได้สำหรับฉันเพียงแค่ "ยาว" ที่ท้ายหรือแทนที่จะ "กรองโดยผลรวมเท่ากับ" ทำ "ผลรวมแต่ละครั้งแล้วนับ" เพื่อให้คำตอบสำหรับสิ่งนี้ .
Erik the Outgolfer

2
@EriktheOutgolfer ฉันไม่ได้ตระหนักถึงความท้าทายนั้น แต่คำตอบสำหรับสิ่งนี้อาจแตกต่างกันอย่างมากดูตัวอย่างของฉัน
orlp

2
@ManishKundu ฉันเพียงแค่อธิบายว่าความท้าทายนี้จะแตกต่างกัน ...
orlp

2
ใช่ฉันเห็นแล้ว ในขณะที่โชคร้ายที่คุณใช้คำถามของตัวเองโดยบังเอิญแต่คุณไม่ควรถูกบังคับให้โหวตโดยไม่เห็นด้วย
เดนนิส

คำตอบ:





6

05AB1E , 10 ไบต์

X®‚sã€ƶO_O

ลองออนไลน์!

คำอธิบาย

X®‚          # push [1,-1]
   sã        # cartesian product with input
     €ƶ      # multiply each element in each list with its 1-based index
       O     # sum each list
        _    # logical negation of each sum
         O   # sum

1
+1 สำหรับO_O...
แยกผลไม้

รหัส .. มันจ้องมาที่ฉัน ฉันจะทำอย่างไร
caird coinheringaahing

5

C (gcc), 45 62 52 50 ไบต์

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

ท่าเรือเควิน Cruijssen ของ Java 8 คำตอบ

ลองออนไลน์ได้ที่นี่

โปรดทราบว่าเนื่องจากการปรับปรุงที่แนะนำในการแสดงความคิดเห็นรหัสก่อให้เกิดพฤติกรรมที่ไม่ได้กำหนดไปยังจุดที่ไม่ทำงานเมื่อรวบรวมด้วยเสียงดังกราว

ขอบคุณeteneสำหรับการเล่นกอล์ฟ 3 ไบต์ ขอบคุณKevin Cruijssenสำหรับการเล่นกอล์ฟอีก 10 ไบต์ ขอบคุณChristophสำหรับการเล่นกอล์ฟอีก 2 ไบต์

เวอร์ชันที่ไม่ถูกปรับแต่ง:

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
คุณสามารถโกน 3 ไบต์โดยการแทนที่ด้วยr?0:1 42 bytes!r
etene

2
ดูเหมือนว่าคุณกำลังป้อนข้อมูลเพิ่มเติมที่นี่เพื่อตั้งค่าเริ่มต้นrซึ่งไม่ได้รับอนุญาต
ขนปุย

1
@etene เห็นดีขอบคุณ!
OOBalance

2
@KevinCruijssen ดีขึ้น แต่ข้อที่สองn=ก็ไม่จำเป็นเช่นกัน: f(n,r){n=n?f(n-1,r+n)+f(n-1,r-n):!r;}F(n){f(n,0);}.
Christoph

2
@OOBalance เคล็ดลับเป็นส่วนประกอบสองอย่าง ซึ่งหมายความว่าและดังนั้นจึง-x = ~x+1 ~x = -x-1
Christoph

5

05AB1E , 9 8 ไบต์

ขอบคุณEmigna ที่บันทึกไบต์!

รหัส:

LæO·sLO¢

ใช้การเข้ารหัส05AB1E ลองออนไลน์!

คำอธิบาย

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 ไบต์

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

ขอบคุณ@Giuseppeสำหรับการบันทึก 1 ไบต์!

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย

พิจารณาn = 3เป็นตัวอย่าง สแต็กแสดงกลับหัวนั่นคือใหม่ล่าสุดจะปรากฏด้านล่าง

[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


3

Python 2, 74 ไบต์

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)

สนุกยิ่งกว่าการส่งการคำนวณฟังก์ชั่นโดยตรง


3

ระดับแปดเสียง (ด้วยแพ็คเกจการสื่อสาร), 39 ไบต์

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

ลองออนไลน์!

คำอธิบาย:

ใช้ช่วง0 ... n ^ 2-1และแปลงเป็นเลขฐานสอง นี้จะช่วยให้เมทริกซ์กับชุดทั้งหมดของ0และ1 คูณด้วย2และลบ1ที่จะได้รับเมทริกซ์กับชุดทั้งหมดของ-1และ+1

ใช้จุดผลิตภัณฑ์ที่มีช่วง1 ... nจะได้รับรวมกันทั้งหมดของ± 1 ± 2 ... ± n นับจำนวนศูนย์

โดยพื้นฐานแล้วสิ่งเดียวกันจำนวนไบต์เดียวกัน:

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


3

Python 2 และ 3, 50 ไบต์

วิธีแบบเรียกซ้ำเหมือนคำตอบส่วนใหญ่:

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

ลองออนไลน์

การเรียกซ้ำสองครั้งใช้เวลามากเกินไปไบต์ ... อาจเป็นวิธีที่ทำให้มันง่ายขึ้น


3

Java 8, 72 71 70 ไบต์

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

ท่าเรือ@Arnauld JavaScript (ES6) คำตอบของ
-2 ไบต์ขอบคุณที่@ OlivierGrégoire

ลองออนไลน์

คำอธิบาย:

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 ไบต์

แนวทางที่ตรงไปตรงมาของการคำนวณผลรวมทั้งหมดและตรวจสอบว่ามีค่าเป็นศูนย์จำนวนเท่าใด

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

ลองออนไลน์!

แก้ไข: @ H.PWiz มีวิธีการแก้ปัญหาที่สั้นและสง่างามมากขึ้นโดยใช้mapM!


3

ยูทิลิตีBash + GNU ขนาด 63 ไบต์

ทุบตีอาจทำได้ดีกว่านี้ด้วยฟังก์ชั่นวนซ้ำ แต่ฉันไม่สามารถต้านทานeval/ monstrosity / escape / expansion ประเภทนี้ได้:

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

ลองออนไลน์!


อัปเดต: ฉันไม่คิดว่า bash สามารถทำได้ดีกว่าด้วยฟังก์ชั่นวนซ้ำ นี่คือสิ่งที่ดีที่สุดที่ฉันสามารถทำคะแนน 90 evalมันเป็นนรกแล้ว










1

Pyth, 14 13 ไบต์

lf!s.nT*F_BRS

ลองที่นี่

คำอธิบาย

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 ไบต์

è%é┐╬@₧╠¬

เรียกใช้และแก้ไขข้อบกพร่อง

หนึ่งในคำตอบที่สั้นที่สุดที่ แพ้โดย Jelly

ฉันรู้สึกว่าการตรวจสอบอย่างชัดเจนว่าสัญญาณที่รวมเป็นศูนย์นั้นไม่ค่อยเล่นกอล์ฟดังนั้นฉันจึงใช้พาวเวอร์เซตและตรวจสอบว่าเซตในเซตพาวเวอร์จำนวนเท่าใดมีผลรวมของเลขสามเหลี่ยมครึ่งที่ n วิธีนี้ไม่น่าแปลกใจที่มีความซับซ้อนในเวลาเดียวกันกับการตรวจสอบว่าสัญญาณรวมเป็นศูนย์

ASCII เทียบเท่า:

RS{|+Hmx|+#

0

Pyth , 10 ไบต์

/mysdySQsS

ลองออนไลน์ อีกวิธีหนึ่งคือการตรวจสอบกรณีทดสอบทั้งหมดในครั้งเดียว

ชี้แจง:

/mysdySQsS    Implicit: Q=input()
      SQ      Generate range [1...Q]
     y        Generate powerset of above
 m            Map d in the above over...
  ysd         ... double the sum of d
        sS    Sum of range [1...Q] (final Q is implicit)
/             Count the matches (implicit output)

0

J , 28 ไบต์

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

ใช้ความหมายอื่น ๆ จาก OEIS 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ที่

ลองออนไลน์!

คำอธิบาย

(*>:){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

Gol> <> , 26 ไบต์

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

ลองออนไลน์! หรือเรียกใช้กรณีทดสอบจาก 1 ถึง 16!

มันทำงานอย่างไร

: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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.