Thử thách này là về việc đọc các dòng ngẫu nhiên từ một tệp có khả năng rất lớn mà không cần đọc toàn bộ tệp vào bộ nhớ.
Đầu vào
Một số nguyên n
và tên của một tệp văn bản.
Đầu ra
n
các dòng của tệp văn bản được chọn thống nhất ngẫu nhiên mà không thay thế.
Bạn có thể giả sử rằng n
trong phạm vi 1 đến số dòng trong tệp.
Hãy cẩn thận khi lấy mẫu n
số ngẫu nhiên trong phạm vi mà câu trả lời bạn nhận được là thống nhất. rand()%n
trong C không đồng nhất chẳng hạn. Mọi kết quả đều phải có khả năng như nhau.
Các quy tắc và hạn chế
Mỗi dòng của tệp văn bản sẽ có cùng số lượng ký tự và sẽ không quá 80.
Mã của bạn không được đọc bất kỳ nội dung nào của tệp văn bản ngoại trừ:
- Những dòng nó đầu ra.
- Dòng đầu tiên để tìm ra có bao nhiêu ký tự trên mỗi dòng trong tệp văn bản.
Chúng ta có thể giả sử mỗi ký tự trong tệp văn bản mất chính xác một byte.
Dấu phân cách dòng được giả sử là dài 1 byte. Các giải pháp có thể sử dụng dấu phân cách dòng dài 2 byte chỉ khi chúng chỉ định nhu cầu này. Bạn cũng có thể giả sử dòng cuối cùng được kết thúc bằng dấu phân cách dòng.
Câu trả lời của bạn phải là một chương trình hoàn chỉnh nhưng bạn có thể chỉ định đầu vào theo bất kỳ cách nào thuận tiện.
Ngôn ngữ và thư viện
Bạn có thể sử dụng bất kỳ ngôn ngữ hoặc thư viện nào bạn thích.
Ghi chú
Có một mối quan tâm về việc tính toán số lượng dòng trong tệp. Như nimi chỉ ra trong các bình luận, bạn có thể suy ra điều này từ kích thước tệp và số ký tự trên mỗi dòng.
Động lực
Trong cuộc trò chuyện, một số người hỏi liệu đây có thực sự là câu hỏi "Làm X mà không có Y" không. Tôi giải thích điều này để hỏi nếu các hạn chế là nhân tạo bất thường.
Nhiệm vụ lấy mẫu ngẫu nhiên các dòng từ các tệp lớn không phải là hiếm và trên thực tế đôi khi tôi phải làm. Một cách để làm điều này là trong bash:
shuf -n <num-lines>
Tuy nhiên, điều này rất chậm đối với các tệp lớn vì nó đọc trong toàn bộ tệp.
fseek
và không thể có trong các ngôn ngữ khác. Ngoài ra, nếu n
lớn hơn số lượng dòng trong tệp thì sao?
sum()
. Không đọc một tập tin vào bộ nhớ là một hạn chế rõ ràng và nhất quán, không có cách nào tùy tiện. Nó có thể được kiểm tra với một tệp lớn hơn bộ nhớ, không thể xử lý được bằng các khác biệt ngôn ngữ. Nó cũng có các ứng dụng trong thế giới thực (mặc dù điều đó không cần thiết cho một môn đánh gôn ...).