Nullsummenzählung

25

Schreiben Sie ein Programm oder eine Funktion, die bei n ≥ 1 die Anzahl der Lösungen auf ± 1 ± 2 ± 3 ± ... ± n = 0 zurückgibt.

Für n = 6 gibt es keine Lösungen, die Antwort ist 0. Für n = 4 gibt es zwei Lösungen, die Antwort ist 2 (die beiden Lösungen sind 1 - 2 - 3 + 4 = -1 + 2 + 3 - 4 = 0).

Dies ist die OEIS-Sequenz A063865 . Einige Beispiele für Ein- / Ausgänge sind:

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

Kürzester Code in Bytes gewinnt.

orlp
quelle
2
Related
Manish Kundu
1
@ManishKundu Hm, ich würde sagen, das sieht für mich nach einem möglichen betrügerischen Ziel aus. Heften Sie einfach "Länge" am Ende oder anstelle von "Filtern nach Summe gleich" addieren Sie "und zählen Sie dann", um eine Antwort darauf zu geben .
Erik der Outgolfer
2
@EriktheOutgolfer Ich war mir dieser Herausforderung nicht bewusst, aber die Antwort darauf kann erheblich anders sein, siehe meine zum Beispiel.
Orlp
2
@ ManishKundu Ich habe gerade erklärt, wie diese Herausforderung anders ist ...
Orlp
2
Ja, das habe ich gesehen. Obwohl es bedauerlich ist, dass Sie versehentlich Ihre eigene Frage gestellt haben, sollten Sie nicht gezwungen sein, eine Stimme abzugeben, mit der Sie nicht einverstanden sind.
Dennis

Antworten:

9

Haskell , 42 Bytes

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

Probieren Sie es online!

Dies ist 2 1 Byte kürzer als jede rekursive Funktion, die ich schreiben könnte.

H.PWiz
quelle
6

05AB1E , 10 Bytes

X®‚sã€ƶO_O

Probieren Sie es online!

Erläuterung

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
Emigna
quelle
1
+1 für O_O...
Esolanging Fruit
Der Code ... starrt mich an. Was mache ich?
Caird Coinheringaahing
5

C (gcc), 45 62 52 50 Bytes

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

Port von Kevin Cruijssens Java 8- Antwort .

Probieren Sie es hier online aus .

Beachten Sie, dass der Code aufgrund der in den Kommentaren vorgeschlagenen Verbesserungen undefiniertes Verhalten erzeugt, sodass er beim Kompilieren mit Clang nicht mehr funktioniert.

Vielen Dank an Etene für das Golfen mit 3 Bytes. Vielen Dank an Kevin Cruijssen für das Golfen mit 10 weiteren Bytes. Vielen Dank an Christoph für die weiteren 2 Bytes.

Ungolfed-Version:

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
}
OOBalance
quelle
1
Sie könnten 3 Bytes abrasieren durch Ersetzen r?0:1mit !r. 42 Bytes
Etene
2
Anscheinend nehmen Sie hier zusätzliche Eingaben vor, um den Anfangswert von festzulegen r, der nicht zulässig ist.
Shaggy
1
@etene Gut gesehen, danke!
OOBalance
2
@KevinCruijssen besser noch der zweite n=ist nicht erforderlich , entweder: f(n,r){n=n?f(n-1,r+n)+f(n-1,r-n):!r;}F(n){f(n,0);}.
Christoph
2
@OOBalance der Trick ist das Komplement zweier . Dies bedeutet, dass -x = ~x+1und daher ~x = -x-1.
Christoph
5

05AB1E , 9 8 Bytes

Danke an Emigna für das Speichern eines Bytes!

Code:

LæO·sLO¢

Verwendet die 05AB1E- Codierung. Probieren Sie es online!

Erläuterung

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
Adnan
quelle
4

MATL , 14 13 Bytes

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

Vielen Dank an @ Giuseppe für das Speichern von 1 Byte!

Probieren Sie es online! Oder überprüfen Sie alle Testfälle .

Erläuterung

Betrachten Sie n = 3als Beispiel. Der Stapel wird verkehrt herum angezeigt, dh der neueste Stapel wird unten angezeigt.

[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
Luis Mendo
quelle
4

Gelee , 8 Bytes

ŒPS€ċÆṁ$

Probieren Sie es online!

Wie es funktioniert

Œ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.
Dennis
quelle
3

Python 2, 74 Bytes

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)

