정렬 알고리즘에 대한 일반적인 패턴은 다음과 같습니다.
def sort(l):
while not is_sorted(l):
choose indices i, j
assert i < j
if l[i] > l[j]:
l[i], l[j] = l[j], l[i]
이 알고리즘은 인덱스 때문에 잘 작동 i
및 j
목록의 상태에 따라 신중하게 선택됩니다 l
.
그러나 우리가 볼 수없고 l
맹목적으로 선택해야한다면 어떨까요? 그러면 목록을 얼마나 빨리 정렬 할 수 있습니까?
당신의 도전은 길이가 주어진 임의의 인덱스 쌍을 출력하는 함수를 작성하는 것입니다 l
. 특히을 사용 i, j
하여 두 개의 인덱스를 출력해야합니다 0 <= i < j < len(l)
. 함수는 모든 길이의 목록에서 작동하지만 길이 100의 목록에서 점수가 매겨집니다.
점수는 위의 패턴에 따라 균일하게 무작위로 섞인 목록을 정렬하는 데 필요한 평균 인덱스 선택 수입니다. 여기서 인덱스는 함수에 따라 선택됩니다.
나는 반복적으로 참가하지 않고 길이가 100으로 균일하게 무작위로 섞인 목록에서 1000 회 이상의 시험 선택의 평균 수를 취하여 제출 점수를 매길 것입니다.
제출이 명백히 비 경쟁적이거나 종료되지 않은 경우, 더 적은 재판을 진행할 권리를 보유하며, 최고의 경쟁사를 선정하여 단일 우승자를 찾기 위해 더 많은 재판을 진행할 것입니다. 계산 리소스 한도에서 여러 개의 상위 제출이 오류 한계 내에 남아있는 경우 추가 계산 리소스를 사용할 수있을 때까지 이전 제출을 승자로 선언합니다.
다음은 파이썬에서 채점 프로그램의 예입니다.
import random
def is_sorted(l):
for x in range(len(l)-1):
if l[x] > l[x+1]:
return False
return True
def score(length, index_chooser):
steps = 0
l = list(range(length))
random.shuffle(l)
while not is_sorted(l):
i, j = index_chooser(length)
assert (i < j)
if l[i] > l[j]:
l[i], l[j] = l[j], l[i]
steps += 1
return steps
함수는 변경 가능한 상태를 유지하지 못하고 전역 변수와 상호 작용하고 목록에 영향을 줄 수 있습니다 l
. 함수의 유일한 입력은 목록의 길이 l
여야하며 범위의 정렬 된 정수 쌍을 출력해야합니다[0, len(l)-1]
(또는 언어에 적합) 목록 색인 생성). 의견에 무엇이 허용되는지 물어보십시오.
제출물은 무료 언어로 제공 될 수 있습니다. 귀하의 언어로 아직 게시되지 않은 채점 하네스를 포함하십시오. 잠정 점수를 게시 할 수는 있지만 공식 점수에 대해서는 의견을 남기겠습니다.
스코어링은 길이가 100으로 균일하게 무작위로 섞인 목록에서 정렬 된 목록까지의 평균 단계 수입니다. 행운을 빈다.