Ця задача полягає в тому, щоб прочитати випадкові рядки з потенційно величезного файлу без зчитування всього файлу в пам'яті.
Вхідні дані
Ціле число n
та ім'я текстового файлу.
Вихідні дані
n
рядки текстового файлу вибираються рівномірно випадково без заміни.
Ви можете припустити, що n
він знаходиться в діапазоні від 1 до кількості рядків у файлі.
Будьте уважні, відбираючи n
випадкові номери з діапазону, на який ви отримаєте відповідь, однаковий. rand()%n
наприклад, в С не є рівномірним. Кожен результат повинен бути однаково вірогідним.
Правила та обмеження
Кожен рядок текстового файлу матиме однакову кількість символів і не більше 80.
Ваш код не повинен читати жодного вмісту текстового файлу, крім:
- Ці рядки він виводить.
- Перший рядок, який визначить, скільки символів у рядку міститься в текстовому файлі.
Можна припустити, що кожен символ у текстовому файлі займає рівно один байт.
Розділювачі рядків передбачаються довжиною 1 байт. Рішення можуть використовувати 2-байтні роздільники довгих рядків, лише якщо вони визначають цю потребу. Ви також можете припустити, що останній рядок закінчується роздільником рядків.
Ваша відповідь повинна бути повноцінною програмою, але ви можете вказати вклад будь-яким зручним для вас способом.
Мови та бібліотеки
Ви можете використовувати будь-яку мову чи бібліотеку, яка вам подобається.
Примітки
Виникло занепокоєння щодо обчислення кількості рядків у файлі. Як німі вказує в коментарях, ви можете зробити це на основі розміру файлу та кількості знаків у рядку.
Мотивація
У чаті деякі люди запитували, чи це насправді питання "Зроби X без Y". Я інтерпретую це, щоб запитати, чи обмеження незвично штучні.
Завдання випадкового відбору проб з величезних файлів не є рідкістю, і насправді це те, що мені іноді доводиться робити. Один із способів зробити це в bash:
shuf -n <num-lines>
Однак для великих файлів це дуже повільно, оскільки він читається у всьому файлі.
fseek
, а в інших неможливо. Крім того, що робити, якщо n
більша кількість рядків у файлі?
sum()
. Нечитання файлу в пам'яті - це чітке і послідовне обмеження, яке аж ніяк не є довільним. Його можна протестувати з файлом, більшим за об'єм пам'яті, який неможливо обійти за допомогою мовних відмінностей. Також трапляються додатки в реальному світі (хоча це не потрібно для гольфу ...).