Collection d'une séquence qui constitue un carré parfait


10

Compte tenu de la séquence OEIS A033581 , qui est la séquence infinie, la n ième terme (0-indexation) est donnée par la formule de la forme fermée 6 × n 2 .

Votre tâche consiste à écrire du code, qui génère tous les sous-ensembles de l'ensemble des N premiers nombres de la séquence, de sorte que la somme du sous-ensemble soit un carré parfait.

Règles

  • L'entier Nest donné en entrée.
  • Vous ne pouvez pas réutiliser un nombre déjà utilisé dans la somme. (c'est-à-dire que chaque numéro peut apparaître au plus une fois dans chaque sous-ensemble)
  • Les nombres utilisés peuvent être non consécutifs.
  • Le code avec la plus petite taille gagne.

Exemple

La séquence donnée est {0,6,24,54,96, ..., 15000}

L'un des sous-ensembles requis sera {6,24,294}, car

6+24+294 = 324 = 18^2

Vous devez trouver tous ces ensembles de toutes les longueurs possibles dans la plage donnée.


3
Bon premier post! Vous pouvez envisager d'ajouter des exemples et des cas de test. Pour référence future, nous avons un bac à sable dans lequel vous pouvez
tester

Est-ce que cela nous demande de calculer A033581 étant donné N? Ou est-ce que je ne comprends pas cela correctement?
ATaco

@ATaco Comme pour une séquence (1,9,35,39 ...) 1 + 9 + 39 = 49 un carré parfait (Il utilise 3 nombres), 35 + 1 = 36 un autre carré parfait mais il utilise 2 nombres. Donc {1,35} est l'ensemble requis.
prog_SAHIL

3
@prog_SAHIL Ajouter cela, et quelques autres, comme exemples au message serait utile :)
Οurous

Réponses:


3

05AB1E , 10 octets

ݨn6*æʒOŲ

Essayez-le en ligne!

Comment?

ݨn6 * æʒOŲ || Programme complet. J'appellerai l'entrée N.

Ý || Plage inclusive basée sur 0. Appuyez sur [0, N] ∩ ℤ.
 ¨ || Supprimez le dernier élément.
  n || Carré (par élément).
   6 * || Multipliez par 6.
     æ || Powerset.
      ʒ || Filtrez-gardez ceux qui satisfont aux critères suivants:
       O || --- | Leur somme ...
        Ų || --- | ... est un carré parfait?

3

Haskell , 114104103 86 octets

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

Merci à Laikoni et Ørjan Johansen pour la majeure partie du golf! :)

Essayez-le en ligne!

La version légèrement plus lisible:

--  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 C'est très ingénieux! Merci!
Cristian Lupascu

@Laikoni C'est vrai! Merci!
Cristian Lupascu


2

Pyth , 12 octets

-2 octets grâce à M. Xcoder

fsI@sT2ym*6*

Essayez-le en ligne!

2 octets supplémentaires doivent être ajoutés pour supprimer []et [0], mais ils me semblent être une sortie valide!


Explication

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

C'est le golf carré que je cherchais!
Dave

2

Nettoyer , 145 ... 97 octets

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@

Essayez-le en ligne!

Utilise la fonction d'assistance @pour générer la puissance définie en ntermes en concaténant chaque terme de [[],[6*n^2],...]avec chaque terme de [[],[6*(n-1)*2],...]récursivement et dans l'ordre inverse.

La fonction partielle fest alors composée (où ->dénote la ocomposition) comme:
apply @ -> take the elements where -> the sum -> is a square

Malheureusement, il n'est pas possible d'ignorer le f=et de fournir un littéral de fonction partiel , car les règles de priorité nécessitent qu'il ait des crochets lorsqu'il est utilisé en ligne.


1
Bah tu as une astuce que la réponse de Haskell devrait voler ...: P
Ørjan Johansen



1

JavaScript (ES7), 107 octets

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

Démo

Commenté

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 octets

ò_²*6Ãà k_x ¬u1

Essayez-le


Explication

Générez sur un tableau d'entiers de 0 à input ( ò) et passez chacun par une fonction ( _ Ã), ²mettez-la au carré ( ) et multipliez-la par 6 ( *6). Obtenez toutes les combinaisons de ce tableau ( à) et supprimez celles qui retournent truey ( k) lorsqu'elles sont passées par une fonction ( _) qui ajoute leurs éléments ( x), obtient la racine carrée du résultat ( ¬) et modifie cela par 1 ( u1)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.