Mükemmel bir kare oluşturan bir diziden koleksiyon


10

Dizisi verilen OEIS A033581 sonsuz dizisidir, n, kapalı bir şekilde, aşağıdaki formül ile verilir 'inci terimi (0 indeksleme) 6 x n 2 .

Senin görevin, dizideki N ilk sayı kümesinin tüm alt kümelerini çıktı veren kod yazmaktır, böylece alt kümenin toplamı mükemmel bir karedir.

kurallar

  • Tam sayı Ngirdi olarak verilir.
  • Toplamda zaten kullanılmış bir sayıyı yeniden kullanamazsınız. (yani, her sayı her alt kümede en fazla bir kez görünebilir)
  • Kullanılan sayılar ardışık olmayabilir.
  • En az büyüklükte kod kazanır.

Misal

Belirtilen dizi {0,6,24,54,96, ..., 15000} şeklindedir.

Gerekli altkümelerden biri {6,24,294} olacaktır, çünkü

6+24+294 = 324 = 18^2

Verilen aralıktaki tüm olası uzunlukların bu tür tüm setlerini bulmanız gerekir.


3
İyi ilk gönderi! Örnekler ve test senaryoları eklemeyi düşünebilirsiniz. İleride, we have a sandbox Eğer deneme fikirlerinizi bunu başaramaz.
Οurous

Bu bize verilen A033581'i N hesaplamamızı mı istiyor? Yoksa bunu doğru anlamıyor muyum?
ATaco

@ATaco Bir dizi gibi (1,9,35,39 ...) 1 + 9 + 39 = 49 mükemmel bir kare (3 sayı kullanır), 35 + 1 = 36 başka bir mükemmel kare ama 2 sayı kullanır. Yani {1,35} gerekli kümedir.
prog_SAHIL

3
@prog_SAHIL Gönderi için örnek olarak ve birkaç tane daha eklemek yardımcı olacaktır :)
Οurous

Yanıtlar:


3

05AB1E , 10 bayt

ݨn6*æʒOŲ

Çevrimiçi deneyin!

Nasıl?

6n6 * æʒOŲ || Tam program. N girişini arayacağım.

Ý || 0 tabanlı kapsama alanı. [0, N] ∩ ℤ düğmesine basın.
 ¨ || Son elemanı çıkarın.
  n || Kare (eleman olarak).
   6 * || 6 ile çarpın.
     æ || Güç seti.
      ʒ || Aşağıdakileri karşılayanları filtrele-tut:
       O || --- | Toplamları ...
        Ų || --- | ... Mükemmel bir kare mi?

3

Haskell , 114104103 86 bayt

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

Golf çoğu için Laikoni ve Ørjan Johansen teşekkürler ! :)

Çevrimiçi deneyin!

Biraz daha okunabilir versiyon:

--  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 Bu çok ustaca! Teşekkürler!
Cristian Lupascu

@Laikoni Doğru! Teşekkürler!
Cristian Lupascu


2

Pyth , 12 bayt

Bay Xcoder sayesinde -2 bayt

fsI@sT2ym*6*

Çevrimiçi deneyin!

Kaldırmak için 2 bayt daha eklenmeli []ve [0]bunlar bana geçerli çıktı gibi görünüyor!


Explanataion

    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 bayt: fsI@sT2ym*6*.
Bay Xcoder

Aradığım kare kontrol golfü bu!
Dave

2

Temiz , 145 ... 97 bayt

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@

Çevrimiçi deneyin!

Her terimi bir terim ile özyinelemeli ve ters sırada birleştirerek terimlere @ayarlanan gücü üretmek için yardımcı işlevini kullanır .n[[],[6*n^2],...][[],[6*(n-1)*2],...]

Kısmi fonksiyon fdaha sonra ( kompozisyonu ->ifade eder o) şu şekilde oluşturulur:
apply @ -> take the elements where -> the sum -> is a square

Maalesef , öncelikli kurallar satır içi kullanıldığında parantez olmasını gerektirdiğinden, f=kısmi işlev değişmezini atlamak ve sağlamak mümkün değildir .


1
Bah, Haskell cevabının çalması gereken bir hile var ...: P
Ørjan Johansen



1

JavaScript (ES7), 107 bayt

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

gösteri

Yorumlananlar

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 bayt

ò_²*6Ãà k_x ¬u1

Dene


açıklama

0 ile input ( ò) arasında bir tamsayı dizisi oluşturun ve her birini bir işleve ( _ Ã) ²geçirin , kare yapın ( ) ve 6 ( *6) ile çarpın . Bu dizinin ( à) tüm kombinasyonlarını alın ve elemanlarını ( ) ekleyen kbir fonksiyonun ( _) içinden geçerken doğruluk ( ) döndürenleri kaldırın x, sonucun ( ¬) kare kökünü alır ve 1 ( u1)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.