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 S
có độ 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ả i
theo thứ tự từ 0
đến n-1
. Ví dụ,
S = 01010
cho
[Y, N, Y, N, Y].
Điều này là do 0
các trận đấu 0
, 01
không phù hợp 10
, 010
các trận đấu 010
, 0101
không phù hợp 1010
và cuối cùng là 01010
phù 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 Y
s và N
s nhận được khi lặp trên tất cả 2^n
cá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 n
bắ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 = 1
việc đưa ra câu trả lời cho từng n
lượ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 n
bạ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.