Bộ sưu tập từ một chuỗi tạo thành một hình vuông hoàn hảo


10

Với chuỗi OEIS A033581 , đó là dãy vô hạn, n 'th hạn (0-indexing) được cho bởi công thức dạng khép kín 6 × n 2 .

Nhiệm vụ của bạn là viết mã, xuất ra tất cả các tập hợp con của tập hợp N số đầu tiên trong chuỗi, sao cho tổng của tập hợp con là một hình vuông hoàn hảo.

Quy tắc

  • Số nguyên Nđược đưa ra làm đầu vào.
  • Bạn không thể sử dụng lại một số đã được sử dụng trong tổng. (nghĩa là, mỗi số có thể xuất hiện trong mỗi tập hợp con nhiều nhất một lần)
  • Các số được sử dụng có thể không liên tiếp.
  • Mã với kích thước nhỏ nhất sẽ thắng.

Thí dụ

Chuỗi đã cho là {0,6,24,54,96, ..., 15000}

Một trong những tập hợp con bắt buộc sẽ là {6,24,294}, bởi vì

6+24+294 = 324 = 18^2

Bạn cần tìm tất cả các bộ như vậy của tất cả các độ dài có thể trong phạm vi nhất định.


3
Bài đăng đầu tiên tốt! Bạn có thể xem xét thêm các ví dụ và trường hợp thử nghiệm. Để tham khảo trong tương lai, chúng tôi có một hộp cát mà bạn có thể dùng thử ý tưởng của mình.
urous

Đây có phải là yêu cầu chúng tôi tính A033581 cho N? Hay tôi không hiểu điều này một cách chính xác?
ATaco

@ATaco Giống như cho một chuỗi (1,9,35,39 ...) 1 + 9 + 39 = 49 một hình vuông hoàn hảo (Nó sử dụng 3 số), 35 + 1 = 36 một hình vuông hoàn hảo khác nhưng nó sử dụng 2 số. Vì vậy, {1,35} là tập hợp bắt buộc.
prog_SAHIL

3
@prog_SAHIL Thêm đó, và một vài chi tiết, như ví dụ để các bài sẽ là hữu ích :)
Οurous

Câu trả lời:


3

05AB1E , 10 byte

ݨn6*æʒOŲ

Hãy thử trực tuyến!

Làm sao?

Ý6 * OŲ || Chương trình đầy đủ. Tôi sẽ gọi đầu vào N.

Ý | | Phạm vi bao gồm 0 dựa trên. Đẩy [0, N].
 | | | Loại bỏ yếu tố cuối cùng.
  n | | Hình vuông (yếu tố khôn ngoan).
   6 * || Nhân với 6.
     | | | Quyền hạn.
      | | | Lọc giữ những thứ thỏa mãn như sau:
       Ô | | --- | Tổng của họ ...
        Ų | | --- | ... Là một hình vuông hoàn hảo?

3

Haskell , 114 104 103 86 byte

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

Cảm ơn LaikoniØrjan Johansen cho hầu hết các môn đánh gôn! :)

Hãy thử trực tuyến!

Phiên bản dễ đọc hơn một chút:

--  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 Điều đó thật tài tình! Cảm ơn!
Cristian Lupascu

@Laikoni Đúng rồi! Cảm ơn!
Cristian Lupascu


2

Bình thường , 12 byte

-2 byte nhờ ông Xcoder

fsI@sT2ym*6*

Hãy thử trực tuyến!

Cần thêm 2 byte để loại bỏ [][0], nhưng chúng có vẻ như là đầu ra hợp lệ đối với tôi!


Giải thích

    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 byte : fsI@sT2ym*6*.
Ông Xcoder

Đó là sân golf kiểm tra mà tôi đang tìm kiếm!
Dave

2

Sạch , 145 ... 97 byte

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@

Hãy thử trực tuyến!

Sử dụng hàm trợ giúp @để tạo ra sức mạnh được đặt thành ncác thuật ngữ bằng cách nối từng thuật ngữ [[],[6*n^2],...]với mỗi thuật ngữ [[],[6*(n-1)*2],...]đệ quy và theo thứ tự ngược lại.

Hàm một phần fsau đó được sáng tác (trong đó ->biểu thị othành phần) là:
apply @ -> take the elements where -> the sum -> is a square

Thật không may, không thể bỏ qua f=và cung cấp một phần chức năng theo nghĩa đen , bởi vì các quy tắc ưu tiên yêu cầu nó có dấu ngoặc khi sử dụng nội tuyến.


1
Bah bạn đã có một mẹo mà câu trả lời của Haskell sẽ đánh cắp ...: P
Ørjan Johansen



1

JavaScript (ES7), 107 byte

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

Bản giới thiệu

Đã bình luận

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 byte

ò_²*6Ãà k_x ¬u1

Thử nó


Giải trình

Tạo trên mảng các số nguyên từ 0 đến input ( ò) và chuyển từng số thông qua một hàm ( _ Ã), bình phương nó ( ²) và biến đổi theo 6 ( *6). Nhận tất cả các kết hợp của mảng đó ( à) và loại bỏ các kết quả trả về truey ( k) khi truyền qua một hàm ( _) có thêm các phần tử của chúng ( x), lấy căn bậc hai của kết quả ( ¬) và sửa đổi bởi 1 ( u1)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.