Coleção de uma sequência que constitui um quadrado perfeito


10

Dada a sequência OEIS A033581 , que é a sequência infinita, o n '° termo (0-indexação) é dada pela fórmula fechado forma 6 × N 2 .

Sua tarefa é escrever o código, que gera todos os subconjuntos do conjunto de N primeiros números na sequência, de forma que a soma do subconjunto seja um quadrado perfeito.

Regras

  • O número inteiro Né dado como entrada.
  • Você não pode reutilizar um número já usado na soma. (ou seja, cada número pode aparecer em cada subconjunto no máximo uma vez)
  • Os números usados ​​podem ser não consecutivos.
  • O código com o menor tamanho vence.

Exemplo

A sequência fornecida é {0,6,24,54,96, ..., 15000}

Um dos subconjuntos necessários será {6,24.294}, porque

6+24+294 = 324 = 18^2

Você precisa encontrar todos esses conjuntos de todos os comprimentos possíveis no intervalo especificado.


3
Bom primeiro post! Você pode considerar adicionar exemplos e casos de teste. Para referência futura, temos uma sandbox que você pode julgamento as suas ideias no.
Οurous

Isso está nos pedindo para calcular A033581 dado N? Ou não estou entendendo isso corretamente?
ATaco

@ATaco Como para uma sequência (1,9,35,39 ...) 1 + 9 + 39 = 49 um quadrado perfeito (usa 3 números), 35 + 1 = 36 outro quadrado perfeito, mas usa 2 números. Então {1,35} é o conjunto necessário.
prog_SAHIL

3
@prog_SAHIL Acrescentando que, e mais alguns, como exemplos para o cargo seria :) útil
Οurous

Respostas:


3

05AB1E , 10 bytes

ݨn6*æʒOŲ

Experimente online!

Como?

ݨn6 * æʒOŲ || Programa completo. Vou chamar a entrada N.

Ý || Intervalo inclusivo baseado em 0. Pressione [0, N] ∩ ℤ.
 ¨ || Remova o último elemento.
  n || Quadrado (elemento a elemento).
   6 * || Multiplique por 6.
     æ || Conjunto de força.
      ʒ || Mantenha os filtros satisfeitos com o seguinte:
       O || --- | A soma deles ...
        Ų || --- | ... É um quadrado perfeito?

3

Haskell , 114 104 103 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]

Obrigado a Laikoni e Ørjan Johansen pela maior parte do golfe! :)

Experimente online!

A versão um pouco mais legível:

--  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 Isso é muito engenhoso! Obrigado!
Cristian Lupascu

@Laikoni Right! Obrigado!
Cristian Lupascu


2

Pitão , 12 bytes

-2 bytes graças ao Sr. Xcoder

fsI@sT2ym*6*

Experimente online!

Mais 2 bytes precisam ser adicionados para remover []e [0], mas parecem saída válida para mim!


Explicação

    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*.
Mr. Xcoder

Esse é o campo de golfe que eu estava procurando!
Dave

2

Limpo , 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@

Experimente online!

Usa a função auxiliar @para gerar a energia definida em ntermos concatenando cada termo de [[],[6*n^2],...]com cada termo de forma [[],[6*(n-1)*2],...]recursiva e na ordem inversa.

A função parcial fé então composta (onde ->denota ocomposição) como:
apply @ -> take the elements where -> the sum -> is a square

Infelizmente, não é possível pular o f=e fornecer uma literal de função parcial , porque as regras de precedência exigem que ele tenha colchetes quando usado em linha.


11
Bah, você tem um truque que a resposta de Haskell deve roubar ...: 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)

Demo

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

Japonês , 15 bytes

ò_²*6Ãà k_x ¬u1

Tente


Explicação

Gere na matriz de números inteiros de 0 a input ( ò) e passe cada um por uma função ( _ Ã), ao quadrado ( ²) e mutiplicando por 6 ( *6). Obtenha todas as combinações desse array ( à) e remova aquelas que retornam verdade ( k) quando passadas por uma função ( _) que adiciona seus elementos ( x), obtém a raiz quadrada do resultado ( ¬) e mods que por 1 ( u1)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.