Colección de una secuencia que constituye un cuadrado perfecto.

10

Dada la secuencia OEIS A033581 , que es la secuencia infinita, el n 'th plazo (0-indexación) viene dada por la forma fórmula cerrada 6 × n 2 .

Su tarea es escribir código, que genera todos los subconjuntos del conjunto de N primeros números en la secuencia, de modo que la suma del subconjunto sea un cuadrado perfecto.

Reglas

  • El entero Nse da como entrada.
  • No puede reutilizar un número ya utilizado en la suma. (es decir, cada número puede aparecer en cada subconjunto como máximo una vez)
  • Los números utilizados pueden ser no consecutivos.
  • Código con el menor tamaño gana.

Ejemplo

La secuencia dada es {0,6,24,54,96, ..., 15000}

Uno de los subconjuntos requeridos será {6,24,294}, porque

6+24+294 = 324 = 18^2

Necesita encontrar todos estos conjuntos de todas las longitudes posibles en el rango dado.

prog_SAHIL
fuente
3
Buena primera publicación! Puede considerar agregar ejemplos y casos de prueba. En el futuro, tenemos una caja de arena que pueda juicio sus ideas en.
Οurous
¿Nos está pidiendo que calculemos A033581 dado N? ¿O no estoy entendiendo esto correctamente?
ATaco
@ATaco Como para una secuencia (1,9,35,39 ...) 1 + 9 + 39 = 49 un cuadrado perfecto (usa 3 números), 35 + 1 = 36 otro cuadrado perfecto pero usa 2 números. Entonces, {1,35} es el conjunto requerido.
prog_SAHIL
3
@prog_SAHIL Agregar eso, y algunos más, como ejemplos de la publicación sería útil :)
Οurous
Continuemos esta discusión en el chat .
prog_SAHIL

Respuestas:

3

05AB1E , 10 bytes

ݨn6*æʒOŲ

Pruébalo en línea!

¿Cómo?

ݨn6 * æʒOŲ || Programa completo Llamaré a la entrada N.

Ý || Rango inclusivo basado en 0. Presione [0, N] ∩ ℤ.
 ¨ || Eliminar el último elemento.
  n || Cuadrado (elemento-sabio).
   6 * || Multiplicar por 6.
     æ || Set de poder.
      ʒ || Filtre y guarde los que satisfacen lo siguiente:
       O || --- | Su suma ...
        Ų || --- | ... ¿Es un cuadrado perfecto?
Sr. Xcoder
fuente
3

Haskell , 114104103 86 bytes

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

¡Gracias a Laikoni y Ørjan Johansen por la mayor parte del golf! :)

Pruébalo en línea!

La versión ligeramente más legible:

--  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)
Cristian Lupascu
fuente
@Laikoni ¡Eso es muy ingenioso! ¡Gracias!
Cristian Lupascu
@Laikoni ¡Correcto! ¡Gracias!
Cristian Lupascu
86 bytes: ¡ Pruébelo en línea!
Ørjan Johansen
2

Pyth , 12 bytes

-2 bytes gracias al Sr. Xcoder

fsI@sT2ym*6*

Pruébalo en línea!

Es necesario agregar 2 bytes más para eliminar []y [0], ¡pero me parecen resultados válidos!


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
Dave
fuente
12 Bytes: fsI@sT2ym*6*.
Sr. Xcoder
¡Esa es la casilla de golf que estaba buscando!
Dave
2

Limpio , 145 ... 97 bytes

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@

Pruébalo en línea!

Utiliza la función auxiliar @para generar el conjunto de potencia en ntérminos al concatenar cada término de [[],[6*n^2],...]con cada término de forma [[],[6*(n-1)*2],...]recursiva y en orden inverso.

La función parcial fse compone (donde ->denota ocomposición) como:
apply @ -> take the elements where -> the sum -> is a square

Desafortunadamente, no es posible omitir f=y proporcionar un literal de función parcial , porque las reglas de precedencia requieren que tenga corchetes cuando se usa en línea.

Οurous
fuente
1
Bah, tienes un truco que la respuesta de Haskell debería robar ...: P
Ørjan Johansen
1

Jalea , 12 bytes

Ḷ²6׌PSƲ$Ðf

Pruébalo en línea!

La salida es una lista de subconjuntos que incluyen 0sy el subconjunto vacío.

Erik el Outgolfer
fuente
1

JavaScript (ES7), 107 bytes

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

Manifestación

Comentado

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()
Arnauld
fuente
0

Japt , 15 bytes

ò_²*6Ãà k_x ¬u1

Intentalo


Explicación

Genere en una matriz de enteros desde 0 hasta input ( ò) y pase cada uno a través de una función ( _ Ã), ²cuadrándola ( ) y multiplicándose por 6 ( *6). Obtenga todas las combinaciones de esa matriz ( à) y elimine aquellas que devuelven verdadero ( k) cuando se pasa a través de una función ( _) que agrega sus elementos ( x), obtiene la raíz cuadrada del resultado ( ¬) y modifica eso por 1 ( u1)

Lanudo
fuente