完全な正方形を構成するシーケンスからのコレクション


10

無限のシーケンスであるOEIS A033581のシーケンスが与えられた場合、n番目の項(0インデックス)は、閉形式の式6×n 2で与えられます。

あなたの仕事は、サブセットの合計が完全な正方形になるように、シーケンスの最初のN個の数値のセットのすべてのサブセットを出力するコードを記述することです。

ルール

  • 整数Nは入力として与えられます。
  • 合計ですでに使用されている数を再利用することはできません。(つまり、各番号は各サブセットに最大1回出現できます)
  • 使用される数値は、連続していない場合があります。
  • 最小のサイズのコードが優先されます。

指定されたシーケンスは{0,6,24,54,96、...、15000}です

必要なサブセットの1つは{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役立つ:)だろう
Οurous

回答:


3

05AB1E、10 バイト

ݨn6*æʒOŲ

オンラインでお試しください!

どうやって?

ݨn6*æʒOŲ|| 完全なプログラム。入力をNと呼びます。

Ý|| 0ベースの包括的範囲。[0、N] Pushℤを押します。
 ¨|| 最後の要素を削除します。
  n || 正方形(要素単位)。
   6 * || 6を掛けます。
     æ|| パワーセット。
      ʒ|| 次の条件を満たすものをフィルタしてください。
       O || --- | 彼らの合計...
        Ų|| --- | ...完璧な正方形ですか?

3

Haskell114 104103 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Ørjanヨハンセンゴルフのほとんどのために!:)

オンラインでお試しください!

少し読みやすいバージョン:

--  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それはとても独創的です!ありがとう!
クリスティアンルパスク2018年

@Laikoniそうです!ありがとう!
クリスティアンルパスク2018年


2

Pyth、12バイト

-Xcoder氏のおかげで2バイト

fsI@sT2ym*6*

オンラインでお試しください!

[]とを削除するには[0]、さらに2バイトを追加する必要がありますが、私には有効な出力のようです。


説明

    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
Ørjanヨハンセン



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から入力(ò)までの整数の配列で生成し、それぞれを関数(_ Ã)に渡し、それを2乗し(²)、6で乗算します(*6)。その配列のすべての組み合わせ()を取得し、要素を追加する関数()を介して渡されたときにàtrue(k)を返す組み合わせを削除し_x)、結果の平方根を取得し(¬)、それを1で変更します(u1

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.