Hãy xem xét quá trình "chọn" một danh sách lồng nhau. Chọn được định nghĩa như sau:
- Nếu đối số là một danh sách, hãy lấy một phần tử từ danh sách một cách ngẫu nhiên (thống nhất) và chọn từ đó.
- Nếu đối số không phải là một danh sách, chỉ cần trả lại nó.
Một ví dụ triển khai trong Python:
import random
def pick(obj):
if isinstance(obj, list):
return pick(random.choice(obj))
else:
return obj
Để đơn giản, chúng tôi giả định rằng danh sách lồng nhau chỉ chứa số nguyên hoặc danh sách lồng nhau.
Với bất kỳ danh sách nào, có thể tạo ra một phiên bản phẳng không thể phân biệt bằng cách pick
chọn từ nó mang lại kết quả tương tự, với cùng một xác suất.
Ví dụ: "chọn làm phẳng" danh sách
[1, 2, [3, 4, 5]]
mang lại danh sách
[1, 1, 1, 2, 2, 2, 3, 4, 5]
. Lý do đơn giản làm phẳng là không hợp lệ là vì các yếu tố của danh sách phụ có xác suất được chọn thấp hơn, ví dụ: trong danh sách [1, [2, 3]]
1 có 2/4 = 1/2 cơ hội được chọn trong khi cả 3 và 4 đều có 1/4 cơ hội từng.
Cũng lưu ý rằng chọn từ danh sách đơn tương đương với chọn từ phần tử của nó và việc chọn từ danh sách trống không có ý nghĩa.
Các thách thức
Đưa ra một danh sách các số nguyên không âm lồng nhau, trả về một danh sách các số nguyên không âm được làm phẳng từ đó chọn kết quả cho cùng kết quả với cùng một xác suất.
Đây là môn đánh gôn , vì vậy câu trả lời hợp lệ ngắn nhất (tính bằng byte) sẽ thắng.
Thông số kỹ thuật
- Các đầu vào
[2, 3, 4]
,[2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4]
và[2, [3, 3], [[4]]]
tương đương (nghĩa là chúng sẽ cho kết quả tương đương). - Các đầu ra
[2, 2, 2, 2, 3, 3, 3, 3]
và[2, 3]
tương đương (nghĩa là một trong hai có thể là đầu ra). - Bạn chỉ có thể giả sử các số trong phạm vi bao gồm 1-100 sẽ có mặt trong danh sách.
- Bạn có thể giả sử đầu vào cấp cao nhất sẽ là một danh sách, tức
2
là không phải là đầu vào hợp lệ. - Bạn có thể sử dụng bất kỳ đại diện hợp lý các danh sách lồng nhau, ví dụ:
[1, [2, 3]]
,1 {2 3}
,"[ 1 [ 2 3 ] ]"
vv - Thay vì danh sách, bạn có thể xuất nhiều trang hoặc ánh xạ hoặc, vì chỉ cho phép các số trong phạm vi 1-100, danh sách số nguyên dài 100 đại diện cho số lượng.
Các trường hợp thử nghiệm
Lưu ý rằng các đầu ra được liệt kê chỉ là một khả năng hợp lệ; xem thông số kỹ thuật cho những gì cấu thành đầu vào hoặc đầu ra hợp lệ.
format:
input -> output
[3] -> [3]
[1, [1, 1]] -> [1]
[1, [2, 3]] -> [1, 1, 2, 3]
[2, 3, [4, [5, 5, 6], 6, 7]] -> [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7]
[[1, 1, 2], [2, 3, 3]] -> [1, 2, 3]
[[1, 1, 2], [2, 3, 3, 3]] -> [1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3]