팬케이크 정렬은 주걱을 스택의 어느 지점 에나 삽입 할 수 있고 그 위의 모든 팬케이크를 뒤집는 데 사용할 수있을 때 무질서한 팬케이크 스택을 크기 순서대로 정렬하는 수학 문제에 대한 구어체 용어입니다. 팬케이크 번호 P (n) 는 n 팬케이크에 필요한 최소 플립 횟수입니다 . 1
1979 년에 빌 게이츠와 크리스토스 파파 디미트리 우 (Christos Papadimitriou)는 P (n) = (5n + 5) / 3 의 상한을 입증하는 논문을 썼습니다 . 2
Gates (및 / 또는 Papadimitriou)가 개발 한 알고리즘 (1979 년 이후)을 사용하여 팬케이크 정렬을 수행하는 프로그램을 작성했다고 가정하는 것이 안전하다고 생각합니다. 게이츠는 숙련 된 프로그래머 였기 때문에이 코드를 최대한 활용하려고 시도했지만 소스 코드의 크기는 공개적으로 제공되지 않습니다 (AFAIK).
도전:
최대 플립 수가 Gates 및 Papadimitriou가 찾은 범위를 초과하지 않는 팬케이크 정렬을 수행하는 기능 / 프로그램을 만듭니다. 3 목록이 일치하는 한 목록을 오름차순 또는 내림차순으로 선택할 수 있습니다.
n <50 이라고 가정 할 수 있습니다 . 따라서 플립 수를 (임의로 선택한 n 값으로 ) 제한해야합니다 .
n P(n)
38 65
49 83
50 85
출력은 각 플립 전에 주걱의 위치 여야합니다. 출력은 0 또는 1 인덱싱 될 수 있으며 상단 또는 하단에서 계산할 경우 선택할 수 있습니다.
추가 규칙 :
- 런타임은 결정적이어야합니다.
- 고정 된 시간 제한은 없지만 50 개의 요소가있는 목록의 출력을 제공 할 수 있어야합니다.
테스트 목록 :
나는 가장 어려운 목록을 제공 할 수 없다 (그렇다면 도전 과제가 아닌 논문을 쓰겠 다). 따라서 함수 / 프로그램을 테스트 할 수있는 임의의 숫자 목록을 제공 할 것이다. 이 목록이 "쉬운"것으로 밝혀지면 다른 사람을 추가 할 수 있습니다.
9, 63, 62, 75, 45, 78, 59, 75, 69, 3, 28, 94, 51, 10, 45, 93, 97, 80, 72, 36, 80, 88, 30, 93, 84, 80, 17, 31, 6, 80, 76, 91, 9, 76, 38, 33, 22, 15, 45, 46, 15, 98, 2, 56, 90, 27, 27, 26, 69, 25
...
74, 89, 57, 52, 70, 96, 16, 5, 77, 84, 54, 13, 90, 64, 31, 80, 3, 25, 13, 19, 13, 34, 1, 79, 35, 43, 4, 19, 82, 29, 48, 95, 97, 28, 45, 62, 64, 82, 70, 34, 38, 15, 51, 83, 21, 66, 4, 42, 74, 84
...
62, 73, 7, 90, 83, 18, 12, 35, 72, 71, 99, 67, 87, 62, 65, 70, 14, 72, 55, 92, 87, 3, 7, 4, 4, 95, 49, 25, 4, 18, 49, 39, 26, 1, 45, 64, 23, 66, 39, 17, 33, 24, 58, 72, 77, 46, 99, 71, 10, 21
빌 게이츠와 파파 디미트리 우가이 도전을보고 그들의 코드를 제공 할 수 있기를 바랍니다.
3 더 나은 상한이 발견되었지만 그에 대해 신경 쓸 필요는 없습니다.