Nhiệm vụ là tính toán OEIS A005434 càng nhanh càng tốt.
Hãy xem xét một chuỗi nhị phân Scó độ dài n. Lập chỉ mục từ 1, chúng tôi có thể xác định xem có S[1..i+1]khớp S[n-i..n]chính xác cho tất cả itheo thứ tự từ 0đến n-1. Ví dụ,
S = 01010
cho
[Y, N, Y, N, Y].
Điều này là do 0các trận đấu 0, 01không phù hợp 10, 010các trận đấu 010, 0101không phù hợp 1010 và cuối cùng là 01010phù hợp với bản thân.
Xác định f(n)là số lượng các mảng riêng biệt của Ys và Ns nhận được khi lặp trên tất cả 2^ncác chuỗi bit có thể có Sđộ dài khác nhau n.
Người quan sát sẽ nhận thấy câu hỏi này là một biến thể đơn giản hơn của một câu hỏi gần đây của tôi . Tuy nhiên, tôi hy vọng rằng các thủ thuật thông minh có thể làm cho việc này nhanh hơn và dễ dàng hơn nhiều.
Bài tập
Để tăng nbắt đầu từ 1, mã của bạn nên xuất ra n, f(n).
Ví dụ câu trả lời
Đối với n = 1..24, câu trả lời đúng là:
1, 2, 3, 4, 6, 8, 10, 13, 17, 21, 27, 30, 37, 47, 57, 62, 75, 87, 102, 116, 135, 155, 180, 194
Chấm điểm
Mã của bạn sẽ lặp đi lặp lại từ n = 1việc đưa ra câu trả lời cho từng nlượt. Tôi sẽ thời gian chạy toàn bộ, giết nó sau hai phút.
Điểm của bạn là cao nhất nbạn đạt được trong thời gian đó.
Trong trường hợp hòa, câu trả lời đầu tiên sẽ thắng.
Mã của tôi sẽ được kiểm tra ở đâu?
Tôi sẽ chạy mã của bạn trong Virtualbox trong máy ảo khách LubFi (trên máy chủ Windows 7 của tôi).
Máy tính xách tay của tôi có RAM 8GB và CPU Intel i7 5600U@2.6 GHz (Broadwell) với 2 lõi và 4 luồng. Bộ hướng dẫn bao gồm SSE4.2, AVX, AVX2, FMA3 và TSX.
Các mục hàng đầu cho mỗi ngôn ngữ
- n = 599 trong Rust bu Anders Kaseorg.
- n = 30 in C bởi Grimy. Phiên bản song song đạt 32 khi chạy tự nhiên trong cygwin.