목록을 분할하십시오!


10

이 문제에서는 파티션이 최대 크기, 최소 크기 및 기본 크기를 갖는 목록을 분할해야합니다. (min,pref,max) 이 과제의 크기를 나타 내기 위해 표기법 을 사용 하겠습니다.

파티셔닝에 익숙하지 않은 사용자를 위해 다음 목록이 3의 일부로 파티셔닝되었습니다.
[0..9] -> [[0,1,2],[3,4,5],[6,7,8]]

목록을 균등하게 나눌 수없는 경우 파티션을 가능한 한 원하는 크기에 가깝게 만들어야합니다 [0..10], (2,4,5) -> [[0,1,2,3],[4,5,6],[7,8,9]]. 이 분할은 [[0,1,2,3],[4,5,6,7],[8,9]]후자가 더 바람직한 길이를 갖더라도,보다 바람직하다 . 공식적으로 (partitionLength-preferredSize)^2각 파티션 의 합계를 최소화해야 합니다.

파티션 길이의 순서는 중요하지 않습니다 : For [0..5], (2,3,3), [[0,1,2],[3,4]]or [[0,1],[2,3,4]]works. 파티션이 가능하지 않으면 빈 배열을 반환하십시오.[0..7], (4,4,5) -> [] .

이라고 가정하고 1<=min<=pref<=max전달 된 배열은 비어 있지 않은 정수 배열 이라고 가정 할 수 있습니다 . 배열은 항상 첫 번째 인수입니다. min, max 및 pref를 임의의 순서로, 튜플 또는 별도의 인수로 사용할 수 있습니다.

프로그램은 몇 초 안에 실행되어야합니다. 기본적으로 범위 내에서 가능한 모든 파티션 크기를 반복하는 것은 허용되지 않습니다.

테스트 사례 :

[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]]

이것은 이므로 원하는 언어로 가능한 한 적은 바이트를 목표로하십시오!


사용중인 표기법에 [a..b]include a및 excludes b가 맞습니까?
Alex A.

포함, B 독점.
Nathan Merrill

a에 대한 해석은 세트 이론파티션 과는
다릅니다

그러나 그것은 이다 정수 분할에 효과적으로 동일합니다.
Nathan Merrill

해결책이 없으면 어떻게합니까?
feersum

답변:


2

하스켈, 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]]

어떤 파티션이든, 길이가 두 개 이상 다른 두 개의 목록이있는 경우 항상 큰 목록을 축소하고 작은 목록을 확대하는 것이 좋습니다. 따라서 두 개의 목록 크기 만있는 파티션 만 고려하면되므로 계산이 간단 해집니다.

그런 다음 프로그램은 파티션의 가능한 모든 목록에서 실행됩니다. 파티션의 목록 양이 주어지면 점수가 고유하게 결정됩니다. 프로그램은 피팅 파티션과 그 점수를 계산합니다.

그런 다음 전체 최소값을 찾아서 반환합니다.

사용법 : 같은 입력 f [1,2,3,4,5] 1 3 4( f도전을 해결하는 기능입니다)

최상의 옵션을 완전히 수치 적으로 계산 한 다음 목록을 적절하게 분할하는 것이 가능하지만 너무 많은 바이트를 사용했습니다. 그러나이 접근법의 마지막 버전은 다음과 같습니다.

_%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]]

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.