Contagem de soma zero

25

Escreva um programa ou função que, dado que n ≥ 1, retorne o número de soluções para ± 1 ± 2 ± 3 ± ... ± n = 0.

Para n = 6, não há soluções, então a resposta é 0. Para n = 4, existem duas soluções, então a resposta é 2 (as duas soluções são 1 - 2 - 3 + 4 = -1 + 2 + 3 - 4 = 0).

Essa é a sequência OEIS A063865 . Alguns exemplos de entrada / saída são:

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

O menor código em bytes vence.

orlp
fonte
2
Relacionado
Manish Kundu 03/04
1
@ManishKundu Hm, eu diria que isso me parece um possível alvo idiota, apenas incline o "comprimento" no final ou em vez de "filtrar por soma igual a" faça "somar cada um e depois contar" para responder a isso .
Erik the Outgolfer 03/04/19
2
@EriktheOutgolfer Eu não estava ciente desse desafio, mas a resposta para isso pode ser substancialmente diferente, veja a minha, por exemplo.
Orlp 03/04/19
2
@ManishKundu eu acabei de explicar como este desafio é diferente ...
orlp
2
Sim, eu vi aquilo. Embora seja lamentável que você acidentalmente tenha martelado sua própria pergunta, você não deve ser obrigado a votar de que não concorda.
Dennis

Respostas:

10

JavaScript (ES6), 35 bytes

Guardado 1 byte graças a @tsh

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

Experimente online!

Arnauld
fonte
9

Haskell , 42 bytes

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

Experimente online!

Isso é 2 1 byte menor que qualquer função recursiva que eu possa escrever.

H.PWiz
fonte
6

05AB1E , 10 bytes

X®‚sã€ƶO_O

Experimente online!

Explicaçã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
Emigna
fonte
1
+1 para O_O...
Esolanging Fruit
O código .. está me encarando. O que eu faço?
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);}

Porto de Kevin Cruijssen's Java 8 answer .

Experimente online aqui .

Observe que, devido às melhorias sugeridas nos comentários, o código produz um comportamento indefinido a ponto de não funcionar quando compilado com clang.

Graças ao eteno por jogar 3 bytes. Obrigado a Kevin Cruijssen por jogar mais 10 bytes. Agradecimentos a Christoph por jogar outros 2 bytes.

Versão não destruída:

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
fonte
1
Você pode cortar 3 bytes substituindo r?0:1por !r. 42 bytes
etene
2
Parece que você está recebendo informações adicionais aqui para definir o valor inicial de r, o que não é permitido.
Shaggy
1
@ etene Bem avistado, obrigado!
OOBalance
2
@KevinCruijssen melhor ainda o segundo n=não é necessário ou: f(n,r){n=n?f(n-1,r+n)+f(n-1,r-n):!r;}F(n){f(n,0);}.
Christoph
2
@OOBalance o truque é o complemento de dois . Isto significa que, -x = ~x+1e portanto ~x = -x-1.
Christoph
5

05AB1E , 9 8 bytes

Graças a Emigna por salvar um byte!

Código:

LæO·sLO¢

Usa a codificação 05AB1E . Experimente online!

Explicação

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

MATL , 14 13 bytes

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

Obrigado a @ Giuseppe por economizar 1 byte!

Experimente online! Ou verifique todos os casos de teste .

Explicação

Considere n = 3como um exemplo. A pilha é mostrada de cabeça para baixo, ou seja, a mais nova aparece abaixo.

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

Geléia , 8 bytes

ŒPS€ċÆṁ$

Experimente online!

Como 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
fonte
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)

Mais uma submissão divertida, cálculo direto da função geradora.

orlp
fonte
3

Oitava (com pacote de comunicações), 39 bytes

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

Experimente online!

Explicação:

Pegue um intervalo 0 ... n ^ 2-1 e converta-o em binário. Isso fornece uma matriz com todas as combinações de 0 e 1 . Multiplique por 2 e subtraia 1 para obter uma matriz com todas as combinações de -1 e +1 .

Pegue o produto escalar com um intervalo de 1 ... n para obter todas as combinações de ± 1 ± 2 ... ± n . Conte quantos são zero.

Basicamente, a mesma coisa, a mesma contagem de bytes:

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

Python 2 e 3, 50 bytes

Abordagem recursiva como a maioria das respostas:

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

Experimente online

A chamada recursiva dupla leva muitos bytes ... Provavelmente existe uma maneira de simplificá-la.

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

Porto da resposta JavaScript (ES6) de @Arnauld .
-2 bytes graças a @ OlivierGrégoire .

Experimente online.

Explicação:

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

Haskell , 55 bytes

Uma abordagem direta de calcular todas essas somas e verificar quantas são zero.

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

Experimente online!

EDIT: @ H.PWiz tem uma solução mais curta e muito mais elegante usando mapM!

flawr
fonte
3

BaterUtilitários + GNU, 63 bytes

Provavelmente, o Bash pode se sair melhor com funções recursivas, mas não consigo resistir a esse tipo de evalmonstruosidade / escape / expansão:

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

Experimente online!


Atualização: Eu não acho que o bash pode fazer melhor com funções recursivas. É o melhor que posso fazer por 90 pontos . evaldiabos é então.

Trauma Digital
fonte
3

Braquilog , 12 bytes

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

Experimente online!

Explicação

⟦₁               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
fonte
2

Oitava , 42 bytes

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

Experimente online!

Luis Mendo
fonte
Bem, eu acho. :) Não tinha visto isso quando publiquei o meu.
Stewie Griffin
Heh. Eu não tinha visto o seu até agora #
Luis Mendo
2

J , 32 bytes

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

Experimente online!

Certamente há muito espaço para jogar golfe. A expansão seguirá.

Galen Ivanov
fonte
1

Pitão, 14 13 bytes

lf!s.nT*F_BRS

Experimente aqui

Explicação

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.

fonte
1

CJam , 25 bytes

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

Experimente online!

Esta é uma tradução bastante direta da solução 05AB1E da @ emigna. É certamente jogável.

Esolanging Fruit
fonte
1

Stax , 9 bytes

è%é┐╬@₧╠¬

Execute e depure

Uma das respostas mais curtas até agora derrotadas por Jelly.

Eu sinto que verificar explicitamente quais sinais somam a zero não é muito positivo, então, em vez disso, pego o conjunto de potências e verifico quantos conjuntos no conjunto de potências têm a soma da metade do enésimo número triangular. Esse método é, não surpreendentemente, da mesma complexidade de tempo que verifica quais sinais somam zero.

Equivalente ASCII:

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

J , 28 bytes

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

Usa a outra definição do OEIS em que 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.

Experimente online!

Explicação

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

Casca , 9 bytes

#½Σḣ¹mΣṖḣ

Experimente online!

Explicação

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

Gol> <> , 26 bytes

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

Experimente online! ou Execute casos de teste de 1 a 16!

Como 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
fonte