Üçlü Eşitlik


11

Alındığı kaynak: OEIS- A071816

Göreviniz, üst sınırı verildiğinde n, denklemi karşılayan çözümlerin sayısını bulmaktır:

a+b+c = x+y+z, where 0 <= a,b,c,x,y,z < n

Sekans, OEIS sayfasında açıklandığı gibi ve aşağıdaki gibi başlar (1 dizinli):

1, 20, 141, 580, 1751, 4332, 9331, 18152, 32661, 55252, 88913, 137292, 204763, 296492, 418503, 577744, 782153, 1040724, 1363573, 1762004, 2248575, 2837164, 3543035, 4382904, 5375005, 6539156, 7896825, 9471196, 11287235, 13371756

Çünkü n = 1tek bir çözüm var:(0,0,0,0,0,0)

İçin n = 2, 20 sıralı çözüm vardır (a,b,c,x,y,z)için a+b+c = x+y+z:

(0,0,0,0,0,0), (0,0,1,0,0,1), (0,0,1,0,1,0), (0,0,1,1,0,0), (0,1,0,0,0,1), 
(0,1,0,0,1,0), (0,1,0,1,0,0), (0,1,1,0,1,1), (0,1,1,1,0,1), (0,1,1,1,1,0), 
(1,0,0,0,0,1), (1,0,0,0,1,0), (1,0,0,1,0,0), (1,0,1,0,1,1), (1,0,1,1,0,1), 
(1,0,1,1,1,0), (1,1,0,0,1,1), (1,1,0,1,0,1), (1,1,0,1,1,0), (1,1,1,1,1,1).

I & O

  • Giriş, tek bir tam sayıdır n.
  • Çıktı, yukarıdaki fonksiyonun f(n)bulunduğu tek bir tamsayı / dize ifade eder f(...).
  • Endeksleme aynen tarif edildiği gibidir, başka endeksleme kabul edilemez.

Bu , en düşük bayt sayısı kazanır.


Ahhh crappp, OEIS'in doğrudan formülünü fark etmedim, bunun o kadar kolay olmayacağını düşündüm . Oh, bu denklemin direkt portlarını + 1'lemiyorum; P.
Sihirli Ahtapot Urn

1
En azından formül mükemmel bir şekilde golf oynamadı: P
fəˈnɛtɪk

Daha sonra, reg-langs'e eso-langs'e karşı bir şans verir.
Sihirli Ahtapot Urn

Başlık "eşitlik üçüze gelir" ise daha iyi olur mu?
Leaky Nun

Yanıtlar:


11

Jöle , 9 6 bayt

ṗ6ḅ-ċ0

O (n 6 ) çözeltisi.

Çevrimiçi deneyin!

Nasıl çalışır

ṗ6ḅ-ċ0  Main link. Argument: n

ṗ6      Cartesian power 6; build all 6-tuples (a, x, b, y, c, z) of integers in
        [1, ..., n]. The challenge spec mentions [0, ..., n-1], but since there
        are three summands on each side, this doesn't matter.
  ḅ-    Unbase -1; convert each tuple from base -1 to integer, mapping (a, ..., z)
        to a(-1)**5 + x(-1)**4 + b(-1)**3 + y(-1)**2 + c(-1)**1 + z(-1)**0, i.e.,
        to -a + x - b + y - c + z = (x + y + z) - (a + b + c). This yields 0 if and
        only if the 6-tuple is a match.
    ċ0  Count the number of zeroes.

