Kesetaraan Datang dalam Tiga

11

Diambil dari: OEIS- A071816

Tugas Anda, diberi batas atas n, adalah untuk menemukan sejumlah solusi yang memenuhi persamaan:

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

Urutannya dimulai seperti yang dijelaskan pada halaman OEIS, dan seperti di bawah ini (1-diindeks):

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

Sebab n = 1, hanya ada satu solusi:(0,0,0,0,0,0)

Sebab n = 2, ada 20 solusi yang dipesan (a,b,c,x,y,z)untuk 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

  • Input adalah bilangan bulat tunggal yang menunjukkan n.
  • Output adalah bilangan bulat tunggal / string yang menunjukkan f(n), di mana f(...)adalah fungsi di atas.
  • Pengindeksan persis seperti yang dijelaskan, tidak ada pengindeksan lain yang dapat diterima.

Ini adalah , kemenangan byte-count terendah.

Guci Gurita Ajaib
sumber
Ahhh crappp, saya tidak melihat rumus langsung pada Oei, saya pikir ini tidak akan yang mudah. Oh well, saya tidak memberi +1 port langsung persamaan itu; P.
Guci Gurita Sihir
1
Setidaknya formula tidak
golf
Kemudian lagi, itu memberi reg-langs kesempatan melawan eso-langs.
Guci Gurita Sihir
Akankah lebih baik jika judulnya "kesetaraan datang dalam kembar tiga"?
Leaky Nun

Jawaban:

11

Jelly , 9 6 byte

ṗ6ḅ-ċ0

O (n 6 ) solusi.

Cobalah online!

Bagaimana itu bekerja

ṗ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.
Dennis
sumber
Ha! Harus menyukai jawaban teoretis (dasar saya untuk jawaban teoretis sekarang apakah ini berjalan pada TIO untuk nilai n yang besar , ini mungkin buruk). Saya berharap untuk melihat O(n^6): P.
Magic Octopus Guci
9

Mathematica 17 atau 76 Bytes

Menggunakan rumus:

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

(Disimpan 3 byte per @GregMartin dan @ngenisis)

Daripada menggunakan rumus, di sini saya benar-benar menghitung semua solusi dan menghitungnya.

Length@Solve[a+b+c==x+y+z&&And@@Table[(0<=i<#),{i,{a,b,c,x,y,z}}],Integers]&
Kelly Lowder
sumber
2
Terima kasih telah memposting cara non-brute-force :). +1 untuk setiap jawaban matematika yang bukan persamaan atau bawaan.
Guci Gurita Sihir
Sesuai jawaban ini , Anda dapat menggantinya 11/20dengan .55penghematan dua byte.
Greg Martin
Anda juga tidak perlu tanda bintang pada periode pertama.
ngenisis
8

Haskell , 48 byte

Saya tidak memperhatikan formula sebelum menulis ini, jadi itu jelas bukan metode umum terpendek (atau tercepat), tapi saya pikir itu cantik.

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

Cobalah online!

f nmenghasilkan semua daftar dari 6 elemen dari [1..n], kemudian menghitung orang-orang yang jumlah bolak-baliknya 0. Menggunakan fakta yang a+b+c==d+e+fsama dengan a-(d-(b-(e-(c-f))))==0, dan juga bahwa tidak masalah jika kita menambahkan 1 ke semua angka.

Ørjan Johansen
sumber
Saya perhatikan bahwa, seringkali, jawaban terpendek adalah yang paling tidak mengesankan;). Ini adalah penggunaan flip yang cukup keren yang tidak akan saya pertimbangkan sebelum melihat jawaban ini.
Guci Gurita Sihir
6

MATL , 12 byte

l6:"G:gY+]X>

Cobalah online!

Penjelasan

Saya tidak dapat melewatkan kesempatan untuk menggunakan konvolusi lagi!

Ini memanfaatkan karakterisasi berikut dari OEIS:

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

dan tentu saja penggandaan polinomial adalah konvolusi.

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
Luis Mendo
sumber
5

Jelly , 9 byte

ṗ3S€ĠL€²S

Tidak sesingkat @ Dennis, tetapi selesai di bawah 20 detik untuk input 100.

Cobalah online!

Bagaimana itu bekerja

ṗ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.
Produksi ETH
sumber
Bisakah Anda menjelaskan metode ini? Saat ini saya sedang dalam proses belajar Jelly, tetapi saya masih belum cukup baik untuk mengirimkan jawaban yang sebenarnya; Saya selalu mencari Anda, Dennis dan beberapa lainnya untuk contoh yang baik.
Guci Gurita Sihir
@carusocomputing Selesai penjelasannya. Beri tahu saya jika Anda masih memiliki pertanyaan :-)
ETHproduksi
Luar biasa, saya sebagian besar bingung pada optimasi jawaban dari yang paling mendasar dari implementasi brute-force yang akan saya lakukan untuk kode pendek gila yang saya lihat kalian posting; tapi saya merasa setiap penjelasan adalah selangkah lebih dekat terima kasih!
Guci Gurita Sihir
5

