リストの結合解除


14

前書き

ほとんどの人は、数値のリストをソートするためのマージソートアルゴリズムに精通しています。アルゴリズムの一部として、merge2つのソート済みリストを1つのソート済みリストに結合するというヘルパー関数を作成します。Pythonのような擬似コードでは、関数は通常次のようになります。

function merge(A, B):
  C = []
  while A is not empty or B is not empty:
    if A is empty:
      C.append(B.pop())
    else if B is empty or A[0] ≤ B[0]:
      C.append(A.pop())
    else:
      C.append(B.pop())
  return C

アイデアは、最初の要素の小さい飛び出る維持することであるAとのB両方のリストが空である、とに結果を収集するまでC。場合ABの両方にソートされ、その後、そうですC

逆に、if Cがソートされたリストであり、それを任意の2つのサブシーケンスに分割した場合、AおよびBAおよびBもソートされますおよびmerge(A, B) == C。興味深いことに、Cソートされていない場合、これは必ずしも当てはまらないため、この課題が発生します。

入力

あなたの入力はリストとして与えられたいくつかの最初の2*n非負整数の順列です。[0, 1, 2, ..., 2*n-1]n > 0C

出力

あなたの出力は、2つのリストが存在する場合truthy値でなければならAB長さのnようにC == merge(A, B)そうでないと、falsy値。入力には重複が含まれていないため、merge関数内でタイがどのように破損するかを心配する必要はありません。

ルールとボーナス

関数または完全なプログラムのいずれかを作成できます。最小のバイトカウントが優先され、標準の抜け穴は許可されません。

あなたがリストを計算するために必要とされていないことを注意Aし、B「はい」の場合には。ただし、実際にリストを出力すると、-20%のボーナスを受け取ります。このボーナスを請求するには、すべての可能性ではなく、1組のリストのみを出力する必要があります。強く型付けされた言語でこのボーナスを請求しやすくするために、「no」インスタンスに空のリストのペアを出力できます。

総当たり攻撃は禁止されていませんが、合計1秒未満で最後の4つのテストケースすべてを計算すると、-10%のボーナスがあります。

テストケース

「yes」インスタンスで可能な出力は1つだけです。

[1,0] -> False
[0,1] -> [0] [1]
[3,2,1,0] -> False
[0,3,2,1] -> False
[0,1,2,3] -> [0,1] [2,3]
[1,4,0,3,2,5] -> False
[4,2,0,5,1,3] -> [4,2,0] [5,1,3]
[3,4,1,2,5,0] -> [4,1,2] [3,5,0]
[6,2,9,3,0,7,5,1,8,4] -> False
[5,7,2,9,6,8,3,4,1,0] -> False
[5,6,0,7,8,1,3,9,2,4] -> [6,0,8,1,3] [5,7,9,2,4]
[5,3,7,0,2,9,1,6,4,8] -> [5,3,7,0,2] [9,1,6,4,8]
[0,6,4,8,7,5,2,3,9,1] -> [8,7,5,2,3] [0,6,4,9,1]
[9,6,10,15,12,13,1,3,8,19,0,16,5,7,17,2,4,11,18,14] -> False
[14,8,12,0,5,4,16,9,17,7,11,1,2,10,18,19,13,15,6,3] -> False
[4,11,5,6,9,14,17,1,3,15,10,12,7,8,0,18,19,2,13,16] -> [4,17,1,3,15,10,12,7,8,0] [11,5,6,9,14,18,19,2,13,16]
[9,4,2,14,7,13,1,16,12,11,3,8,6,15,17,19,0,10,18,5] -> [9,4,2,16,12,11,3,8,6,15] [14,7,13,1,17,19,0,10,18,5]

回答:


3

パイス、39 * 0.9 * 0.8 = 28.08

#aY->QxQeS-QsY&YsY)KfqylTlQmsdty_Y%tlKK

このプログラムは、2つのボーナスをすべて無効にします。マージが不可能な場合はリストのペアを出力し、そうでない場合は空のリストを出力します。これはPyth(およびPython)の偽の値です。

Input:  [5,3,7,0,2,9,1,6,4,8]
Output: ([9, 1, 6, 4, 8], [5, 3, 7, 0, 2])
Input:  [5,7,2,9,6,8,3,4,1,0]
Output: [] (falsy value)

オンラインでテストできますが、オフラインバージョンよりも少し遅い場合があります。オフラインバージョンは、ラップトップで0.15秒未満で各テストケースを解決します。

おそらく(1つ)初めて、Pythソリューションは積極的に例外を使用します(少なくとも1文字を節約しました)。Peter Taylorのソリューションと同じアイデアを使用しています。

                         preinitialisations: Q = input(), Y = []
#                 )     while 1: (infinite loop)
        eS-QsY             finds the biggest, not previous used, number
      xQ                   finds the index
    >Q                     all elements from ... to end
   -          &YsY         but remove all used elements
 aY                        append the resulting list to Y

When all numbers are used, finding the biggest number fails, 
throws an exception and the while loop ends.  
This converts [5,3,7,0,2,9,1,6,4,8] to [[9, 1, 6, 4, 8], [7, 0, 2], [5, 3]]

        msdty_Y  combine the lists each for every possible subset of Y (except the empty subset)
 fqylTlQ         and filter them for lists T with 2*len(T) == len(Q)
K                and store them in K

%tlKK        print K[::len(K)-1] (prints first and last if K, else empty list)

Pyth、30 * 0.9 = 27.0

結果のリストを印刷せずにそれを解決しようとしたことはありません。しかし、上記のコードに基づいた簡単なソリューションがあります。

#aY->QxQeS-QsY&YsY)fqylsTlQtyY

基本的にはprintステートメントのみを削除しました。ただし、出力は非常にいです。

Input:  [0,1,2,3]
Output: [[[3], [2]], [[3], [1]], [[2], [1]], [[3], [0]], [[2], [0]], [[1], [0]]] (truthy value)
Input:  [5,7,2,9,6,8,3,4,1,0]
Output: [] (falsy value)

オンラインでお試しください。


印刷ではなく、印刷(K[0], Q-K[0])できることに気付くかもしれません(K[0], K[-1])。しかし、それが節約になるかどうかはわかりません。
ピーターテイラー

@PeterTaylorありがとう、2文字節約しました。
寂部

@PeterTaylorおよびさらに2文字(印刷する場合)K[::len(K)-1]
ジャクベ

4

GolfScript(35 * 0.9 = 31.5)

{.$-1>/~,)\.}do;]1,\{{1$+}+%}/)2/&,

オンラインデモはかなり遅いです:私のコンピュータ上で、私は10%の削減を主張するので、それは、0.04秒の下にあるすべてのテストを実行します。

説明

Cの最大数で始まるCのサフィックスは、同じリストからのものでなければなりません。次に、この推論を(C-接尾辞)に適用して、問題をサブセット合計に減らすことができます。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.