从构成完美正方形的序列中收集


10

给定序列OEIS A033581,它是无限序列,则第n个项(0索引)由封闭形式公式6×n 2给出

您的任务是编写代码,该代码将输出序列中N个第一个数字集合的所有子集,以使子集的总和为一个完美的平方。

规则

  • N给出整数作为输入。
  • 您不能重复使用已在总和中使用的数字。(也就是说,每个数字最多可以出现在每个子集中一次)
  • 使用的数字可以是非连续的。
  • 以最小的代码获胜。

给定的顺序为{0,6,24,54,96,...,15000}

所需的子集之一将是{6,24,294},因为

6+24+294 = 324 = 18^2

您需要找到给定范围内所有可能长度的所有此类集合。


3
好的第一篇文章!您可以考虑添加示例和测试用例。供以后参考,我们提供了一个沙箱,您可以在其中试用您的想法
。–

这是否要求我们给定N来计算A033581?还是我不正确地理解这一点?
ATaco

@ATaco就像一个序列(1,9,35,39 ...)1 + 9 + 39 = 49一个完美的正方形(使用3个数字),35 + 1 = 36个另一个完美的正方形但使用2个数字。因此{1,35}是必需的集合。
prog_SAHIL

3
@prog_SAHIL在帖子中添加示例以及其他一些示例将是有帮助的:)
很有可能

Answers:


3

05AB1E,10 个字节

ݨn6*æʒOŲ

在线尝试!

怎么样?

6¨n6*æʒOŲ|| 完整程序。我将输入称为N。

Ý|| 从0开始的包含范围。按[0,N]∩ℤ。
 ¨|| 删除最后一个元素。
  n || 正方形(逐元素)。
   6 * || 乘以6。
     æ|| Powerset。
      ʒ|| 过滤保留满足以下条件的那些:
       O || --- | 他们的总和...
        Ų|| --- | ...是一个完美的正方形吗?

3

Haskell114104103 86字节

f n=[x|x<-concat<$>mapM(\x->[[],[x*x*6]])[0..n-1],sum x==[y^2|y<-[0..],y^2>=sum x]!!0]

由于Laikoni与Orjan约翰森对于大多数打高尔夫球!:)

在线尝试!

可读性更高的版本:

--  OEIS A033581
ns=map((*6).(^2))[0..]

-- returns all subsets of a list (including the empty subset)
subsets :: [a] -> [[a]]
subsets[]=[[]]
subsets(x:y)=subsets y++map(x:)(subsets y)

-- returns True if the element is present in a sorted list
t#(x:xs)|t>x=t#xs|1<2=t==x

-- the function that returns the square subsets
f :: Int -> [[Int]]
f n = filter (\l->sum l#(map(^2)[0..])) $ subsets (take n ns)

@Laikoni这是非常巧妙的!谢谢!
克里斯蒂安·卢帕斯库

@Laikoni对!谢谢!
克里斯蒂安·卢帕斯库


2

Pyth,12个字节

-2个字节,感谢Xcoder先生

fsI@sT2ym*6*

在线尝试!

需要再添加2个字节才能删除[][0],但对我来说它们似乎是有效的输出!


说明

    fsI@sT2ym*6*
    f                  filter
           y           the listified powerset of
            m*6*ddQ    the listified sequence {0,6,24,...,$input-th result}
        sT             where the sum of the sub-list
     sI@  2            is invariant over int parsing after square rooting

12个字节:fsI@sT2ym*6*
Xcoder先生18年

那就是我要找的高尔夫检查场!
戴夫

2

干净145个 ... 97个字节

import StdEnv
@n=[[]:[[6*i^2:b]\\i<-[0..n-1],b<- @i]]
f=filter((\e=or[i^2==e\\i<-[0..e]])o sum)o@

在线尝试!

使用辅助函数@n通过将每个术语[[],[6*n^2],...]与每个术语以[[],[6*(n-1)*2],...]递归和反向的顺序连接起来,以生成术语的幂集。

f然后将部分函数组合为(其中->表示o组合)为:
apply @ -> take the elements where -> the sum -> is a square

不幸的是,不能跳过f=和提供部分函数文字,因为内联使用优先级规则时,它必须带有方括号。


1
呸你有一招Haskell的答案应该偷...:P
与Orjan约翰森



1

JavaScript(ES7),107个字节

n=>[...Array(n)].reduce((a,_,x)=>[...a,...a.map(y=>[6*x*x,...y])],[[]]).filter(a=>eval(a.join`+`)**.5%1==0)

演示版

已评论

n =>                      // n = input
  [...Array(n)]           // generate a n-entry array
  .reduce((a, _, x) =>    // for each entry at index x:
    [                     //   update the main array a[] by:
      ...a,               //     concatenating the previous values with
      ...a.map(           //     new values built from the original ones
        y =>              //     where in each subarray y:
          [ 6 * x * x,    //       we insert a new element 6x² before
            ...y       ]  //       the original elements
      )                   //     end of map()
    ],                    //   end of array update
    [[]]                  //   start with an array containing an empty array
  )                       // end of reduce()
  .filter(a =>            // filter the results by keeping only elements for which:
    eval(a.join`+`) ** .5 //   the square root of the sum
    % 1 == 0              //   gives an integer
  )                       // end of filter()

0

Japt,15个字节

ò_²*6Ãà k_x ¬u1

尝试一下


说明

在从0到输入(ò)的整数数组上生成,并将每个整数传递给函数(_ Ã),对它进行平方(²)并乘以6(*6)。获取该数组(à)的所有组合,并删除k通过函数(_)的返回真值()的函数,该函数添加元素(x),获得结果的平方根(),并将其平方¬乘以1(u1

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.