Рівність настає в трійках


11

Взято від: OEIS- A071816

Ваше завдання, задане верхньою межею n, - знайти кількість рішень, що задовольняють рівнянню:

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

Послідовність починається, як описано на сторінці OEIS, та як зазначено нижче (1-індексований):

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

Тому що n = 1існує лише одне рішення:(0,0,0,0,0,0)

Для цього n = 2існує 20 замовлених рішень (a,b,c,x,y,z)для 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

  • Введення - це одне ціле число, що позначає n.
  • Вихід - це одне ціле число / рядок, що позначає f(n), де f(...)функція вище.
  • Індексація точно така, як описано, інша індексація неприйнятна.

Це , виграє найменший байт.


Ааа crappp, я не помітив пряму формулу на OEIS, я думав , що це не було б , що легко. Ну добре, я не + 1'і прямі порти цього рівняння; P.
Чарівний восьминіг Урна

1
Принаймні, формула не була ідеально гольф: P
fəˈnɛtɪk

Потім знову дає шанс reg-langs проти eso-langs.
Чарівний восьминіг Урна

Чи було б краще, якби назва була «рівність приходить в трійки»?
Лина монашка

Відповіді:


11

Желе , 9 6 байт

ṗ6ḅ-ċ0

O (n 6 ) розчин.

Спробуйте в Інтернеті!

Як це працює

ṗ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.

Га! Треба любити теоретичні відповіді (моя основа теоретичної відповіді - це чи працює вона на TIO для великих значень n , це, мабуть, погано). Я сподівався побачити O(n^6)все-таки: P.
Чарівна восьминога урна

9

Математика 17 або 76 байт

Використовуючи формулу:

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

(Збережено 3 байти на @GregMartin та @ngenisis)

Замість того, щоб використовувати формулу, тут я буквально обчислюю всі рішення і рахую їх.

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

2
Дякуємо за публікацію не брутальним способом :). +1 для будь-якої математичної відповіді, яка не є рівнянням або вбудованою.
Чарівна восьминога урна

Відповідно до цієї відповіді , ви можете замінити 11/20на .55двобайтову економію.
Грег Мартін

Вам також не потрібна зірочка в першому секторі.
ngenisis

8

Haskell , 48 байт

Я перед тим, як писати цю формулу, я не помітив, тому це, безумовно, не найкоротший (або найшвидший) загальний метод, але я вважав, що це досить.

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

Спробуйте в Інтернеті!

f nгенерує все списки 6 елементів з [1..n], а потім підраховує ті , у яких чергуються сума 0. використовує той факт , що a+b+c==d+e+fтак само , як a-(d-(b-(e-(c-f))))==0, і що це не має значення , якщо ми додамо 1 до всіх номерах.


Я помітив, що часто найкоротша відповідь є найменш вражаючою;). Це досить класне використання складок, яке я б не розглядав, перш ніж побачити цю відповідь.
Чарівна восьминога урна

6

MATL , 12 байт

l6:"G:gY+]X>

Спробуйте в Інтернеті!

Пояснення

Я не міг пропустити шанс знову використати згортку!

Для цього використовується наступна характеристика від OEIS:

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

і звичайно множення поліномів - це згортка.

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

Желе , 9 байт

ṗ3S€ĠL€²S

Не такий короткий, як @ Dennis's, але він закінчується за 20 секунд для введення 100.

Спробуйте в Інтернеті!

Як це працює

ṗ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.

Чи можете ви пояснити цей метод? На даний момент я перебуваю в процесі навчання Jelly, але я все ще недостатньо хороший, щоб подати реальні відповіді; Я завжди звертаюсь до вас, Деннісе та ще декількох людей, за гарними прикладами.
Чарівний восьминога Урна

@carusocomputing Закінчив пояснення. Повідомте мене, якщо у вас все ще виникають запитання :-)
ETHproductions

