Conteo de suma cero

25

Escribir un programa o función que dado n ≥ 1 devuelve el número de soluciones a ± 1 ± 2 ± 3 ± ... ± n = 0.

Para n = 6 no hay soluciones, entonces la respuesta es 0. Para n = 4 hay dos soluciones, entonces la respuesta es 2 (las dos soluciones son 1 - 2 - 3 + 4 = -1 + 2 + 3 - 4 = 0).

Esta es la secuencia OEIS A063865 . Algunos ejemplos de entrada / salida son:

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

El código más corto en bytes gana.

orlp
fuente
2
Relacionado
Manish Kundu
1
@ManishKundu Hm, diría que se parece bastante a un posible objetivo de engaño para mí, simplemente agregue "longitud" al final o en lugar de "filtrar por suma es igual a" hacer "sumar cada uno y luego contar" para responder a esto .
Erik the Outgolfer
2
@EriktheOutgolfer No estaba al tanto de ese desafío, pero la respuesta a esto puede ser sustancialmente diferente, vea la mía, por ejemplo.
orlp
2
@ManishKundu que acabo de explicar cómo este desafío es diferente ...
orlp
2
Si, lo ví. Si bien es lamentable que accidentalmente haya formulado su propia pregunta, no debería verse obligado a emitir un voto con el que no está de acuerdo.
Dennis

Respuestas:

10

JavaScript (ES6), 35 bytes

Guardado 1 byte gracias a @tsh

f=(n,s)=>n--?f(n,n-~s)+f(n,n+~s):!s

Pruébalo en línea!

Arnauld
fuente
9

Haskell , 42 bytes

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

Pruébalo en línea!

Esto es 2 1 byte más corto que cualquier función recursiva que podría escribir.

H.PWiz
fuente
6

05AB1E , 10 bytes

X®‚sã€ƶO_O

Pruébalo en línea!

Explicación

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
fuente
1
+1 para O_O...
Esolanging Fruit
El código ... me está mirando. ¿Qué debo hacer?
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);}

Puerto de la respuesta Java 8 de Kevin Cruijssen .

Pruébelo en línea aquí .

Tenga en cuenta que debido a las mejoras sugeridas en los comentarios, el código produce un comportamiento indefinido hasta el punto de no funcionar cuando se compila con clang.

Gracias a etene por jugar al golf 3 bytes. Gracias a Kevin Cruijssen por jugar 10 bytes más. Gracias a Christoph por jugar al golf otros 2 bytes.

Versión sin golf:

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
fuente
1
Puede reducir 3 bytes reemplazando r?0:1con !r. 42 bytes
etene
2
Parece que está tomando una entrada adicional aquí para establecer el valor inicial de r, que no está permitido.
Shaggy
1
@etene Bien visto, gracias!
OOBalance
2
@KevinCruijssen mejor aún el segundo n=tampoco es necesario: f(n,r){n=n?f(n-1,r+n)+f(n-1,r-n):!r;}F(n){f(n,0);}.
Christoph
2
@OOBalance, el truco es el complemento de dos . Esto significa eso -x = ~x+1y por lo tanto ~x = -x-1.
Christoph
5

05AB1E , 9 8 bytes

¡Gracias a Emigna por guardar un byte!

Código:

LæO·sLO¢

Utiliza el codificación 05AB1E . Pruébalo en línea!

Explicación

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
fuente
4

MATL , 14 13 bytes

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

¡Gracias a @Giuseppe por guardar 1 byte!

Pruébalo en línea! O verificar todos los casos de prueba .

Explicación

Considere n = 3como un ejemplo. La pila se muestra al revés, es decir, la más nueva aparece a continuación.

[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
fuente
4

Jalea , 8 bytes

ŒPS€ċÆṁ$

Pruébalo en línea!

Cómo funciona

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

Más de una presentación divertida, cálculo de la función de generación directa.

orlp
fuente
3

Octava (con paquete de comunicaciones), 39 bytes

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

Pruébalo en línea!

Explicación:

Tome un rango 0 ... n ^ 2-1 y conviértalo a binario. Esto proporciona una matriz con todas las combinaciones de 0 y 1 . Multiplique por 2 y reste 1 para obtener una matriz con todas las combinaciones de -1 y +1 .

Tome el producto punto con un rango de 1 ... n para obtener todas las combinaciones de ± 1 ± 2 ... ± n . Cuenta cuántos son cero.

Básicamente lo mismo, el mismo número de bytes:

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

Python 2 y 3, 50 bytes

Enfoque recursivo como la mayoría de las respuestas:

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

Pruébalo en línea

La llamada recursiva doble toma demasiados bytes ... Probablemente haya una manera de simplificarla.

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

Puerto de la respuesta de JavaScript de @Arnauld (ES6) .
-2 bytes gracias a @ OlivierGrégoire .

Pruébalo en línea.

Explicación:

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
fuente
3

Haskell , 55 bytes

Un enfoque directo de calcular todas esas sumas y verificar cuántas son cero.

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

Pruébalo en línea!

EDITAR: @ ​​H.PWiz tiene una solución más corta y mucho más elegante usando mapM!

falla
fuente
3

Bash + utilidades GNU, 63 bytes

Bash probablemente puede hacerlo mejor que esto con funciones recursivas, pero no puedo resistir este tipo de evalmonstruosidad / escape / expansión:

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

Pruébalo en línea!


Actualización: no creo que bash pueda funcionar mejor con funciones recursivas. Esto es lo mejor que puedo hacer por un puntaje de 90 . evaldiablos es entonces.

Trauma digital
fuente
3

Brachylog , 12 bytes

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

Pruébalo en línea!

Explicación

⟦₁               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
Fatalizar
fuente
2

Octava , 42 bytes

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

Pruébalo en línea!

Luis Mendo
fuente
Bueno, supongo que +1. :) No había visto esto cuando publiqué el mío.
Stewie Griffin
Je Yo tampoco había visto el tuyo hasta ahora
Luis Mendo
2

J , 32 bytes

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

Pruébalo en línea!

Ciertamente hay mucho espacio para jugar al golf. La expansión seguirá.

Galen Ivanov
fuente
1

Pyth, 14 13 bytes

lf!s.nT*F_BRS

Pruébalo aquí

Explicación

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.

fuente
1

CJam , 25 bytes

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

Pruébalo en línea!

Esta es una traducción bastante directa de la solución 05AB1E de @emigna. Ciertamente es golfable.

Fruta Esolanging
fuente
1

Stax , 9 bytes

è%é┐╬@₧╠¬

Ejecutar y depurarlo

Una de las respuestas más cortas hasta ahora. derrotada por Jelly.

Siento que verificar explícitamente qué signos suman cero no es muy complejo, por lo que tomo el conjunto de potencia y compruebo cuántos conjuntos del conjunto de potencia tienen la suma de la mitad del enésimo número triangular. Este método es, no sorprendentemente, de la misma complejidad de tiempo que verificar qué signos suman cero.

ASCII equivalente:

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

J , 28 bytes

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

Utiliza la otra definición de OEIS where 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.

Pruébalo en línea!

Explicación

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

Casco , 9 bytes

#½Σḣ¹mΣṖḣ

Pruébalo en línea!

Explicación

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

Gol> <> , 26 bytes

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

Pruébalo en línea! o ¡ Ejecute casos de prueba del 1 al 16!

Cómo funciona

: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
fuente