Pyth, 13 12 byte

JsM^UQ3s/LJJ

Disimpan satu byte berkat Leaky Nun.

Penjelasan

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.

sumber
+1 untuk tidak menggunakan rumus langsung: P.
Guci Gurita Sihir
Anda mungkin ingin memposting tautan ke juru bahasa online .
Leaky Nun
Selain itu, Anda dapat menggunakannya /LJJsebagai gantinya m/JdJ.
Leaky Nun
2

TI-BASIC, 19 byte

:Prompt X
:.05X(11X^4+5X²+4

Mengevaluasi formula OEIS.

Scott Milner
sumber
1
Bagaimana Anda menghitung byte di sini? Prompt x= 2 byte?
Guci Gurita Sihir
@carusocomputing TI-BASIC dicetak oleh token
dzaima
1
Agak sedih bahwa saya telah memposting jawaban TI-BASIC 5 kali sebelumnya dan tidak pernah mencetaknya dengan benar sekarang karena saya melihat sejarah saya ._.
Magic Gurita Guci
2

Oasis , 17 byte

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

Cobalah online!

Oasis adalah bahasa berbasis tumpukan yang dioptimalkan untuk urutan berulang. Namun, rumus rekursi akan terlalu lama untuk kasus ini.

Biarawati Bocor
sumber
2

Brachylog , 17 byte

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

Cobalah online!

Penjelasan

{  |↰}ᶠ⁶           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
Fatalisasi
sumber
Saya kira seharusnya secara otomatis datang dengan
Leaky Nun
@ LeakyNun Anda tidak dapat berjalan sendiri, ini metapredicate.
Fatalkan tanggal
Tapi tetap saja jika digunakan pada daftar, pelabelan daftar itu bisa dijadikan predikat default, bukan?
mat
@ ah Bisa dibuat seperti itu, tetapi saat ini Anda tidak dapat menggunakan metapredicate pada variabel.
Fatalkan
1

JavaScript, 24 byte

x=>11*x**5/20+x**3/4+x/5

Menggunakan formula dari halaman OEIS.

Cobalah online!

fəˈnɛtɪk
sumber
Saya pikir Anda dapat menyimpan dua byte denganx=>x**5*.55+x**3/4+x/5
ETHproduksi
@ ETHproductions ada kesalahan floating point jika saya menggunakan * .55 bukan *
11/20
1

Oktaf , 25 23 21 byte

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

Cobalah online!

Menggunakan formula dari entri OEIS. Menyimpan dua empat byte dengan mengatur ulang formula dan menggunakan .55alih-alih 11/20, berkat fəˈnɛtɪk.

Stewie Griffin
sumber
1

Python 2.7, 109 105 99 96 byte

Terima kasih ETHproductions dan Dennis untuk menghemat beberapa byte:

from itertools import*
lambda s:sum(sum(x[:3])==sum(x[3:])for x in product(range(s),repeat=6))
acidtobi
sumber
Menarik, bukankah Python 3 memiliki fungsi rentang yang lebih pendek dari 2,7?
Magic Octopus Guci
sum(sum(x[:3])==sum(x[3:])for x ...)akan lebih pendek. Juga, from itertools import*simpan satu byte.
Dennis
Anda tidak membutuhkan ruang sebelumnya for. Selain itu, kami tidak memerlukan fungsi untuk dinamai secara default, sehingga Anda dapat menghapus h=.
Dennis
1

Mathematica, 52 byte

Implementasi Kelly Lowder terhadap formula OEIS jauh lebih pendek, tetapi ini menghitung angka secara langsung:

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

Yah, itu sebenarnya menghitung jumlah solusi 1 <= a,b,c,x,y,z <= n . Ini adalah angka yang sama, karena menambahkan 1 ke semua variabel tidak mengubah kesetaraan.

Penjelasan: Range@#~Tuples~6buat semua daftar enam bilangan bulat antara 1 dan n, #~Partition~3&/@pisahkan setiap daftar menjadi dua daftar dengan panjang 3, jumlahkan daftar-daftar Tr/@ini, dan Count[...,{n_,n_}]hitung berapa banyak pasangan yang memiliki jumlah yang sama. Saya sangat beruntung dengan urutan prioritas di antara f @, f /@dan ~f~!

Bukan pohon
sumber
1

Oktaf , 41 byte

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

Cobalah online!

Mirip dengan jawaban MATL saya , tetapi menghitung konvolusi melalui transformasi Fourier diskrit ( fft) dengan jumlah poin yang cukup ( n^2). ~~(1:n)digunakan sebagai versi lebih pendek dari ones(1,n). rounddiperlukan karena kesalahan floating point.

Luis Mendo
sumber
0

CJam , 17 byte

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

Input 11waktu habis pada TIO, dan 12kehabisan memori yang lebih tinggi.

Cobalah online!

Penjelasan

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.
Kucing Bisnis
sumber
0

Clojure, 79 byte

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

Banyak pengulangan dalam kode, pada sejumlah besar variabel makro mungkin lebih pendek.

NikoNyrh
sumber