Este desafío se trata de leer líneas aleatorias de un archivo potencialmente enorme sin leer todo el archivo en la memoria.
Entrada
Un entero n
y el nombre de un archivo de texto.
Salida
n
líneas del archivo de texto elegidas uniformemente al azar sin reemplazo.
Puede suponer que n
está en el rango 1 al número de líneas en el archivo.
Tenga cuidado al muestrear n
números al azar del rango de que la respuesta que obtiene es uniforme. rand()%n
en C no es uniforme, por ejemplo. Cada resultado debe ser igualmente probable.
Reglas y restricciones
Cada línea del archivo de texto tendrá el mismo número de caracteres y no tendrá más de 80.
Su código no debe leer ninguno de los contenidos del archivo de texto, excepto:
- Esas líneas que emite.
- La primera línea para calcular cuántos caracteres por línea hay en el archivo de texto.
Podemos suponer que cada carácter en el archivo de texto toma exactamente un byte.
Se supone que los separadores de línea tienen 1 byte de longitud. Las soluciones pueden usar separadores de línea larga de 2 bytes solo si especifican esta necesidad. También puede suponer que la última línea termina con un separador de línea.
Su respuesta debe ser un programa completo, pero puede especificar la entrada de cualquier manera que sea conveniente.
Idiomas y bibliotecas
Puede usar cualquier idioma o biblioteca que desee.
Notas
Había una preocupación sobre el cálculo del número de líneas en el archivo. Como nimi señala en los comentarios, puede inferir esto a partir del tamaño del archivo y el número de caracteres por línea.
Motivación
En el chat, algunas personas preguntaron si esta es realmente una pregunta de "Hacer X sin Y". Interpreto esto para preguntar si las restricciones son inusualmente artificiales.
La tarea de muestrear aleatoriamente líneas de grandes archivos no es infrecuente y, de hecho, es algo que a veces tengo que hacer. Una forma de hacerlo es en bash:
shuf -n <num-lines>
Sin embargo, esto es muy lento para archivos grandes, ya que se lee en todo el archivo.
fseek
e imposible en otros. Además, ¿qué n
pasa si es mayor que el número de líneas en el archivo?
sum()
. No leer un archivo en la memoria es una restricción clara y consistente que de ninguna manera es arbitraria. Se puede probar con un archivo más grande que la memoria, que no puede ser solucionado por las diferencias de idioma. También sucede que tiene aplicaciones en el mundo real (aunque eso no es necesario para un golf ...).