Vấn đề hoán đổi tàu kéo dài


8

Vấn đề hoán đổi tàu kéo dài

Phần 1: Vấn đề hoán đổi tàu thường

Trong CCC năm 1996 (Cuộc thi điện toán Canada), vấn đề ở Giai đoạn 2 đầu tiên là Vấn đề Hoán đổi Tàu hỏa. Bạn có thể truy cập liên kết ở đây . Về cơ bản, bạn có một loạt các chuyến tàu được đánh số và bạn muốn tìm hiểu xem bạn cần bao nhiêu giao dịch hoán đổi để có được chúng theo thứ tự, và mỗi hoạt động hoán đổi tàu cho phép bạn hoán đổi hai chuyến tàu liền kề. Vì các toa tàu có thể chạy một trong hai cách, không ai quan tâm đến thực tế là các toa tàu phải đối mặt với cách khác khi hoán đổi. Điều này là khá dễ dàng; tất cả những gì bạn cần làm là:

Tìm số bước để sắp xếp bong bóng; đó là thuật toán sắp xếp hiệu quả nhất khi bạn chỉ có thể thực hiện hoán đổi phần tử liền kề

Vì vậy, tôi đã làm một cái khó hơn.

Phần 2: Thử thách này hoạt động như thế nào

Về cơ bản, bây giờ bạn có thể trao đổi nhiều hơn là chỉ các tàu liền kề. Với một nền tảng xoay dài hơn, bạn có thể trao đổi vị trí của nhiều chuyến tàu. Ví dụ, với một nền tảng xoay có chiều dài 4, bạn có thể trao đổi cả cặp bên trong và bên ngoài cùng một lúc, do đó 1 2 3 4trở thành 4 3 2 1. Dưới đây là một số ví dụ cho các kích thước nền tảng xoay khác nhau:

Length 2:
1 2 3 4 5
  ---
1 3 2 4 5

Length 3:
1 2 3 4 5
  -----
1 4 3 2 5

Length 4:
1 2 3 4 5
-------
4 3 2 1 5

Về cơ bản, bạn chỉ đang đảo ngược một danh sách con của toàn bộ chuyến tàu. Để làm rõ, trong mỗi lần di chuyển, bạn chỉ có thể trao đổi chính xác N các chuyến tàu.

Phần 3: Thông số kỹ thuật

Đầu vào

Đầu vào của bạn phải có hai điều: chiều dài của nền tảng quay và thứ tự của toa xe lửa. Bạn cũng có thể yêu cầu số lượng toa tàu nếu bạn muốn. Thứ tự của các toa tàu được đưa ra bởi một danh sách các số theo thứ tự (mỗi số đại diện cho một toa tàu), vì vậy bạn có thể đọc đầu vào dưới dạng các số nguyên được phân tách bằng dấu cách, các số nguyên được phân tách bằng dòng mới, một mảng, v.v.

Đầu ra

Bạn phải xuất số lượng giao dịch hoán đổi tối thiểu (tối thiểu) cần thiết để có được tất cả các toa xe theo thứ tự 1 2 3 ... N. Nếu không có giải pháp, sản lượng -1, No solutionhoặc một số thông điệp nhất quán khác. Bạn không thể xuất ra stderr.

Chấm điểm

Đây là một thử thách , vì vậy việc ghi điểm được tính bằng byte. Giải pháp có số byte thấp nhất kể từ ngày 1 tháng 9 năm 2016 sẽ là giải pháp được chấp nhận.

Ví dụ

Vấn đề 1 Đầu vào

4
2
1 3 2 4

Đầu ra

1

Giải thích
Điều này khá tầm thường; với một nền tảng xoay có chiều dài 2, nó giống như vấn đề hoán đổi tàu thông thường. Trao đổi 23.

Vấn đề 2 Đầu vào

4
3
1 3 2 4

Đầu ra

No solution (or an equivalent consistent message).

Vấn đề 3 Đầu vào

9
3
1 4 5 6 3 8 7 2 9

Đầu ra

4

Giải trình

1 4 5 6 3 8 7 2 9
          -----
1 4 5 6 3 2 7 8 9
      -----
1 4 5 2 3 6 7 8 9
    -----
1 4 3 2 5 6 7 8 9
  -----
1 2 3 4 5 6 7 8 9

Áp dụng sơ hở tiêu chuẩn

Chúc may mắn!

EDIT 1 : Làm cho định dạng đầu vào linh hoạt hơn. Cảm ơn @Mego!
EDIT 2 : Làm rõ rằng một nền tảng xoay có chiều dài 4 hoán đổi cả cặp bên trong bên ngoài. Cảm ơn @TimmyD!
EDIT 3 : Làm rõ rằng bạn phải thực hiện hoán vị độ dài Nchính xác, không nhiều nhất. Cảm ơn @Zgarb!


5
Có một định dạng đầu vào nghiêm ngặt như vậy không phải là một ý tưởng tốt. Bất kỳ định dạng đầu vào nào, miễn là chỉ có danh sách các toa tàu (và tùy chọn độ dài của danh sách này) và chiều dài của nền tảng được truyền đi, nên được chấp nhận.
Mego

@Mego Được rồi, tôi sẽ thay đổi.
HyperNeutrino

1
Liệu một nền tảng chiều dài N lật chính xác N tàu, hoặc nhiều nhất là N tàu?
Zgarb

1
Một câu hỏi chỉ có thể có 5 thẻ. Tôi đã loại bỏ thao tác mảng vì nó quá chung chung đến mức gần như vô dụng và tôi nghĩ rằng câu hỏi được phục vụ tốt hơn bởi các thẻ cụ thể hơn mà tôi đã thêm.
Peter Taylor

Câu trả lời:


1

Perl, 120 byte

Bao gồm +6 cho -Xapi( -và không gian cũng được tính vì cả mã -i$'trong mã làm cho không thể kết hợp các tùy chọn với -e)

Chạy với đầu vào trên STDIN và độ dài nền tảng sau -itùy chọn, ví dụ:

perl -Xapi3 trains.pl <<< "1 4 5 6 3 8 7 2 9"

In -2nếu không có giải pháp

trains.pl:

1until$_=$n++*$z{pack"W*",@F}||-!grep!$z{$_}++&&/.{$^I}(??{!\$z{$`.reverse($&).$'}})$/s,keys%z,pack"W*",1..@F;$_--

nếu N <= 9sau đó bạn có thể đạt được thêm 5 byte:

1until$_=$n++*$z{join"",@F}||-!grep!$z{$_}++&&/.{$^I}(??{!\$z{$`.reverse($&).$'}})$/,keys%z,join"",1..@F;$_--

Làm tốt lắm; theo như tôi đã thử, cái này hoạt động! +1 và chấp nhận
HyperNeutrino
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.