Дивовижно, я здебільшого плутаю оптимізацію відповідей із самого елементарного виконання грубої сили, що я зробив би до шаленого короткого коду, який я бачу, як ви публікуєте; але я відчуваю, що кожне пояснення - це на крок ближче дякую!
Чарівний восьминіг Урна

5

Pyth, 13 12 байт

JsM^UQ3s/LJJ

Збережено один байт завдяки Leaky Nun.

Пояснення

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.

+1 за невикористання прямої формули: P.
Чарівний восьминіг Урна

Ви можете розмістити посилання на онлайн-перекладача .
Лина монашка

Також ви можете використовувати /LJJзамість m/JdJ.
Лина монашка


2

TI-BASIC, 19 байт

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

Оцінює формулу OEIS.


1
Як ви тут рахуєте байти? Prompt x= 2 байти?
Чарівний восьминога Урна

@carusocomputing TI-BASIC
набраний

1
Як-то сумно, що раніше я опублікував відповідь TI-BASIC і ніколи не оцінив її правильно, коли я переглядаю свою історію ._.
Magic Octopus Urn

2

Оазис , 17 байт

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

Спробуйте в Інтернеті!

Oasis - мова на основі стеків, оптимізована для повторюваних послідовностей. Однак формула рекурсії була б занадто довгою для цього випадку.


2

Брахілог , 17 байт

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

Спробуйте в Інтернеті!

Пояснення

{  |↰}ᶠ⁶           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

Я здогадуюсь автоматично прийти з
Leaky Nun

@LeakyNun Ви не можете керувати собою, це метапредмет.
Фаталізувати

Але все ж, якщо він використовується у списку, маркування цього списку може бути зроблено предикатом за замовчуванням, ні?
мат

@mat Це можна зробити так, але зараз ви не можете використовувати метапредмет для змінної.
Фаталізувати

1

JavaScript, 24 байти

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

Використовується формула зі сторінки OEIS.

Спробуйте в Інтернеті!


Я думаю, ви можете зберегти два байти за допомогоюx=>x**5*.55+x**3/4+x/5
ETHproductions

@ETHproductions є помилки з плаваючою комою, якщо я використовую * .55 замість *
11/20


1

Python 2.7, 109 105 99 96 байт

Дякуємо ETHproductions та Dennis за те, що вони зберегли кілька байтів:

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

Цікаво, чи не має Python 3 функцій коротшого діапазону, ніж 2,7?
Magic Octopus Urn

sum(sum(x[:3])==sum(x[3:])for x ...)було б ще коротше. Також from itertools import*зберігає байт.
Денніс

Раніше вам не потрібен простір for. Крім того, ми не вимагаємо, щоб функції були названі за замовчуванням, тому ви можете їх видалити h=.
Денніс

1

Математика, 52 байти

Реалізація формули OEIS Келлі Лоудер значно коротша, але це обчислює числа безпосередньо:

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

Що ж, насправді рахується кількість рішень 1 <= a,b,c,x,y,z <= n . Це те саме число, оскільки додавання 1 до всіх змінних не змінює рівності.

Пояснення: Range@#~Tuples~6робить усі списки з шести цілих чисел між 1 і n, #~Partition~3&/@розбиває кожен список на два списки довжиною 3, Tr/@підсумовує ці підлісти і Count[...,{n_,n_}]підраховує, скільки пар мають однакову суму. Я дуже пощастило з порядком старшинства між f @, f /@і ~f~!


1

Октава , 41 байт

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

Спробуйте в Інтернеті!

Аналогічно моїй відповіді MATL , але обчислює згортку за допомогою дискретного перетворення Фур'є ( fft) з достатньою кількістю балів ( n^2). ~~(1:n)використовується як скорочена версія ones(1,n). roundнеобхідний через помилки з плаваючою комою.


0

CJam , 17 байт

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

У 11TIO 12та більше і більше вичерпано пам'ять.

Спробуйте в Інтернеті!

Пояснення

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 байт

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

Тони повторення в коді, на більшій кількості змінних макрос може бути коротшим.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.