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.


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

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?

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)

@Laikoni ¡Eso es muy ingenioso! ¡Gracias!
— Cristian Lupascu

@Laikoni ¡Correcto! ¡Gracias!
— Cristian Lupascu


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

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.


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



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()

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)

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.