Ý tưởng ở đây là sản xuất một mô hình gần như lặp lại. Đó là, trình tự đang được xây dựng thay đổi vào thời điểm cuối cùng để tránh sự lặp lại của một số sau đó. Phải tránh các hậu quả của loại AA và ABA (trong đó B không dài hơn A).
Ví dụ:
Tôi sẽ tiếp tục và bắt đầu bằng cách liệt kê tất cả các ví dụ nhỏ để làm cho mô tả của tôi rõ ràng hơn. Hãy bắt đầu với 0.
Hợp lệ: 0 Không hợp lệ: 00 (mẫu AA) Hợp lệ: 01 Không hợp lệ: 010 (mẫu ABA) Không hợp lệ: 011 (mẫu AA) Hợp lệ: 012 Hợp lệ: 0120 Không hợp lệ: 0121 (mẫu ABA) Không hợp lệ: 0122 (mẫu AA) Không hợp lệ: 01200 (mẫu AA) Không hợp lệ: 01201 (mẫu ABA; 01-2-01) Không hợp lệ: 01202 (mẫu ABA) Hợp lệ: 01203
Bây giờ, tôi tin tưởng mạnh mẽ rằng 4
không bao giờ cần thiết, mặc dù tôi không có bằng chứng, bởi vì tôi đã dễ dàng tìm thấy chuỗi hàng trăm ký tự chỉ sử dụng 0123
. (Có lẽ nó liên quan chặt chẽ đến việc chỉ cần ba ký tự để có các chuỗi vô hạn không có bất kỳ mẫu AA nào. Có một trang Wikipedia về điều này.)
Đầu ra đầu vào
Đầu vào là một số nguyên duy nhất, dương, khác không n
. Bạn có thể cho rằng n <= 1000
.
Đầu ra là một n
chuỗi -character không có chuỗi con nào khớp với mẫu bị cấm (AA hoặc ABA).
Đầu vào và đầu ra mẫu
>>> 1 0 >>> 2 01 >>> 3 012 >>> 4 0120 >>> 5 01203 >>> 50 01203102130123103201302103120132102301203102132012
Quy tắc
- Chỉ
0123
cho phép các nhân vật . - B không dài hơn A. Điều này là để tránh tình huống
012345
phải theo sau bởi6
vì0123451
có :1-2345-1
. Nói cách khác, trình tự sẽ là tầm thường và không thú vị. n
có thể được nhập thông qua bất kỳ phương pháp nào mong muốn, ngoại trừ mã hóa cứng.- Đầu ra có thể là một danh sách hoặc một chuỗi, tùy thuộc vào cái nào dễ hơn.
- Không có lực lượng vũ phu ; thời gian chạy nên theo thứ tự phút, nhiều nhất là một giờ trên máy thực sự chậm
n=1000
. (Điều này nhằm loại bỏ các giải pháp chỉ lặp qua cácn
hoán vị toàn phần{0,1,2,3}
, do đó, mánh khóe và các thủ thuật tương tự không được phép.) - Các sơ hở tiêu chuẩn không được phép, như thường lệ.
- Ghi điểm được tính bằng byte. Đây là môn đánh gôn , vì vậy bài dự thi ngắn nhất sẽ thắng (có thể - xem phần thưởng).
- Tiền thưởng: chọn chữ số thấp nhất được phép ở mỗi bước. Nếu
1
và3
là các lựa chọn có thể cho chữ số tiếp theo trong chuỗi, hãy chọn1
. Trừ 5 byte từ điểm số của bạn. Tuy nhiên, hãy lưu ý các lưu ý dưới đây.
Ghi chú!
Kết thúc là có thể. Chương trình hoặc chức năng của bạn phải tránh những điều này. Đây là một ví dụ:
Stump: 012031021301011010010130210312013232 Stump: 012031021301011010010130210312013232 Stump: 0120310213012310320130210301 Stump: 012031021301011010010130210312013232
Mỗi chuỗi này không thể được mở rộng thêm nữa (không sử dụng a 4
). Nhưng cũng lưu ý rằng có một sự khác biệt quan trọng giữa hai đầu tiên và hai thứ hai. Tôi sẽ thay thế phần tiếp theo ban đầu được chia sẻ bằng một X
để làm cho điều này rõ ràng hơn.
Gốc cây: X2130120 Gốc cây: X2130123 Gốc cây: X320 Gốc cây: X321301203102130
Hai chữ số cuối cùng X
là 10
, vì vậy các lựa chọn khả dĩ duy nhất cho chữ số tiếp theo là 2
và 3
. Lựa chọn 2
dẫn đến một tình huống trong đó trình tự phải chấm dứt. Thuật toán tham lam sẽ không hoạt động ở đây. (Dù sao, không phải không quay lại.)
n
, nhưng cho rằng các gốc cây mà chương trình của tôi tìm thấy có xu hướng dài hơn trung bình 10 chữ số mỗi lần, tôi rất chắc chắn rằng một chuỗi vô hạn tồn tại. Tôi không chắc làm thế nào một thuật toán nửa tham lam có thể được kiểm tra cho các chuỗi lớn tùy ý. Tôi có thể hạn chế các yêu cầu để n
= 1000 và chỉ không lo lắng về cao n
.
AA
thực sự gõ ABA
nơi B
trống. Điều này có lẽ có thể giúp hợp lý hóa một số giải pháp.
n
? Nếu ai đó đưa ra một thuật toán bán tham lam heuristic, làm thế nào bạn sẽ kiểm tra xem nó không gặp vấn đề trong một thời gian rất lớn? Vấn đề chung là một vấn đề thú vị và tôi không thể tìm thấy bất cứ điều gì về việc tránh mẫu mà chúng tôi giới hạn độ dài của một phần của mẫu. Nếu ai đó có thể tạo ra một công thức chung, tôi hy vọng đó là cách tiếp cận tốt nhất.