Коллекция из последовательности, составляющей идеальный квадрат


10

Учитывая последовательность OEIS A033581 , которая является бесконечной последовательностью, n -й член (0-индексация) задается формулой 6 × n 2 в замкнутой форме .

Ваша задача - написать код, который выводит все подмножества набора из N первых чисел в последовательности так, чтобы сумма подмножества была идеальным квадратом.

правила

  • Целое число Nдается в качестве ввода.
  • Вы не можете повторно использовать число, уже использованное в сумме. (то есть каждое число может появляться в каждом подмножестве не более одного раза)
  • Используемые числа могут быть непоследовательными.
  • Код с наименьшим размером выигрывает.

пример

Данная последовательность: {0,6,24,54,96, ..., 15000}

Один из обязательных подмножеств будет {6,24,294}, потому что

6+24+294 = 324 = 18^2

Вам нужно найти все такие наборы всех возможных длин в заданном диапазоне.


3
Хороший первый пост! Вы можете рассмотреть возможность добавления примеров и тестовых случаев. Для дальнейшего использования у нас есть песочница, в которой вы сможете
опробовать

Это просит нас вычислить A033581 с учетом N? Или я не правильно понимаю?
ATaco

@ATaco Как и для последовательности (1,9,35,39 ...) 1 + 9 + 39 = 49 идеальный квадрат (используется 3 числа), 35 + 1 = 36 другой идеальный квадрат, но используется 2 числа. Итак, {1,35} является обязательным набором.
prog_SAHIL

3
@prog_SAHIL Было бы полезно добавить это и еще несколько примеров к сообщению :)
Οurous

Ответы:


3

05AB1E , 10 байтов

ݨn6*æʒOŲ

Попробуйте онлайн!

Как?

ݨn6 * æʒOŲ || Полная программа. Я позвоню на вход N.

Ý || Начиная с 0, включительно. Нажмите [0, N] ∩ ℤ.
 ¨ || Удалить последний элемент.
  n || Квадрат (поэлементно).
   6 * || Умножьте на 6.
     æ || Powerset.
      ʒ || Фильтр-оставь те, которые удовлетворяют следующему:
       O || --- | Их сумма ...
        Ų || --- | ... это идеальный квадрат?

3

Haskell , 114 104 103 86 байт

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

Спасибо Лайкони и Орьяну Йохансену за большую часть игры в гольф! :)

Попробуйте онлайн!

Чуть более читаемая версия:

--  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 Это очень гениально! Спасибо!
Кристиан Лупаску

@ Лайкони Правильно! Спасибо!
Кристиан Лупаску


2

Pyth , 12 байт

-2 байта благодаря мистеру Xcoder

fsI@sT2ym*6*

Попробуйте онлайн!

Для удаления []и нужно добавить еще 2 байта [0], но они кажутся мне правильным выводом!


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 байт: fsI@sT2ym*6*.
Мистер Xcoder

Это поле для проверки гольфа, которое я искал!
Дэйв

2

Чисто , 145 ... 97 байт

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@

Попробуйте онлайн!

Использует вспомогательную функцию @для генерации мощности, заданной для nтермов, путем объединения каждого терма [[],[6*n^2],...]с каждым [[],[6*(n-1)*2],...]рекурсивно и в обратном порядке.

Частичная функция fзатем составляется (где ->обозначает oсостав) как:
apply @ -> take the elements where -> the sum -> is a square

К сожалению, невозможно пропустить f=и предоставить частичный литерал функции , потому что правила приоритета требуют, чтобы он был заключен в скобки.


1
Бах, у тебя есть хитрость, которую должен украсть ответ на Haskell ...: P
Орджан Йохансен



1

JavaScript (ES7), 107 байт

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

демонстрация

комментарии

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 байт

ò_²*6Ãà k_x ¬u1

Попробуй это


объяснение

Генерация на массив целых чисел от 0 до ввода (ò ) и прохождение каждого через функцию ( _ Ã), возведение в квадрат it ( ²) и mutiplying на 6 ( *6). Получите все комбинации этого array ( à) и удалите те, которые возвращают truey ( k) при прохождении через функцию ( _), которая добавляет их элементы ( x), получает квадратный корень результата ( ¬) и модов, что на 1 ( u1)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.