Phỏng đoán Collatz là một phỏng đoán rất nổi tiếng. Lấy một số nguyên dương; nếu nó chẵn, chia cho 2, khác, nhân 3 và thêm 1. Lặp lại cho đến khi bạn đạt được 1hoặc một cái gì đó khác xảy ra. Phỏng đoán là quá trình này luôn đạt được 1.
Bạn cũng có thể đảo ngược quá trình. Bắt đầu tại 1, nhân với 2 và để phân nhánh thành các multiply by 3 and add 1số, khi bạn đạt đến một số chẵn 1 (mod 3), trừ đi 1 và chia cho 3.
Một đường dẫn Collatz kết hợp cả hai, cố gắng chuyển từ số này sang số khác với bốn thao tác đó.
Ví dụ: để nhận được 20từ 1:
1 *2
2 *2
4 *2
8 *2
16 *2
5 (-1)/3
10 *2
20 *2
Bạn cũng có thể nhận được 3từ 10bằng cách trừ 1 và chia cho 3.
Với các công cụ này, bạn có thể đi qua một đường dẫn Collatz từ số này sang số khác. Ví dụ: đường dẫn từ 20đến 3là (chia cho 2), (trừ 1, chia cho 3).
Nói tóm lại, các hoạt động có sẵn là:
n * 2 always
n // 2 if n % 2 == 0
n * 3 + 1 if n % 2 == 1
(n-1) // 3 if n % 6 == 4
Lưu ý: không phải tất cả các đường dẫn Collatz đều ngắn. a(7,3)có thể chạy
7, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1, 2, 4, 8, 16, 5, 10, 3
nhưng một con đường ngắn hơn là
7, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 3
Các thách thức
Tìm độ dài của đường Collatz ngắn nhất giữa hai số nguyên dương bất kỳ pvà q.
- Đầu vào là bất kỳ hai số nguyên dương nào nhỏ hơn
2^20để tránh tràn số nguyên. Phương thức nhập liệu được để lại cho người chơi golf tùy ý. Các số nguyên có thể giống nhau, trong trường hợp đó, độ dài của đường dẫn Collatz là0. - Đầu ra phải là một số nguyên, biểu thị độ dài của đường dẫn Collatz ngắn nhất giữa
pvàq.
Các trường hợp thử nghiệm
a(2,1)
1
a(4,1)
1 # 4 -> 1
a(3,1)
6 # 3 -> 10 -> 5 -> 16 -> 8 -> 4 -> 1
a(11,12)
11 # 11 -> 34 -> 17 -> 52 -> 26 -> 13
# -> 40 -> 20 -> 10 -> 3 -> 6 -> 12
a(15,9)
20 # 46 -> 23 -> 70 -> 35 -> 106 -> 53 -> 160 -> 80 -> 40 -> 13
# -> 26 -> 52 -> 17 -> 34 -> 11 -> 22 -> 7 -> 14 -> 28 -> 9
Rất cám ơn orlp đã giúp đỡ họ trong việc làm rõ thách thức này.
Như mọi khi, nếu vấn đề không rõ ràng, xin vui lòng cho tôi biết. Chúc may mắn và chơi golf tốt!