Bạn có thể vượt qua Bill Gates?


13

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 đó.


Liên quan , nhưng không phải là một bản sao. Các câu trả lời sẽ không hoạt động ở đây.
Stewie Griffin

Tôi đã sử dụng BFS trong giải pháp của mình hồi đó, nó vẫn hoạt động ở đây (với một chút cập nhật) để tìm giải pháp với số lần lật tối thiểu.
dặm

@miles sau đó cảm thấy tự do để đăng nó. Tôi đã không đi qua tất cả các câu trả lời chi tiết, nhưng hầu hết chỉ sử dụng cách tiếp cận ngây thơ.
Stewie Griffin

Câu trả lời:


4

Python 2 (PyPy) , 238 235 222 byte

a=input();n=len(a);r=range(n);a=zip(a,r);a=map(sorted(a).index,a)+[n]
def s(u,m):
 if m<1:return[0]
 for k in r:
  v=u[k::-1]+u[k+1:]
  if sum(1<abs(v[i]-v[i+1])for i in r)<m:
   p=s(v,m-1)
   if p:return[k]+p
print s(a,5*n/3)

* (2 dấu cách = tab)

Hãy thử trực tuyến!

Đã lưu 13 byte mượn một phương thức để xếp hạng danh sách .

DFS với một heuristic đơn giản kiểm tra xem một lật có phân tách một cặp "bánh kếp" sẽ liền kề khi được sắp xếp hay không. Sắp xếp nó theo thứ tự tăng dần. Đầu ra là 0 - được lập chỉ mục từ bên trái trong đó 0 lật 2 đầu tiên và cứ thế. Số lượng di chuyển được sử dụng là (5/3)*n+1 < 5/3*(n+1)ở đâu (18/11)*n < (5/3)*n+1 < 5/3*(n+1)(18/11)*nlà giới hạn trên chặt chẽ hơn được tìm thấy trong năm 2009 .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.