Thử thách này đặt ra một thuật toán để mã hóa một số nguyên n
dưới dạng một số nguyên khác r
. Điều gì sau đây là một lời giải thích ngắn gọn về thuật toán đó, sử dụng n=60
làm ví dụ.
Thuật toán gốc
Đầu tiên, chúng tôi mã hóa số dưới dạng một chuỗi dấu ngoặc.
- Nếu
n = 1
, trả về một chuỗi trống. - Mặt khác, chúng tôi thực hiện
n
phân tách nguyên tố được sắp xếp tăng dần và thay thế từng phần tử bằng chỉ mục chính của nó (được lập chỉ mục 1) trong ngoặc.60 = 2*2*3*5 => [1][1][2][3]
- Làm điều này đệ quy cho đến khi tất cả chúng ta có dấu ngoặc.
[1][1][2][3] => [][][[1]][[2]] => [][][[]][[[1]]] => [][][[]][[[]]]
- Nếu
Khi chúng tôi có chuỗi dấu ngoặc của mình, chúng tôi chuyển đổi nó thành một số nguyên với quy trình sau.
- Chuyển đổi từng khung mở sang a
1
và mỗi khung đóng thành a0
.[][][[]][[[]]] => 10101100111000
- Hủy bỏ tất cả dấu vết
0
và cuối cùng1
.10101100111000 => 1010110011
- Chuyển đổi chuỗi cuối cùng của
0
s và1
s từ nhị phân thành một số nguyên.1010110011 => 691
- Chuyển đổi từng khung mở sang a
Giải mã mã hóa này
Một tính chất thú vị của thuật toán này là nó không phải là tính từ. Không phải mọi số nguyên có thể là kết quả của mã hóa này.
- Thứ nhất, biểu diễn nhị phân của kết quả
r
, phảibalance-able
ở chỗ số0
s không bao giờ vượt quá số1
s. Một trường hợp thử nghiệm falsey ngắn là4
, đó là100
trong nhị phân. - Thứ hai, dấu ngoặc trong biểu diễn nhị phân phải là
sorted ascending
khi dấu cuối cùng1
và dấu cuối0
được nối thêm một lần nữa. Một trường hợp thử nghiệm falsey ngắn là12 <= 1100 <= 110010 <= (())()
.
Tuy nhiên, chỉ cần xác định nếu một số có thể giải mã theo cách này sẽ tạo ra một thách thức ngắn. Thay vào đó, thách thức là liên tục giải mã một đầu vào nhất định cho đến khi đạt được số không thể giải mã hoặc đạt được chu kỳ và trả về chuỗi số kết quả .
Các thách thức
- Cho một số
1 <= r <= 2**20 = 1048576
, trả lại chuỗi các con số màr
liên tiếp giải mã thành, bắt đầu vớir
bản thân và kết thúc với một số un-decode-thể hoặc một chu kỳ. - Nếu một số không thể giải mã được đưa ra làm đầu vào, chẳng hạn như
4
hoặc12
, sẽ trả về một danh sách chỉ chứa đầu vào. - Một chuỗi kết thúc bằng một chu kỳ nên được chỉ ra một cách nào đó, hoặc bằng cách phụ thêm hoặc thêm vào trước một dấu hiệu (chọn bất kỳ số nguyên không tích cực, chuỗi, danh sách, vv như một dấu hiệu, nhưng giữ cho nó phù hợp), hoặc bằng cách lặp đi lặp lại chu kỳ trong một cách nào đó (lặp lại yếu tố đầu tiên, lặp lại toàn bộ chu kỳ, lặp lại vô hạn, v.v.).
- Nếu bạn có bất kỳ chuỗi nào là vô hạn (chẳng hạn như tăng mãi mãi), hãy xem xét nó là hành vi không xác định.
- Đây là mã golf. Số byte nhỏ nhất sẽ thắng.
Một ví dụ hoạt động của giải mã
1 -> 1 -> 1100 -> [[]] -> [2] -> 3
-> 3 -> 11 -> 111000 -> [[[]]] -> [[2]] -> [3] -> 5
-> 5 -> 101 -> 101100 -> [][[]] -> 2*[2] -> 2*3 -> 6
-> 6 -> 110 -> 110100 -> [[][]] -> [2*2] -> [4] -> 7
-> 7 -> 111 -> 11110000 -> [[[[]]]] -> [[[2]]] -> [[3]] -> [5] -> 11
-> 11 -> 1011 -> 10111000 -> [][[[]]] -> 2*[[2]] -> 2*[3] -> 2*5 -> 10
-> 10 -> 1010 -> 101010 -> [][][] -> 2*2*2 -> 8
-> 8 -> 1000 ERROR: Unbalanced string
Các trường hợp thử nghiệm
4 -> [4]
12 -> [12]
1 -> [1, 3, 5, 6, 7, 11, 10, 8]
2 -> [2, 4]
13 -> [13, 13] # cycle is repeated once
23 -> [23, 22, 14, 17]
51 -> [51, 15, 31, 127, 5381]
691 -> [691, 60]
126 -> [126, 1787, 90907]
1019 -> [1019, 506683, 359087867, 560390368728]
Đề xuất và phản hồi cho thách thức này được chào đón nhất. Chúc may mắn và chơi golf tốt!
1
cho 3
?
1
- (nối các 1
số 0 ở cuối) -> 1100
-> [[]]
-> [[1]]
-> [2]
->3
6
-> 110
-> 110100
không hợp lệ, phải không? Vậy nên 1
cho đầu vào [1,3,5,6]
?
7
-> 111
-> 11110000
-> [[[[]]]]
-> 4 số nguyên tố = 7? Có lẽ tôi không hiểu thuật toán