Ce défi consiste à lire des lignes aléatoires à partir d'un fichier potentiellement énorme sans lire l'intégralité du fichier en mémoire.
Contribution
Un entier n
et le nom d'un fichier texte.
Production
n
lignes du fichier texte choisies uniformément au hasard sans remplacement.
Vous pouvez supposer qu'il n
est compris entre 1 et le nombre de lignes du fichier.
Soyez prudent lorsque vous échantillonnez des n
nombres au hasard dans la plage où la réponse que vous obtenez est uniforme. rand()%n
en C n'est pas uniforme par exemple. Chaque résultat doit être également probable.
Règles et restrictions
Chaque ligne du fichier texte aura le même nombre de caractères et ce ne sera pas plus de 80.
Votre code ne doit pas lire le contenu du fichier texte, sauf:
- Ces lignes qu'il produit.
- La première ligne pour déterminer le nombre de caractères par ligne dans le fichier texte.
Nous pouvons supposer que chaque caractère du fichier texte prend exactement un octet.
Les séparateurs de ligne sont supposés faire 1 octet de long. Les solutions peuvent utiliser des séparateurs de ligne de 2 octets uniquement si elles spécifient ce besoin. Vous pouvez également supposer que la dernière ligne se termine par un séparateur de ligne.
Votre réponse doit être un programme complet mais vous pouvez spécifier l'entrée de la manière qui vous convient.
Langues et bibliothèques
Vous pouvez utiliser n'importe quelle langue ou bibliothèque que vous aimez.
Remarques
Il y avait une préoccupation au sujet du calcul du nombre de lignes dans le fichier. Comme le souligne nimi dans les commentaires, vous pouvez en déduire la taille du fichier et le nombre de caractères par ligne.
Motivation
Dans le chat, certaines personnes ont demandé s'il s'agissait vraiment d'une question "Do X without Y". J'interprète cela pour demander si les restrictions sont inhabituellement artificielles.
La tâche d'échantillonnage aléatoire de lignes à partir de fichiers volumineux n'est pas rare et en fait, je dois parfois le faire. Une façon de le faire est en bash:
shuf -n <num-lines>
Ceci est cependant très lent pour les fichiers volumineux car il lit dans tout le fichier.
fseek
, et impossible dans d'autres. De plus, que se passe-t-il si n
est supérieur au nombre de lignes dans le fichier?
sum()
. Ne pas lire un fichier en mémoire est une restriction claire et cohérente qui n'est en aucune façon arbitraire. Il peut être testé avec un fichier plus grand que la mémoire, qui ne peut pas être contourné par les différences de langue. Il arrive également d'avoir des applications réelles (bien que cela ne soit pas nécessaire pour un golf ...).