リストを分割します!


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、各パーティションの合計を最小化する必要があります。

パーティションの長さの順序は重要ではありません:については[0..5], (2,3,3)、いずれか[[0,1,2],[3,4]]または[[0,1],[2,3,4]]作品を。パーティションを作成できない場合は、空の配列を返します[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]含まaや除外b、正しいですか?
Alex A.

Aを含む、Bを含まない。
Nathan Merrill

aの解釈は集合論の分割と同じではないことに注意してください...
agtoever

しかし、これ実質的に整数分割と同等です。
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]]

どのパーティションでも、長さが2以上異なる2つのリストがある場合、大きいリストを縮小し、小さいリストを拡大することは常に有益です。したがって、リストサイズが2つだけのパーティションを検討するだけでよく、計算が簡単になります。

次に、プログラムは、パーティション内の可能なすべてのリストで実行されます。パーティション内のリストの数を考慮して、スコアは一意に決定されます。プログラムは、フィッティングパーティションとそのスコアを計算します。

次に、全体の最小値を見つけて返します。

使用方法:のような入力f [1,2,3,4,5] 1 3 4f課題を解決するための関数です)

最良のオプションを完全に数値的に計算し、それに応じてリストを分割することは可能ですが、バイト数が多すぎます。ただし、このアプローチの最後のバージョンは次のとおりです。

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