Эта задача заключается в чтении случайных строк из потенциально огромного файла без чтения всего файла в память.
вход
Целое число n
и имя текстового файла.
Выход
n
Строки текстового файла выбираются равномерно, произвольно, без замены.
Вы можете предположить, что n
находится в диапазоне от 1 до количества строк в файле.
Будьте осторожны, когда n
случайная выборка чисел из диапазона, который вы получите, является равномерным. rand()%n
в C не является равномерным, например. Каждый результат должен быть одинаково вероятным.
Правила и ограничения
Каждая строка текстового файла будет иметь одинаковое количество символов, и это будет не более 80.
Ваш код не должен читать содержимое текстового файла, кроме:
- Те строки это выводит.
- Первая строка для определения количества символов в строке в текстовом файле.
Мы можем предположить, что каждый символ в текстовом файле занимает ровно один байт.
Предполагается, что разделители строк имеют длину 1 байт. Решения могут использовать двухбайтовые разделители длинных строк, только если они указывают эту необходимость. Вы также можете предположить, что последняя строка заканчивается разделителем строк.
Ваш ответ должен быть полной программой, но вы можете указать ввод любым удобным для вас способом.
Языки и библиотеки
Вы можете использовать любой язык или библиотеку, которая вам нравится.
Примечания
Была проблема с подсчетом количества строк в файле. Как указывает Ними в комментариях, вы можете определить это по размеру файла и количеству символов в строке.
мотивация
В чате некоторые люди спрашивали, действительно ли это вопрос «Делай Х без Y». Я интерпретирую это, чтобы спросить, являются ли ограничения необычно искусственными.
Задача случайной выборки строк из огромных файлов не является чем-то необычным, и на самом деле мне иногда приходится это делать. Один из способов сделать это в bash:
shuf -n <num-lines>
Это, однако, очень медленно для больших файлов, поскольку он читает весь файл.
fseek
, и невозможно в других. Кроме того, что если n
число строк в файле больше?
sum()
. Не чтение файла в память является четким и последовательным ограничением, которое ни в коем случае не является произвольным. Его можно протестировать с файлом, превышающим объем памяти, который нельзя обойти из-за языковых различий. Также бывает, что в реальных приложениях (хотя это не обязательно для гольфа ...).