Bei dieser Herausforderung geht es darum, zufällige Zeilen aus einer potenziell großen Datei zu lesen, ohne die gesamte Datei in den Speicher einzulesen.
Eingang
Eine Ganzzahl n
und der Name einer Textdatei.
Ausgabe
n
Zeilen der Textdatei werden gleichmäßig und ersatzlos zufällig ausgewählt.
Sie können davon ausgehen, dass n
der Wert zwischen 1 und der Anzahl der Zeilen in der Datei liegt.
Seien Sie vorsichtig, wenn Sie n
zufällig Zahlen aus dem Bereich entnehmen, in dem die Antwort einheitlich ist. rand()%n
in C ist zum Beispiel nicht einheitlich. Jedes Ergebnis muss gleich wahrscheinlich sein.
Regeln und Einschränkungen
Jede Zeile der Textdatei hat die gleiche Anzahl von Zeichen und das sind nicht mehr als 80.
Ihr Code darf keinen Inhalt der Textdatei lesen, außer:
- Diese Zeilen gibt es aus.
- Die erste Zeile, in der ermittelt wird, wie viele Zeichen pro Zeile in der Textdatei enthalten sind.
Wir können davon ausgehen, dass jedes Zeichen in der Textdatei genau ein Byte benötigt.
Zeilentrennzeichen werden mit einer Länge von 1 Byte angenommen. Lösungen dürfen nur dann 2 Byte lange Zeilentrennzeichen verwenden, wenn sie dies erfordern. Sie können auch davon ausgehen, dass die letzte Zeile durch einen Zeilentrenner abgeschlossen wird.
Ihre Antwort sollte ein vollständiges Programm sein, aber Sie können die Eingabe auf jede bequeme Weise festlegen.
Sprachen und Bibliotheken
Sie können eine beliebige Sprache oder Bibliothek verwenden.
Anmerkungen
Es gab Bedenken hinsichtlich der Berechnung der Anzahl der Zeilen in der Datei. Wie nimi in den Kommentaren betont, können Sie dies aus der Dateigröße und der Anzahl der Zeichen pro Zeile ableiten.
Motivation
Im Chat wurden einige Leute gefragt, ob dies wirklich eine "Do X without Y" -Frage ist. Ich interpretiere dies, um zu fragen, ob die Beschränkungen ungewöhnlich künstlich sind.
Das zufällige Abtasten von Zeilen aus riesigen Dateien ist keine Seltenheit und wird von mir manchmal ausgeführt. Eine Möglichkeit, dies zu tun, ist in Bash:
shuf -n <num-lines>
Dies ist jedoch bei großen Dateien sehr langsam, da die gesamte Datei eingelesen wird.
fseek
und in anderen unmöglich. Was n
ist , wenn die Anzahl der Zeilen in der Datei überschritten wird?
sum()
. Das Nichteinlesen einer Datei in den Speicher ist eine klare und konsistente Einschränkung, die in keiner Weise willkürlich ist. Es kann mit einer Datei getestet werden, die größer als der Arbeitsspeicher ist und die nicht durch Sprachunterschiede umgangen werden kann. Es kommt auch vor, dass es reale Anwendungen gibt (obwohl das für ein Golfspiel nicht notwendig ist ...).