Sıfır toplamı sayma


25

N ≥ 1 verilen bir program veya fonksiyon yazın , çözüm sayısını ± 1 ± 2 ± 3 ± ... ± n = 0 olarak döndürün.

N = 6 için çözüm yoktur, bu yüzden cevap 0'dır. N = 4 için iki çözüm var, bu yüzden cevap 2 (iki çözüm 1 - 2 - 3 + 4 = -1 + 2 + 3 - 4 = 0).

Bu, OEIS dizisi A063865'tir . Bazı örnek giriş / çıkışlar:

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

Bayt cinsinden en kısa kod kazanır.



1
@ManishKundu Hm, bana muhtemel bir dupe hedefi gibi gözüktüğünü söyleyebilirim, sadece sonunda "uzunluk" ile uğraşmak yerine veya "toplama göre filtrelemek yerine" her birine göre toplamı yap sonra "cevap" .
Outgolfer Erik,

2
@EriktheOutgolfer Bu zorluğun farkında değildim, ancak bunun cevabı oldukça farklı olabilir, örneğin benimkine bakın.
orlp

2
@ManishKundu Ben sadece bu zorluğun nasıl farklı olduğunu açıkladım ...
orlp

2
Evet onu gördüm. Yanlışlıkla kendi sorunuzu kırmanız talihsiz olsa da , aynı fikirde olmadığınız bir oy kullanmak zorunda kalmamanız gerekir.
Dennis,

Yanıtlar:






5

C (gcc), 45 62 52 50 bayt

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

Kevin Cruijssen'in Java 8 cevabı limanı .

Burada çevrimiçi deneyin .

Yorumlarda önerilen gelişmeler nedeniyle, kodun, clang ile derlendiğinde çalışmadığı noktaya tanımsız davranışlar ürettiğini unutmayın.

3 byte golf oynadığı için teşekkürler etene . Kevin Cruijssen'e 10 bayt daha golf attığı için teşekkürler . Christoph'a 2 baytlık golf oynadığı için teşekkürler .

Ungolfed versiyonu:

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
Sen değiştirerek 3 bayt traş olabilir r?0:1ile !r. 42 bayt
etene

2
rİzin verilmeyen başlangıç ​​değerini ayarlamak için buraya ek girdi alıyorsunuz gibi görünüyor .
Shaggy,

1
@ Etene İyi benekli, teşekkür ederim!
OOBalance

2
Daha iyi @KevinCruijssen henüz ikinci n=ya gerekli değildir: f(n,r){n=n?f(n-1,r+n)+f(n-1,r-n):!r;}F(n){f(n,0);}.
Christoph

2
@OOBalance hile ikisinin tamamlayıcısıdır . Bu, demek ki -x = ~x+1bu nedenle ~x = -x-1.
Christoph

5

05AB1E , 9 8 bayt

Emigna'ya teşekkürlerBir bayt kaydettiğiniz için !

Kod:

LæO·sLO¢

05AB1E kodlamasını kullanır . Çevrimiçi deneyin!

açıklama

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 bayt

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

1 byte tasarrufu için @Giuseppe'e teşekkürler !

Çevrimiçi deneyin! Veya tüm test durumlarını doğrulayın .

açıklama

n = 3Örnek olarak düşünün . Yığın baş aşağı gösterilir, yani en yeni aşağıda görünür.

[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

Jöle , 8 bayt

ŒPS€ċÆṁ$

Çevrimiçi deneyin!

Nasıl çalışır

Œ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 bayt

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)

Daha eğlenceli bir sunum, doğrudan üreten fonksiyon hesaplaması.


3

Octave (İletişim Paketi ile), 39 bayt

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

Çevrimiçi deneyin!

Açıklama:

0 ... n ^ 2-1 aralığını alın ve ikiliye dönüştürün. Bu, 0 ve 1'in tüm kombinasyonlarını içeren bir matris verir . -1 ile +1 arasındaki tüm kombinasyonları içeren bir matris elde etmek için 2 ile çarpın ve 1'i çıkarın .

Tüm ± 1 ± 2 ... ± n kombinasyonlarını elde etmek için nokta ürününü 1 ... n aralığında alın . Kaç tane sıfır olduğunu say.

Temelde aynı şey, aynı byte sayısı:

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


3

Python 2 ve 3, 50 bayt

Cevapların çoğu gibi özyinelemeli yaklaşım:

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

Çevrimiçi deneyin

Çift özyinelemeli çağrı çok fazla bayt alır ... Büyük olasılıkla basitleştirmek için bir yol var.


3

Java 8, 72 71 70 bayt

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

Port @Arnauld 'ın JavaScript (ES6) cevap . @ OlivierGrégoire
sayesinde -2 bayt .

Çevrimiçi deneyin.

Açıklama:

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 bayt

Tüm bu toplamları hesaplamanın ve kaç tanesinin sıfır olduğunu kontrol etmenin basit bir yaklaşımı.

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

Çevrimiçi deneyin!

EDIT: @ H.PWiz kullanarak daha kısa ve daha zarif bir çözüme sahiptir mapM!


3

Bash + GNU yardımcı programları, 63 bayt

Bash, özyinelemeli işlevlerle muhtemelen bundan daha iyisini yapabilir, ancak bu tür eval/ kaçış / genişleme canavarlığına karşı koyamam:

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

Çevrimiçi deneyin!


Güncelleme: Özyinelemeli fonksiyonlarla bash'ın daha iyisini yapabileceğini sanmıyorum. 90 puan için yapabileceğim en iyisi bu . evalcehennem o zaman.


3

Brachylog , 12 bayt

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

Çevrimiçi deneyin!

açıklama

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

Pyth, 14 13 bayt

lf!s.nT*F_BRS

Burada dene

açıklama

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 bayt

è%é┐╬@₧╠¬

Koş ve hata ayıkla

Şimdiye kadarki en kısa cevaplardan biri Jelly tarafından mağlup edilen .

Açıkça sıfıra hangi işaretlerin sıfıra işaretlendiğini kontrol etmenin çok golf sahası olmadığını hissediyorum, bunun yerine güç setini alıyorum ve güç setindeki kaç setin, üçgen sayısının yarısının toplamına sahip olduğunu kontrol ediyorum. Bu yöntem, şaşırtıcı olmayan bir şekilde, hangi işaretlerin sıfıra toplandığını kontrol etmekle aynı zaman karmaşıklığıdır.

ASCII eşdeğeri:

RS{|+Hmx|+#


0

J , 28 bayt

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

OEIS'in diğer tanımlarını kullanır 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.

Çevrimiçi deneyin!

açıklama

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

Kabuğu , 9 bayt

#½Σḣ¹mΣṖḣ

Çevrimiçi deneyin!

açıklama

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

0

Gol> <> , 26 bayt

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

Çevrimiçi deneyin! veya Test durumlarını 1'den 16'ya kadar çalıştırın!

Nasıl çalışır

: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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.