소개
n
개체 의 임의 순열을 수행한다고 가정 합니다. 순열은 상자 안에 봉인되어 있으므로 n!
가능한 값이 무엇인지 모릅니다 . 순열을 n
개별 객체 에 적용한 경우 즉시 해당 ID를 추론 할 수 있습니다. 그러나 순열을 길이 n
이진 벡터 에만 적용 할 수 있습니다. 즉,이를 인식하기 위해 순열을 여러 번 적용해야합니다. 분명히 n
하나만 벡터에 적용하면 효과가 1
있지만 영리한 경우 log(n)
응용 프로그램으로 처리 할 수 있습니다 . 그 방법에 대한 코드는 더 길어질 것입니다 ...
이는 점수가 코드 길이와 쿼리 복잡성 의 조합 인 실험적인 문제 이며 보조 프로 시저에 대한 호출 수를 의미합니다. 사양이 약간 길기 때문에 나와 함께하십시오.
작업
당신의 임무는 0 기반 또는 1 기반 색인을 사용하여 양의 정수와 첫 번째 정수 의 순열 을 입력으로 취하는 명명 된 함수 (또는 가장 가까운 등가물) f
를 작성하는 것입니다. 출력은 순열 입니다. 그러나 순열에 직접 액세스 할 수 없습니다 . 당신이 할 수있는 유일한 것은 비트 벡터에 적용하는 것 입니다. 이를 위해 순열 과 비트 벡터를 받는 보조 함수 를 사용해야하며 , 좌표에 비트가 포함 된 순열 벡터를 반환합니다 . 예를 들면 다음과 같습니다.n
p
n
p
p
n
P
p
v
p[i]
v[i]
P([1,2,3,4,0], [1,1,0,0,0]) == [0,1,1,0,0]
당신은 다음과 같은 두 고유 한 값으로 "비트"를 대체 할 수 3
및 -4
, 또는 'a'
및 'b'
당신이 호출 할 수 있도록, 그들이 고정 될 필요하고, P
모두 [-4,3,3,-4]
와 [2,2,2,1]
동일한 호출 f
. 에 대한 정의는 P
점수에 포함되지 않습니다.
채점
주어진 입력에 대한 솔루션 의 쿼리 복잡성 은 보조 기능에 대한 호출 횟수입니다 P
. 이 측정 값을 명확하게하려면 솔루션이 결정적이어야합니다. 의사 난수 생성 번호를 사용할 수 있지만 생성기의 초기 시드도 수정해야합니다.
에서 이 저장소 는라는 파일을 찾을 수 permutations.txt
0 기반 색인 (1 기반의 경우 각 숫자를 증가)를 사용하여 505 순열, 50, 150까지의 각 길이의 5를 포함합니다. 각 순열은 자체 행에 있으며 숫자는 공백으로 구분됩니다. 점수는 이러한 입력에서 + 평균 쿼리 복잡성 의 바이트 수입니다f
. 최저 점수가 이깁니다.
추가 규칙
설명이 포함 된 코드가 선호되며 표준 허점은 허용되지 않습니다. 특히, 개별 비트는 구별 할 수 없으므로 ( Integer
물체 벡터를 제공하고 P
해당 ID를 비교할 수 없음)이 함수 P
는 입력을 다시 정렬하는 대신 항상 새 벡터를 반환합니다. f
및 의 이름 과 P
인수 순서를 자유롭게 변경할 수 있습니다 .
프로그래밍 언어로 응답 한 첫 번째 사람인 경우 P
호출 횟수도 계산하는 함수 구현을 포함하여 테스트 하네스를 포함하는 것이 좋습니다 . 예를 들어, 다음은 Python 3의 하네스입니다.
def f(n,p):
pass # Your submission goes here
num_calls = 0
def P(permutation, bit_vector):
global num_calls
num_calls += 1
permuted_vector = [0]*len(bit_vector)
for i in range(len(bit_vector)):
permuted_vector[permutation[i]] = bit_vector[i]
return permuted_vector
num_lines = 0
file_stream = open("permutations.txt")
for line in file_stream:
num_lines += 1
perm = [int(n) for n in line.split()]
guess = f(len(perm), perm)
if guess != perm:
print("Wrong output\n %s\n given for input\n %s"%(str(guess), str(perm)))
break
else:
print("Done. Average query complexity: %g"%(num_calls/num_lines,))
file_stream.close()
일부 언어에서는 그러한 하네스를 작성하는 것이 불가능합니다. 특히 Haskell은 pure 함수 P
가 호출 된 횟수를 기록 할 수 없습니다 . 이러한 이유로, 쿼리 복잡도를 계산하고이를 하네스에서 사용하는 방식으로 솔루션을 다시 구현할 수 있습니다.
abaaabababaa
와-4 3 3 3 -4 3
비트의 벡터가 될 것입니다.