ネックレス分割問題
バックグラウンド 3Blue1Brownのネックレス分割問題(または盗難ネックレス問題)とBorsuk-Ulam定理との関係に関する最近のビデオに触発されました。 この問題では、2人の泥棒がいくつかの異なる種類の宝石で構成される貴重なネックレスを盗みました。各タイプの宝石は偶数個あり、泥棒はそれぞれのタイプの宝石を2つに均等に分割したいと考えています。キャッチは、ネックレスをいくつかの連続したセグメントに分割し、それらの2つの間にセグメントを分配することによってそうしなければならないということです。 ここで示される4つの宝石の種類の一例でありS、E、D、およびR(それぞれ、サファイア、エメラルド、ダイヤモンド、ルビーのために)。ネックレスは次のようだとしましょう: [S,S,S,E,S,D,E,R,S,R,E,S,S,S,D,R,E,E,R,E,D,E,R,R,D,E,E,E] あり8サファイヤ、10エメラルド、4ダイヤモンド、そして6ルビーは。ネックレスは次のように分割できます。 [[S],[S],[S,E,S,D,E,R,S],[R,E,S,S,S,D,R,E,E,R,E,D,E],[R,R,D,E,E,E]] 次に、1番目の泥棒に1番目、3番目、5番目のセグメントを、もう1つの泥棒に2番目と4番目のセグメントを与えると、それぞれが4サファイア、5エメラルド、2ダイヤモンド、3ルビーになります。 [S], [S,E,S,D,E,R,S], [R,R,D,E,E,E] [S], [R,E,S,S,S,D,R,E,E,R,E,D,E], 0-indexing を使用すると、これらのカットはインデックスで発生します[1,2,9,22]。 ゴール そのような公正な分割は、多くのn場合、常にn宝石の種類の数であるカットを使用して行うことができます。あなたの仕事は、入力としてネックレスを取り、最小のそのような分割(最少のカット数)を出力する完全なプログラムまたは関数を書くことです。 入力 入力は任意の便利な形式にすることができます。ネックレスは一連の宝石である必要があります。たとえば、整数のリスト、宝石の種類を表すキーを持つ辞書、およびインデックスのリストである値。必要に応じて、ネックレスの長さや宝石の種類の数を含めることもできますが、他の入力を行わないでください。 入力ネックレスが有効であるとみなすことができます。特定の種類の宝石の数が奇数である場合や、ネックレスが空の場合に対処する必要はありません。 出力 繰り返しますが、出力は任意の便利な形式にすることができます。たとえば、セグメントのリスト、カット位置のリスト、2つの泥棒を表すキーを持つ辞書、セグメントのリストである値など。セグメントは、開始インデックス、終了インデックス、連続インデックスのリスト、宝石のリスト、それらの長さ、などあなたは使用することができます0-または1-インデックスを。順序がフォーマットにとって重要でない場合、出力は任意の順序になります。上記の出力をいくつかの異なる形式で示します。 list of segments: [[S],[S],[S,E,S,D,E,R,S],[R,E,S,S,S,D,R,E,E,R,E,D,E],[R,R,D,E,E,E]] list of cuts: [1,2,9,22] list of lengths: [1,1,7,13,6] dictionary: {'thief1' : [(R,R,D,E,E,E),(S),(S,E,S,D,E,R,S)], 'thief2' : [(S),(R,E,S,S,S,D,R,E,E,R,E,D,E)]} セグメントのリスト(泥棒の間で交互になっているセグメント)と長さのリスト(セグメントを識別するため)では順序が重要ですが、カットのリストや辞書では重要ではありません。編集:グレッグ・マーティンは、2つのカットで公正な分割が得られるため、これらは有効な出力ではないと指摘した。 テストケース [1,2,1,2,1,3,1,3,3,2,2,3] -> [[1,2,1],[2,1,3,1],[3,3,2],[2,3]] [1,1,1,1,2,2,3,3,3,3,3,3] -> [[1,1],[1,1,2],[2,3,3,3],[3,3,3]] [1,1,1,1,1,1,1,1,1,1,1,1] …