Phân vùng một danh sách!


10

Trong thử thách này, bạn cần phân vùng một danh sách, trong đó các phân vùng có kích thước tối đa, kích thước tối thiểu và kích thước ưa thích. Tôi sẽ sử dụng ký hiệu (min,pref,max) để chỉ ra kích thước trong thử thách này.

Đối với những người không quen thuộc với phân vùng, danh sách sau đây đã được phân vùng thành các phần của 3:
[0..9] -> [[0,1,2],[3,4,5],[6,7,8]]

Khi danh sách không chia hết, bạn cần các phân vùng càng gần với kích thước ưa thích càng tốt : [0..10], (2,4,5) -> [[0,1,2,3],[4,5,6],[7,8,9]]. Phân vùng này được ưa thích hơn [[0,1,2,3],[4,5,6,7],[8,9]], mặc dù cái sau có nhiều độ dài ưa thích hơn. Chính thức, chúng ta cần giảm thiểu tổng số (partitionLength-preferredSize)^2cho mỗi phân vùng.

Thứ tự của độ dài phân vùng không quan trọng: Cho [0..5], (2,3,3), hoặc [[0,1,2],[3,4]]hoặc [[0,1],[2,3,4]]hoạt động. Nếu không có phân vùng nào có thể, trả về một mảng trống : [0..7], (4,4,5) -> [].

Bạn có thể giả sử rằng 1<=min<=pref<=max, và mảng được truyền cho bạn là một mảng số nguyên không trống. Mảng sẽ luôn là đối số đầu tiên. Bạn có thể chấp nhận min, max và pref theo bất kỳ thứ tự nào và dưới dạng một tuple hoặc dưới dạng các đối số riêng biệt.

Chương trình của bạn phải chạy trong vài giây. Về cơ bản, không được phép lặp qua mọi kích thước phân vùng có thể trong giới hạn.

Các trường hợp thử nghiệm:

[1], (1,3,4)         -> [[1]]
[100], (1,2,3)       -> [[100]]
[1,2], (1,1,2)       -> [[1],[2]]
[1,2], (1,2,2)       -> [[1,2]]
[1,2], (1,3,3)       -> [[1,2]]
[1,2,3], (1,2,3)     -> [[1,2],[3]] or [[1,2,3]]
[1,2,3,4], (1,3,4)   -> [[1,2,3,4]]
[1,2,3,4,5], (3,3,4) -> []
[1,2,3,4,5], (2,2,2) -> []
[1,2,3,4,5], (3,3,5) -> [[1,2,3,4,5]]
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49], (2,6,6) -> [[1,2,3,4,5,6],[7,8,9,10,11,12],[13,14,15,16,17,18],[19,20,21,22,23,24],[25,26,27,28,29],[30,31,32,33,34],[35,36,37,38,39],[40,41,42,43,44],[45,46,47,48,49]]

Đây là một , vì vậy hãy nhắm đến càng ít byte càng tốt trong ngôn ngữ yêu thích của bạn!


Ký hiệu bạn đang sử dụng [a..b]bao gồm avà loại trừ b, đúng không?
Alex A.

Bao gồm, B độc quyền.
Nathan Merrill

Lưu ý rằng cách giải thích của bạn về a không giống như phân vùng từ lý thuyết tập hợp ...
bất chấp

Nhưng nó hiệu quả tương đương với phân vùng số nguyên.
Nathan Merrill

Nếu không có giải pháp thì sao?
feersum

Câu trả lời:


2

Haskell, 152

_%0=[]
s%k|(a,b)<-splitAt(div(z s)k)s=a:b%(k-1)
z=length
f s n p x=snd$minimum$(z s*p^2,[]):[(sum[(z x-p)^2|x<-s%k],s%k)|k<-[-div(-z s)x..div(z s)n]]

Trong bất kỳ phân vùng nào, nếu có hai danh sách có độ dài khác nhau từ hai trở lên, sẽ luôn có ích khi thu nhỏ danh sách lớn hơn và phóng to danh sách nhỏ hơn. do đó, chúng ta chỉ cần xem xét các phân vùng chỉ có hai kích thước danh sách, giúp đơn giản hóa việc tính toán.

chương trình sau đó chạy trên tất cả số lượng danh sách có thể có trong phân vùng. với số lượng danh sách trong phân vùng, điểm số được xác định duy nhất. chương trình tính toán một phân vùng phù hợp và điểm số của nó.

sau đó nó tìm thấy mức tối thiểu tổng thể và trả về nó.

Cách sử dụng: đầu vào like f [1,2,3,4,5] 1 3 4( flà chức năng giải quyết thách thức)

Mặc dù có thể tính toán tùy chọn tốt nhất hoàn toàn bằng số và chỉ sau đó phân vùng danh sách cho phù hợp, nó đã mất quá nhiều byte. tuy nhiên, phiên bản cuối cùng của phương pháp này là:

_%0=[]
s%k|(a,b)<-splitAt(div(length s)k)s=a:b%(k-1)
f s n p x|l<-length s=(s%)$snd$minimum$(l*p^2,0):[(k*j^2+mod l k*(1-2*j),k)|k<-[1..div l n],k*x>=l,j<-[p-div l k]]

1

CJam, 70

q~:S;_,[0L]a{_S2=e<),S0=>f{[__S1=-_*\]@@-j.+}[esL]a+:e<}j1={/(\e_}/;]p

Dùng thử trực tuyến

Mã tìm thấy một chuỗi tối ưu các kích thước phân vùng dựa trên kích thước danh sách, sử dụng lập trình động (thông qua đệ quy ghi nhớ), sau đó tiếp tục và phân vùng danh sách.

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.