리스트 병합 해제 숫자 목록을 정렬 하기위한 병합 정렬 알고리즘에

소개

대부분의 사용자는 숫자 목록을 정렬 하기위한 병합 정렬 알고리즘에 익숙 합니다. 알고리즘의 일부로 merge두 개의 정렬 된 목록을 하나의 정렬 된 목록으로 결합 하는 헬퍼 함수를 ​​작성 합니다. 파이썬과 유사한 의사 코드에서 함수는 일반적으로 다음과 같습니다.

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입니다. Aand B가 모두 정렬 된 경우 입니다 C.

반대로, 경우는 C정렬 된 목록입니다, 우리는 두 개의 서브 시퀀스로 분할 A하고 B, 다음 AB같은 분류하고merge(A, B) == C . 흥미롭게도, C정렬 되지 않은 경우 반드시 보유하지 않아도되므로이 문제가 발생합니다.

입력

입력은 목록으로 주어진 일부 에 대한 첫 번째 2*n음이 아닌 정수 의 순열입니다.[0, 1, 2, ..., 2*n-1]n > 0C .

산출

다음 A과 같은 두 개의 목록 과 B길이의 목록이 있으면 출력값이 진실한 값이되고 그렇지 않으면 거짓 값이됩니다. 입력에 중복 항목이 없으므로 관계가 어떻게 끊어 질지 걱정할 필요가 없습니다.nC == merge(A, B)merge 함수 .

규칙 및 보너스

함수 또는 전체 프로그램을 작성할 수 있습니다. 가장 낮은 바이트 수가 이기고 표준 허점은 허용되지 않습니다.

“yes”인스턴스 A와 목록을 계산할 필요는 없습니다 B. 그러나 실제로 목록을 출력하면 -20 %보너스 를받습니다 . 이 보너스를 청구하려면 모든 가능성이 아니라 한 쌍의 목록 만 출력해야합니다. 이 보너스를 강력한 유형의 언어로 쉽게 청구 할 수 있도록 “no”인스턴스에서 빈 목록 쌍을 출력 할 수 있습니다.

무차별 강제 실행은 금지되지 않지만, 총 4 초 동안 마지막 4 개의 테스트 사례를 모두 계산할 때 -10 %보너스가 있습니다.

테스트 사례

“yes”인스턴스에는 하나의 가능한 출력 만 제공됩니다.

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


답변

Pyth, 39 * 0.9 * 0.8 = 28.08

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

이 프로그램은 두 가지 보너스를 모두받습니다. 병합이 불가능할 경우리스트 쌍을 인쇄하고, 그렇지 않으면 빈리스트는 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 초 안에 각 테스트 사례를 해결합니다.

아마도 (첫 번째) 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

나는 기본적으로 인쇄 진술 만 제거했습니다. 그래도 결과는 추악합니다.

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)

온라인으로 사용해보십시오 .


답변

GolfScript (35 * 0.9 = 31.5)

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

온라인 데모는 매우 느리다 : 내 컴퓨터에, 내가 10 %의 감소를 주장, 그래서 0.04에서 초 모든 테스트를 실행합니다.

설명

C에서 가장 큰 숫자로 시작하는 C의 접미사는 동일한 목록에서 가져와야합니다. 그런 다음이 추론을 (C-접미사)에 적용하면 문제가 부분 집합으로 줄어 듭니다.


답변

APL, 62 50 44 * 90 % = 39.6

{(l÷2)⌷↑(⊢∨⌽)/(2-/(1,⍨⍵≥⌈\⍵)/⍳l+1),⊂l=⍳l←⍴⍵}

여기에서 시도하십시오.