Tantangan ini adalah tentang membaca garis acak dari file yang berpotensi besar tanpa membaca keseluruhan file ke dalam memori.
Memasukkan
Integer n
dan nama file teks.
Keluaran
n
baris file teks dipilih secara acak secara acak tanpa penggantian.
Anda dapat mengasumsikan bahwa n
berada dalam kisaran 1 hingga jumlah baris dalam file.
Berhati-hatilah saat mengambil sampel n
angka secara acak dari rentang jawaban yang Anda dapatkan seragam. rand()%n
di C tidak seragam misalnya. Setiap hasil harus memiliki kemungkinan yang sama.
Aturan dan batasan
Setiap baris file teks akan memiliki jumlah karakter yang sama dan itu tidak akan lebih dari 80.
Kode Anda tidak boleh membaca isi file teks kecuali:
- Garis-garis itu menghasilkan.
- Baris pertama yang menentukan jumlah karakter per baris dalam file teks.
Kita dapat mengasumsikan setiap karakter dalam file teks tersebut membutuhkan tepat satu byte.
Pemisah garis dianggap panjang 1 byte. Solusi dapat menggunakan pemisah garis panjang 2 byte hanya jika mereka menentukan kebutuhan ini. Anda juga dapat menganggap baris terakhir diakhiri oleh pemisah baris.
Jawaban Anda harus merupakan program yang lengkap tetapi Anda dapat menentukan input dengan cara apa pun yang nyaman.
Bahasa dan perpustakaan
Anda dapat menggunakan bahasa atau perpustakaan apa pun yang Anda suka.
Catatan
Ada kekhawatiran tentang menghitung jumlah baris dalam file. Seperti nimi tunjukkan dalam komentar, Anda dapat menyimpulkan ini dari ukuran file dan jumlah karakter per baris.
Motivasi
Dalam obrolan, beberapa orang bertanya apakah ini benar-benar pertanyaan "Lakukan X tanpa Y". Saya menafsirkan ini untuk menanyakan apakah pembatasan itu buatan luar biasa.
Tugas pengambilan sampel secara acak dari file-file besar bukanlah hal yang tidak biasa dan bahkan kadang harus saya lakukan. Salah satu cara untuk melakukan ini adalah di bash:
shuf -n <num-lines>
Namun ini sangat lambat untuk file besar karena membaca di seluruh file.
fseek
, dan tidak mungkin dalam bahasa lain. Selain itu, bagaimana jika n
lebih besar dari jumlah baris dalam file?
sum()
. Tidak membaca file ke dalam memori adalah pembatasan yang jelas dan konsisten yang sama sekali tidak sewenang-wenang. Ini dapat diuji dengan file yang lebih besar dari memori, yang tidak dapat diselesaikan dengan perbedaan bahasa. Itu juga kebetulan memiliki aplikasi dunia nyata (walaupun itu tidak diperlukan untuk golf ...).