Ha! Teorik cevapları sevmeliyim (teorik bir cevabın temeli şimdi n büyük değerleri için TIO'da çalışıyor mu , muhtemelen kötüdür). Bir şey görmeyi umuyordum O(n^6): P.
Sihirli Ahtapot Urn

9

Mathematica 17 veya 76 Bayt

Formülü kullanarak:

.55#^5+#^3/4+#/5&

(@GregMartin ve @ngenisis başına 3 bayt kaydedildi)

Formülü kullanmak yerine, burada kelimenin tam anlamıyla tüm çözümleri hesaplayıp sayıyorum.

Length@Solve[a+b+c==x+y+z&&And@@Table[(0<=i<#),{i,{a,b,c,x,y,z}}],Integers]&

2
Kaba kuvvet dışı yolu gönderdiğiniz için teşekkür ederiz :). Denklem veya yerleşik olmayan herhangi bir matematik yanıtı için +1.
Sihirli Ahtapot Urn

Gereğince bu cevap , sen yerini alabilecek 11/20tarafından .55iki bayt tasarrufu için.
Greg Martin

Ayrıca ilk dönemde yıldız işaretine de ihtiyacınız yoktur.
ngenisis

8

Haskell , 48 bayt

Bunu yazmadan önce formülü fark etmedim, bu yüzden kesinlikle en kısa (veya en hızlı) genel yöntem değil, ama güzel olduğunu düşündüm.

f n=sum[1|0<-foldr1(-)<$>pure[1..n]`mapM`[1..6]]

Çevrimiçi deneyin!

f n6 öğeden oluşan tüm listeleri oluşturur [1..n], sonra alternatif toplamı 0 olanları sayar. a+b+c==d+e+fAynı olan gerçeği kullanır a-(d-(b-(e-(c-f))))==0ve ayrıca tüm sayılara 1 eklememiz önemli değildir.


Sık sık en kısa cevabın en az etkileyici olduğunu fark ettim;). Bu cevabı görmeden önce düşünmediğim oldukça havalı bir kat kullanımı.
Sihirli Ahtapot Urn

6

MATL , 12 bayt

l6:"G:gY+]X>

Çevrimiçi deneyin!

açıklama

Evrişimi tekrar kullanma şansını kaçırdım!

Bu, OEIS'in aşağıdaki karakterizasyonunu kullanır:

a(n) = largest coefficient of (1+...+x^(n-1))^6

ve elbette polinom çoğalması evrişimdir.

l        % Push 1
6:"      % Do the following 6 times
  G:g    %   Push a vector of n ones, where n is the input
  Y+     %   Convolution
]        % End
X>       % Maximum

5

Jöle , 9 bayt

ṗ3S€ĠL€²S

@ Dennis'inki kadar kısa değil, ancak giriş için 20 saniyenin altında bitiyor 100.

Çevrimiçi deneyin!

Nasıl çalışır

ṗ3S€ĠL€²S  Main link. Argument: n

ṗ3         Cartesian power; yield all subsets of [1, ..., n] of length 3.
  S€       Sum each. 
    Ġ      Group indices by their values; for each unique sum S, list all indices whose
           values are equal to S.
     L€    Length each; for each unique sum S, yield the number of items in the original
           array that sum to S.
       ²   Square each; for each unique sum S, yield the number of pairs that both sum to S.
        S  Sum; yield the total number of equal pairs.

Bu yöntemi açıklayabilir misiniz? Şu anda Jelly'i öğrenme sürecindeyim, ancak henüz gerçek cevaplar gönderebilecek kadar iyi değilim; İyi örnekler için hep sana, Dennis'e ve birkaçına daha bakarım.
Sihirli Ahtapot Urn

@carusocomputing Açıklamayı tamamladı. Hala sorularınız varsa bize bildirin :-)
ETHproductions

Müthiş, ben çoğunlukla size gönderme çocuklar görüyorum çılgın kısa kod için yapacağım kaba-kuvvet uygulaması en temel cevap optimizasyonu kafam karıştı; ama her açıklamanın bir adım daha yakın olduğunu hissediyorum.
Sihirli Ahtapot Urn

5

Pyth, 13 12 bayt

JsM^UQ3s/LJJ

Leaky Nun sayesinde bir bayt kurtardı.

açıklama

JsM^UQ3s/LJJ
   ^UQ3         Get all triples in the range.
JsM             Save the sums as J.
        /LJJ    Count occurrences of each element of J in J.
       s        Take the sum.

Doğrudan formülü kullanmamak için +1: S.
Sihirli Ahtapot Urn

Çevrimiçi yorumlayıcıya bir bağlantı göndermek isteyebilirsiniz .
Leaky Nun

Ayrıca, /LJJyerine kullanabilirsiniz m/JdJ.
Leaky Nun



2

Oasis , 17 bayt

5m11*n3m5*nz++20÷

5                   n 5             implicit n for illustration
 m                  n**5
  11                n**5 11
    *               11*n**5
     n              11*n**5 n
      3             11*n**5 n 3
       m            11*n**5 n**3
        5           11*n**5 n**3 5
         *          11*n**5 5*n**3
          n         11*n**5 5*n**3 n
           z        11*n**5 5*n**3 4*n
            +       11*n**5 5*n**3+4*n
             +      11*n**5+5*n**3+4*n
              20    11*n**5+5*n**3+4*n 20
                ÷  (11*n**5+5*n**3+4*n)÷20

Çevrimiçi deneyin!

