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


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
Гарний перший пост! Ви можете розглянути питання про додавання прикладів та тестових випадків. Для подальшої довідки у нас є пісочниця, в якій ви можете випробувати свої ідеї.
Οurous

Це запитання, щоб ми обчислили A033581, заданий N? Або я не розумію цього правильно?
Атако

@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

Хаскелл , 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 Це дуже геніально! Дякую!
Крістіан Лупаску

@Laikoni Правильно! Дякую!
Крістіан Лупаску


2

Піт , 12 байт

-2 байти завдяки панові Xcoder

fsI@sT2ym*6*

Спробуйте в Інтернеті!

Більше 2 байта повинні бути додані , щоб видалити []і [0], але вони , здається , як дійсний вихід для мене!


Пояснення

    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
Ørjan Johansen



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 до вводу ( ò) і пропустіть кожне через функцію ( _ Ã), склавши його ( ²) і поніміть на 6 ( *6). Отримайте всі комбінації цього масиву ( à) та видаліть ті, що повертають truthy ( k) при передачі через функцію ( _), яка додає їх елементи ( x), отримує квадратний корінь результату ( ¬) та моди, які на 1 ( u1)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.