Sắp xếp bánh kếp là thuật ngữ thông tục cho vấn đề toán học sắp xếp một chồng bánh kếp bị rối loạn theo thứ tự kích thước khi một thìa có thể được chèn tại bất kỳ điểm nào trong ngăn xếp và được sử dụng để lật tất cả bánh kếp lên trên nó. Số bánh kếp P (n) là số lần lật tối thiểu cần thiết cho n bánh. 1
Năm 1979, một Bill Gates và Christos Papadimitriou trẻ tuổi, đã viết một bài báo chứng minh giới hạn trên của P (n) = (5n + 5) / 3 . 2
Tôi nghĩ thật an toàn khi cho rằng Gates (và / hoặc Papadimitriou) đã viết một chương trình để thực hiện phân loại bánh kếp bằng thuật toán mà họ đã phát triển (có thể muộn hơn năm 1979). Vì Gates là một lập trình viên lành nghề, có lẽ họ đã cố gắng đánh golf mã này tốt nhất có thể, nhưng kích thước của mã nguồn không có sẵn công khai (AFAIK).
Thử thách:
Tạo một chức năng / chương trình thực hiện phân loại bánh kếp, trong đó số lần lật tối đa không vượt quá giới hạn được tìm thấy bởi Gates và Papadimitriou. 3 Bạn có thể chọn nếu bạn muốn danh sách tăng dần hoặc giảm dần, miễn là nó phù hợp.
Bạn có thể giả sử rằng n <50 . Do đó, bạn phải giới hạn số lần lật tới (một số giá trị n được chọn ngẫu nhiên ):
n P(n)
38 65
49 83
50 85
Đầu ra phải là vị trí của thìa trước mỗi lần lật. Đầu ra có thể bằng 0 hoặc một chỉ mục và bạn có thể chọn nếu bạn tính từ đầu hoặc cuối.
Quy tắc bổ sung:
- Thời gian chạy phải có tính xác định
- Không có giới hạn thời gian cố định, nhưng bạn phải có thể cung cấp đầu ra cho một danh sách với 50 yếu tố
Danh sách kiểm tra:
Tôi không thể cung cấp các danh sách khó nhất (nếu vậy, tôi sẽ viết một bài báo, không phải là một thách thức), vì vậy tôi sẽ cung cấp một số danh sách ngẫu nhiên các số bạn có thể kiểm tra các chức năng / chương trình của mình. Tôi có thể thêm những người khác nếu nó bật ra những danh sách này ở nơi "dễ dàng".
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
Hy vọng, Bill Gates và Papadimitriou sẽ thấy thách thức này và cung cấp mã của họ, để chúng tôi có thể xác định xem bạn có thực sự vượt qua họ hay không.
3 Giới hạn trên tốt hơn đã được tìm thấy, nhưng bạn không cần quan tâm đến những điều đó.