Oasis, yinelenen diziler için optimize edilmiş yığın tabanlı bir dildir. Ancak, özyineleme formülü bu durum için çok uzun olacaktır.


2

Brachylog , 17 bayt

{>ℕ|↰}ᶠ⁶ḍD+ᵐ=∧D≜ᶜ

Çevrimiçi deneyin!

açıklama

{  |↰}ᶠ⁶           Generate a list of 6 variables [A,B,C,D,E,F]...
 >ℕ                  ...which are all in the interval [0, Input)
        ḍD         Dichotomize; D = [[A,B,C],[D,E,F]]
          +ᵐ=      A + B + C must be equal to D + E + F
             ∧
              D≜ᶜ  Count the number of possible ways you can label the elements of D while
                     satisfying the constraints they have

Sanırım otomatik olarak gelmeli
Leaky Nun

@LeakyNun Kendi başına koşamazsın, bu bir metaforiktir.
17'de

Ama yine de bir listede kullanılıyorsa, bu listeyi etiketlemek varsayılan yüklem yapılabilir, değil mi?
mat

@mat Bu şekilde yapılabilir, ancak şu anda bir değişken üzerinde metaforik kullanamazsınız.
55'te ölümcül


1

Oktav , 25 23 21 bayt

@(n).55*n^5+n^3/4+n/5

Çevrimiçi deneyin!

OEIS girişindeki formülü kullanır. Kaydedilen iki formül yeniden düzenleme ve kullanarak dört bayt .55yerine 11/20fənɛtɪk için, sayesinde.


1

Python 2.7, 109 105 99 96 bayt

ETHproductions ve Dennis'e birkaç bayt kazandıkları için teşekkürler:

from itertools import*
lambda s:sum(sum(x[:3])==sum(x[3:])for x in product(range(s),repeat=6))

İlginç, Python 3 2.7'den daha kısa menzil fonksiyonlarına sahip değil mi?
Sihirli Ahtapot Urn

sum(sum(x[:3])==sum(x[3:])for x ...)daha da kısa olurdu. Ayrıca, from itertools import*bir bayt kaydeder.
Dennis

Daha önce alana ihtiyacınız yok for. Ayrıca, işlevlerin varsayılan olarak adlandırılmasını gerektirmez, böylece kaldırabilirsiniz h=.
Dennis

1

Mathematica, 52 bayt

Kelly Lowder'ın OEIS formülünü uygulaması çok daha kısadır, ancak bu sayıları doğrudan hesaplar:

Count[Tr/@#~Partition~3&/@Range@#~Tuples~6,{n_,n_}]&

Aslında, çözüm sayısını sayar 1 <= a,b,c,x,y,z <= n. Bu aynı sayıdır, çünkü tüm değişkenlere 1 eklemek eşitliği değiştirmez.

Açıklama: Range@#~Tuples~61 ve n arasındaki altı tamsayıdan oluşan tüm listeleri yapar, #~Partition~3&/@her listeyi 3 uzunluktaki iki listeye böler, Tr/@bu alt listeleri toplar ve Count[...,{n_,n_}]kaç çiftin aynı toplamı olduğunu sayar. Ben arasındaki öncelik sırasına ile çok şanslıyım f @, f /@ve ~f~!


1

Oktav , 41 bayt

@(n)round(max(ifft(fft(~~(1:n),n^2).^6)))

Çevrimiçi deneyin!

MATL cevabımla benzer , ancak konvolüsyonu fftyeterli sayıda noktaya ( n^2) sahip ayrı bir Fourier dönüşümü ( ) ile hesaplar . ~~(1:n)öğesinin daha kısa bir sürümü olarak kullanılır ones(1,n). roundkayan nokta hataları nedeniyle gereklidir.


0

CJam , 17 bayt

ri,6m*{3/::+:=},,

11TIO'da zaman aşımı 12ve daha yüksek bellek yetersizliği girişi .

Çevrimiçi deneyin!

açıklama

ri                e# Read an int from input.
  ,               e# Generate the range 0 ... input-1.
   6m*            e# Take the 6th Cartesian power of the range.
      {           e# Keep only the sets of 6 values where:
       3/         e#  The set split into (two) chunks of 3
         ::+:=    e#  Have the sums of both chunks equal.
              },  e# (end of filter)
                , e# Get the length of the resulting list.

0

Clojure, 79 bayt

#(count(for[r[(range %)]a r b r c r x r y r z r :when(=(+ a b c)(+ x y z))]1))

Kodda ton tekrar, daha fazla sayıda değişkente bir makro daha kısa olabilir.

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.