Kolekcja z sekwencji, która stanowi idealny kwadrat

10

Biorąc pod uwagę sekwencję OEIS A033581 , która jest sekwencją nieskończoną, n -ty termin (indeksowanie 0) jest określony wzorem formuły zamkniętej 6 × n 2 .

Twoim zadaniem jest napisanie kodu, który wyświetli wszystkie podzbiory zbioru N pierwszych liczb w sekwencji, tak aby suma podzbioru była kwadratem idealnym.

Zasady

  • Liczba całkowita Njest podawana jako dane wejściowe.
  • Nie można ponownie użyć liczby już użytej w sumie. (to znaczy każda liczba może pojawić się w każdym podzbiorze maksymalnie raz)
  • Użyte liczby mogą być nie następujące po sobie.
  • Wygrywa kod o najmniejszym rozmiarze.

Przykład

Podana sekwencja to {0,6,24,54,96, ..., 15000}

Jednym z wymaganych podzbiorów będzie {6 244,294}, ponieważ

6+24+294 = 324 = 18^2

Musisz znaleźć wszystkie takie zestawy wszystkich możliwych długości w danym zakresie.

prog_SAHIL
źródło
3
Dobry pierwszy post! Możesz rozważyć dodanie przykładów i przypadków testowych. Do wykorzystania w przyszłości mamy piaskownicę , w której możesz wypróbować swoje pomysły.
Οurous
Czy to wymaga od nas obliczenia A033581 dla N? Czy też nie rozumiem tego poprawnie?
ATaco
@ATaco Jak dla sekwencji (1,9,35, 39 ...) 1 + 9 + 39 = 49 idealny kwadrat (używa 3 cyfr), 35 + 1 = 36 kolejny idealny kwadrat, ale używa 2 liczb. Zatem {1,35} jest wymaganym zestawem.
prog_SAHIL
3
@prog_SAHIL Dodanie tego i kilku innych, jako przykładów do posta, byłoby pomocne :)
Οurous

Odpowiedzi:

3

05AB1E , 10 bajtów

ݨn6*æʒOŲ

Wypróbuj online!

W jaki sposób?

ݨn6 * æʒOŲ || Pełny program Wywołam wejście N.

Ý || Zakres obejmujący 0. Naciśnij [0, N] ∩ ℤ.
 ¨ || Usuń ostatni element.
  n || Kwadrat (pod względem elementu).
   6 * || Pomnóż przez 6.
     æ || Zestaw zasilający.
      ʒ || Filtruj-zachowaj te, które spełniają następujące warunki:
       O || --- | Ich suma ...
        Ų || --- | ... Czy idealny kwadrat?
Pan Xcoder
źródło
3

Haskell , 114 104 103 86 bajtów

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

Podziękowania dla Laikoni i Ørjan Johansen za większość gry w golfa! :)

Wypróbuj online!

Nieco bardziej czytelna wersja:

--  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
źródło
@Laikoni To jest bardzo pomysłowe! Dzięki!
Cristian Lupascu
@Laikoni Racja! Dzięki!
Cristian Lupascu,
86 bajtów: Wypróbuj online!
Ørjan Johansen
2

Pyth , 12 bajtów

-2 bajty dzięki Mr. Xcoder

fsI@sT2ym*6*

Wypróbuj online!

2 kolejne bajty muszą być dodane do usuwania []i [0], ale wydaje się ważnym wyjściem do mnie!


Wyjaśnienie

    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
źródło
12 bajtów: fsI@sT2ym*6*.
Pan Xcoder,
To golf, którego szukałem, którego szukałem!
Dave
2

Czysty , 145 ... 97 bajtów

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@

Wypróbuj online!

Używa funkcji pomocniczej @do generowania zestawu mocy do nwarunków poprzez połączenie każdego terminu [[],[6*n^2],...]z każdym terminem [[],[6*(n-1)*2],...]rekurencyjnie i w odwrotnej kolejności.

Funkcja cząstkowa fjest następnie komponowana (gdzie ->oznacza okompozycję) jako:
apply @ -> take the elements where -> the sum -> is a square

Niestety nie można pominąć literałuf= funkcji częściowej i podać literału funkcji częściowej , ponieważ reguły pierwszeństwa wymagają, aby w nawiasie zastosowano nawiasy kwadratowe.

Obrzydliwe
źródło
1
Ach, masz sztuczkę, którą Haskell powinien ukraść ...: P
Ørjan Johansen
1

JavaScript (ES7), 107 bajtów

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

Próbny

Skomentował

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
źródło
0

Japt , 15 bajtów

ò_²*6Ãà k_x ¬u1

Spróbuj


Wyjaśnienie

Wygeneruj na tablicy liczb całkowitych od 0 do input ( ò) i przepuść każdą przez funkcję ( _ Ã), podnosząc ją do kwadratu ( ²) i mutując przez 6 ( *6). Pobierz wszystkie kombinacje tej tablicy ( à) i usuń te, które zwracają truey ( k) po przejściu przez funkcję ( _), która dodaje ich elementy ( x), pobiera pierwiastek kwadratowy wyniku ( ¬) i modyfikuje to przez 1 ( u1)

Kudłaty
źródło