Questa sfida riguarda la lettura di righe casuali da un file potenzialmente enorme senza leggere l'intero file in memoria.
Ingresso
Un numero intero n
e il nome di un file di testo.
Produzione
n
righe del file di testo scelte in modo uniforme a caso senza sostituzione.
Si può presumere che n
sia compreso nell'intervallo 1 rispetto al numero di righe nel file.
Prestare attenzione quando si campionano n
numeri a caso dall'intervallo in cui la risposta che si ottiene è uniforme. rand()%n
in C non è uniforme per esempio. Ogni risultato deve essere ugualmente probabile.
Regole e restrizioni
Ogni riga del file di testo avrà lo stesso numero di caratteri e non sarà più di 80.
Il tuo codice non deve leggere nessuno dei contenuti del file di testo tranne:
- Quelle linee che emette.
- La prima riga per capire quanti caratteri per riga ci sono nel file di testo.
Possiamo supporre che ogni carattere nel file di testo richieda esattamente un byte.
Si presume che i separatori di linea siano lunghi 1 byte. Le soluzioni possono utilizzare separatori di linea lunga da 2 byte solo se specificano questa esigenza. Puoi anche supporre che l'ultima riga sia terminata da un separatore di riga.
La tua risposta dovrebbe essere un programma completo ma puoi specificare l'input in qualsiasi modo sia conveniente.
Lingue e biblioteche
Puoi usare qualsiasi lingua o biblioteca che ti piace.
Appunti
C'era una preoccupazione sul calcolo del numero di righe nel file. Come sottolinea nimi nei commenti, puoi dedurlo dalle dimensioni del file e dal numero di caratteri per riga.
Motivazione
Nella chat alcune persone hanno chiesto se questa è davvero una domanda "Do X senza Y". Interpreto questo per chiedere se le restrizioni sono insolitamente artificiali.
Il compito di campionare casualmente le linee da file di grandi dimensioni non è raro ed è in effetti uno che a volte devo fare. Un modo per farlo è in bash:
shuf -n <num-lines>
Questo è tuttavia molto lento per file di grandi dimensioni in quanto viene letto nell'intero file.
fseek
, e impossibile in altri. Inoltre, cosa succede se n
è maggiore del numero di righe nel file?
sum()
. Non leggere un file in memoria è una restrizione chiara e coerente che non è affatto arbitraria. Può essere testato con un file più grande della memoria, che non può essere aggirato dalle differenze di lingua. Capita anche di avere applicazioni nel mondo reale (anche se non è necessario per un golf ...).