Chu kỳ mã hóa theo chiều dài


26

Xem xét một số chuỗi nhị phân, sử dụng 12, ví dụ:

1, 2, 1, 1, 2, 2, 1, 2, 1, 2, 2, 1 ...

Hãy viết ra chiều dài của nó:

1, 2, 1, 1, 2, 2, 1, 2, 1, 2, 2, 1 ...
_  _  ____  ____  _  _  _  ____
1, 1, 2,    2,    1, 1, 1, 2,   ...

Trong trường hợp này, chúng tôi tình cờ nhận được một chuỗi nhị phân khác. Tất nhiên, điều đó không được đảm bảo (ví dụ: nếu chúng tôi lặp lại quy trình, lần chạy thứ ba sẽ là 3), nhưng giả sử chúng tôi làm.

Bây giờ câu hỏi là, chúng ta có thể tìm thấy một chuỗi sao cho việc áp dụng loại mã hóa độ dài chạy này nhiều lần sẽ cho chúng ta trở lại trình tự ban đầu không? Đối với độ dài chu kỳ là 1 (tức là một điểm cố định của phép chuyển đổi này), chúng tôi tìm thấy chuỗi Oldenburger-Kolakoski (mục OEIS A0000002 ):

1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, ...

(Thực sự có một giải pháp khác: chúng ta cũng có thể bỏ qua phần đầu 1.)

Một chu kỳ dài 2 thì sao? Điều đó cũng có thể! Hai chuỗi sau đây là danh sách độ dài chạy của nhau:

1, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, ...
2, 1, 2, 2, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, ...

(Đây là các mục OEIS A025142A025143 . Đây là giải pháp duy nhất.)

Chúng ta có thể tìm thấy một chu kỳ dài 3 không? Chắc chắn, ở đây mỗi chuỗi là mã hóa độ dài chạy tiếp theo (và chuỗi thứ ba là mã hóa độ dài chạy của đầu tiên):

1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, ...
1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2, 1, ...
2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, ...

Trong trường hợp này có một giải pháp khác. Nó chỉ ra rằng chúng ta có thể tìm thấy một chu kỳ như vậy cho mỗi chiều dài chu kỳ. Trong thực tế, số chu kỳ riêng biệt có độ dài n được đưa ra bởi mục nhập OEIS A001037 (đây không tính sự lựa chọn tùy ý trong đó trình tự trong một chu kỳ được coi là đầu tiên).

Sự thật thú vị: Có vẻ như không có vẻ gì, thử thách này được lấy cảm hứng từ việc nghiên cứu bản đồ phức tạp f(z) = z - 1/z. Bất cứ ai tìm ra bản đồ đó phải làm gì với thử thách này đều nhận được cookie.

Các thách thức

Cho chiều dài chu kỳ k > 0và độ dài chuỗi n > 0, xuất ra các số hạng đầu tiên ncủa kchuỗi nhị phân riêng biệt (vô hạn) tạo thành một chu kỳ theo phép biến đổi độ dài chạy ở trên. Nếu có nhiều chu kỳ tồn tại, bạn có thể xuất bất kỳ một trong số chúng. Tùy thuộc vào bạn bắt đầu chuỗi nào trong chu kỳ và hướng đi của chu kỳ (vì vậy bạn có thể xuất chúng sao cho mỗi chuỗi mô tả tiếp theo hoặc sao cho mỗi chuỗi mô tả chuỗi trước đó theo chu kỳ).

Bạn có thể viết chương trình hoặc hàm, lấy đầu vào qua STDIN (hoặc thay thế gần nhất), đối số dòng lệnh hoặc đối số hàm và xuất kết quả qua tham số STDOUT (hoặc thay thế gần nhất), tham số trả về hàm hoặc tham số hàm (out).

Đầu ra có thể ở bất kỳ định dạng danh sách lồng nhau thuận tiện, rõ ràng, lồng nhau, sao cho kích thước bên ngoài kvà kích thước bên trong là n.

Luật tiêu chuẩn được áp dụng.

Ví dụ bổ sung

Dưới đây là một số ví dụ. Nhưng như tôi đã nói, các giải pháp không phải là duy nhất, vì vậy các giải pháp của riêng bạn có thể khác nhau và vẫn đúng. Có lẽ những điều này sẽ giúp bạn đưa ra một giải pháp mặc dù. Mỗi ví dụ được k ntheo sau bởi các chuỗi, sao cho mỗi dòng mô tả tiếp theo (theo chu kỳ):

4 20
1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2
2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1
2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1
1, 1, 2, 2, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1

5 6
2, 2, 1, 2, 2, 1
1, 1, 2, 2, 1, 2
2, 1, 2, 2, 1, 1
1, 1, 2, 1, 1, 2
2, 1, 2, 2, 1, 2

8 20
2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2
1, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2, 1, 1
2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2
2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2, 2, 1, 2, 2
1, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1
2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2
1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1
2, 1, 2, 2, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 2, 1, 1, 2, 1, 1

13 50
1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1
1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1
1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2
1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2
1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2
1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2
2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1
1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1
1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 1
1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1
1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 2
1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 1
1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1

Lưu ý rằng không phải tất cả các dòng trong hai đầu ra cuối cùng đều khác nhau, mặc dù cuối cùng chúng sẽ nđủ lớn.

Câu hỏi liên quan


1
Chúng ta có thể xuất ra một danh sách các máy phát điện không?
Máy

@CatsAreFluffy Không, xin lỗi. (Có thể lần sau ...)
Martin Ender

Câu trả lời:


6

CJam (41 byte)

{Ma*{1:Bm<{1+ee{(1&B^)+}%e~A<0:B;}%}@:A*}

Đây là một hàm ẩn danh nhận đầu vào trên ngăn xếp theo thứ tự n kvà để lại đầu ra trên ngăn xếp. Bản demo trực tuyến

Ý tưởng cơ bản là bắt đầu với một cột từ Lyndon [2 1 1 1 ...]và lặp đi lặp lại ngay trên cơ sở biết được phần tử ban đầu của mỗi hàng và sự xen kẽ chúng ta có thể giải mã độ dài chạy và nhận được nhiều phần tử hơn.


3

Haskell, 72 byte

~(a:b)?c=c:[c|a>1]++b?(3-c)
k!n=take k$take n<$>last(k!n)?2:map(?1)(k!n)

Bản giới thiệu:

*Main> 4!20
[[2,1,1,2,2,1,2,2,1,2,1,1,2,1,1,2,2,1,2,1],[1,1,2,1,2,2,1,1,2,1,1,2,2,1,2,2,1,2,1,1],[1,2,1,1,2,1,1,2,2,1,2,1,1,2,1,2,2,1,1,2],[1,2,2,1,2,1,1,2,1,2,2,1,1,2,1,1,2,1,2,2]]

1
Làm tốt lắm, cuối cùng! :) Bạn có phiền khi thêm một lời giải thích cho những người không Haskell? :)
Martin Ender
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.