Trong sắp xếp pancake , thao tác được phép duy nhất là đảo ngược các phần tử của một số tiền tố của chuỗi. Hoặc, nghĩ về một chồng bánh kếp: Chúng tôi chèn một cái thìa ở đâu đó trong chồng và lật tất cả các bánh trên thìa.
Ví dụ, chuỗi 6 5 4 1 2 3
có thể được sắp xếp bằng cách lật các 6
phần tử đầu tiên (toàn bộ chuỗi), thu được kết quả trung gian 3 2 1 4 5 6
, sau đó lật các 3
phần tử đầu tiên , đến 1 2 3 4 5 6
.
Vì chỉ có một thao tác, toàn bộ quá trình sắp xếp có thể được mô tả bằng một chuỗi các số nguyên, trong đó mỗi số nguyên là số phần tử / bánh để bao gồm pr flip. Đối với ví dụ trên, trình tự sắp xếp sẽ là 6 3
.
Một ví dụ khác: 4 2 3 1
có thể được sắp xếp với 4 2 3 2
. Đây là kết quả trung gian:
4 2 3 1
flip 4: 1 3 2 4
flip 2: 3 1 2 4
flip 3: 2 1 3 4
flip 2: 1 2 3 4
Nhiệm vụ:
Viết chương trình lấy danh sách các số nguyên và in trình tự sắp xếp bánh kếp hợp lệ.
Danh sách cần sắp xếp có thể là danh sách được phân tách bằng dấu cách từ stdin hoặc đối số dòng lệnh. In danh sách tuy nhiên nó thuận tiện, miễn là nó có thể đọc được.
Đây là cá tuyết!
Chỉnh sửa:
Như tôi đã nói trong các bình luận, bạn không cần phải tối ưu hóa đầu ra (tìm chuỗi ngắn nhất là NP-hard ). Tuy nhiên , tôi chỉ nhận ra rằng một giải pháp rẻ tiền sẽ là loại bỏ các số ngẫu nhiên cho đến khi bạn nhận được kết quả mong muốn (một loại bogosort [mới?]). Không có câu trả lời nào cho đến nay đã làm điều này, vì vậy bây giờ tôi tuyên bố rằng thuật toán của bạn không nên dựa vào bất kỳ sự ngẫu nhiên (giả) nào .
Trong khi tất cả các bạn tự đá mình, đây là một biến thể bogopancakesort trong Ruby 2.0 (60 ký tự), để đưa nó vào:
a=$*.map &:to_i
a=a[0,p(v=rand(a.size)+1)].reverse+a[v..-1]while a!=a.sort
4 3 2 1
4 2 3 1