平等来自三分


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(...)是上面的函数。
  • 索引完全如所述,没有其他索引可以接受。

这是,最低字节数获胜。


糟糕,我没有注意到OEIS的直接公式,我认为这不是那么容易。哦,对了,我不是对该等式的直接端口+1。
魔术八达通Ur

1
至少该公式并非完美无瑕:P
fəˈnɛtɪk

再说一次,它给reg-langs一个抵抗eso-langs的机会。
魔术章鱼缸

如果标题是“三胞胎平等进来”会更好吗?
Leaky Nun

Answers:


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

Mathematica 17或76字节

使用公式:

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

(每个@GregMartin和@ngenisis保存了3个字节)

我不使用公式,而是直接计算所有解决方案并计算它们。

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都无关紧要。


我注意到,通常,最短的答案是最不令人印象深刻的;)。这是一个非常酷的折叠用法,我在看到这个答案之前就没有考虑过。
Magic Octopus Urn

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的短,但是在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'Apr 28'17

太棒了,我对从最基本的暴力实施的答案的优化感到困惑,我会对我看到你们发布的疯狂的简短代码进行处理;但我觉得所有解释都离您更近了!
魔术章鱼缸

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。
魔术八达通Ur

您可能想发布一个在线解释器的链接。
Leaky Nun

另外,您可以使用/LJJ代替m/JdJ
Leaky Nun



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

Brachylog,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您不能自己运行,这是一个元谓词。
Fatalize

但是,即使将其用于列表中,也可以将该列表标记为默认谓词,不是吗?

@mat可以这样,但是现在您不能在变量上使用元谓词。
致命



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?
魔术章鱼缸

sum(sum(x[:3])==sum(x[3:])for x ...)会更短。另外,from itertools import*保存一个字节。
丹尼斯,

您之前不需要空格for。另外,我们不需要默认命名函数,因此您可以删除h=
丹尼斯

1

Mathematica,52个字节

凯利·洛德(Kelly Lowder)对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))

代码中的重复次数很多,而在大量变量上,宏可能会更短。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.