Mehr Spaß beim Einreichen, direkte Berechnung der generierenden Funktionen.

orlp
quelle
3

Oktave (mit Kommunikationspaket), 39 Byte

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

Probieren Sie es online!

Erläuterung:

Nehmen Sie einen Bereich von 0 ... n ^ 2-1 und wandeln Sie ihn in Binär um. Dies ergibt eine Matrix mit allen Kombinationen von 0 und 1 . Mit 2 multiplizieren und 1 abziehen , um eine Matrix mit allen Kombinationen von -1 und +1 zu erhalten .

Nehmen Sie das Skalarprodukt mit einer Auswahl 1 ... n , um alle Kombinationen von ± 1 ± 2 ... ± n zu erhalten . Zählen Sie, wie viele Null sind.

Grundsätzlich das Gleiche, die gleiche Anzahl von Bytes:

@(n)nnz(~((2*de2bi(0:2^n-1)-1)*(1:n)'))
Stewie Griffin
quelle
3

Python 2 und 3, 50 Bytes

Rekursiver Ansatz wie die meisten Antworten:

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

Probieren Sie es online aus

Der doppelte rekursive Aufruf nimmt zu viele Bytes in Anspruch ... Es gibt wahrscheinlich eine Möglichkeit, ihn zu vereinfachen.

Eten
quelle
3

Java 8, 72 71 70 Bytes

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

Portierung der Antwort von @Arnauld auf JavaScript (ES6) .
-2 Bytes dank @ OlivierGrégoire .

Probieren Sie es online aus.

Erläuterung:

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
Kevin Cruijssen
quelle
3

Haskell , 55 Bytes

Ein einfacher Ansatz, alle diese Summen zu berechnen und zu überprüfen, wie viele Nullen sind.

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

Probieren Sie es online!

EDIT: @H.PWiz hat eine kürzere und wesentlich elegantere Lösung mit mapM!

Fehler
quelle
3

Brachylog , 12 Bytes

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

Probieren Sie es online!

Erläuterung

⟦₁               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
Tödlich
quelle
2

Oktave , 42 Bytes

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

Probieren Sie es online!

Luis Mendo
quelle
Gut, +1 denke ich. :) Hatte das nicht gesehen, als ich meins gepostet habe.
Stewie Griffin
Heh. Ich hatte auch deine noch nicht gesehen
Luis Mendo
2

J , 32 Bytes

1#.0=1#.1+i.*"1[:<:@+:@#:[:i.2^]

Probieren Sie es online!

Es gibt sicherlich viel Platz zum Golfen. Eine Erklärung wird folgen.

Galen Ivanov
quelle
1

Pyth, 14 13 Bytes

lf!s.nT*F_BRS

Probieren Sie es hier aus

Erläuterung

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.

quelle
1

CJam , 25 Bytes

ri,:)_Wf*:a.+:m*:e_1fb0e=

Probieren Sie es online!

Dies ist eine ziemlich direkte Übersetzung von @ emignas 05AB1E-Lösung. Es ist auf jeden Fall golfen.

Esolanging Fruit
quelle
1

Stax , 9 Bytes

è%é┐╬@₧╠¬

Führen Sie es aus und debuggen Sie es

Eine der kürzesten Antworten, die bisher von Jelly besiegt wurden.

Ich bin der Meinung, dass das explizite Überprüfen der Summe der Vorzeichen mit Null nicht sehr schwierig ist. Stattdessen nehme ich den Powerset und überprüfe, wie viele Sätze im Powerset die Summe der Hälfte der n-ten Dreieckszahl haben. Diese Methode ist nicht überraschend zeitaufwändig wie die Überprüfung, welche Vorzeichen sich zu Null addieren.

ASCII-Äquivalent:

RS{|+Hmx|+#
Weijun Zhou
quelle
0

J , 28 Bytes

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

Verwendet die andere Definition von OEIS wo 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.

Probieren Sie es online!

Erläuterung

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

Schale , 9 Bytes

#½Σḣ¹mΣṖḣ

Probieren Sie es online!

Erläuterung

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

Gol> <> , 26 Bytes

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

Probieren Sie es online! oder Testfälle von 1 bis 16 ausführen!

Wie es funktioniert

: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
Bubbler
quelle