소개
대부분의 사용자는 숫자 목록을 정렬 하기위한 병합 정렬 알고리즘에 익숙 합니다. 알고리즘의 일부로 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
입니다. A
and B
가 모두 정렬 된 경우 입니다 C
.
반대로, 경우는 C
정렬 된 목록입니다, 우리는 두 개의 서브 시퀀스로 분할 A
하고 B
, 다음 A
과 B
같은 분류하고merge(A, B) == C
. 흥미롭게도, C
정렬 되지 않은 경우 반드시 보유하지 않아도되므로이 문제가 발생합니다.
입력
입력은 목록으로 주어진 일부 에 대한 첫 번째 2*n
음이 아닌 정수 의 순열입니다.[0, 1, 2, ..., 2*n-1]
n > 0
C
.
산출
다음 A
과 같은 두 개의 목록 과 B
길이의 목록이 있으면 출력값이 진실한 값이되고 그렇지 않으면 거짓 값이됩니다. 입력에 중복 항목이 없으므로 관계가 어떻게 끊어 질지 걱정할 필요가 없습니다.n
C == 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-접미사)에 적용하면 문제가 부분 집합으로 줄어 듭니다.