Bu zorluk, tüm dosyayı belleğe okumadan potansiyel olarak büyük bir dosyadan rastgele satırları okumakla ilgilidir.
Giriş
Bir tamsayı n
ve bir metin dosyasının adı.
Çıktı
n
metin dosyasının satırları değiştirilmeden rastgele rastgele seçilmiştir.
n
Dosyadaki satır sayısı ile 1 aralığında olduğunu varsayabilirsiniz .
n
Aldığınız cevabın eşit olduğu aralıktan rastgele sayıları örneklerken dikkatli olun . rand()%n
C'de örneğin muntazam değildir. Her sonuç eşit derecede olası olmalıdır.
Kurallar ve kısıtlamalar
Metin dosyasının her satırı aynı sayıda karaktere sahip olacaktır ve bu 80'den fazla olmayacaktır.
Kodunuz aşağıdakiler dışında metin dosyasının içeriğini okumamalıdır:
- Çıkardığı çizgiler.
- Metin dosyasında satır başına kaç karakter olduğunu hesaplayan ilk satır.
Metin dosyasındaki her karakterin tam olarak bir bayt sürdüğünü varsayabiliriz.
Hat ayırıcıların 1 bayt uzunluğunda olduğu varsayılır. Çözümler, yalnızca bu gereksinimi belirttiklerinde 2 bayt uzunluğunda satır ayırıcılar kullanabilir. Ayrıca, son satırın bir satır ayırıcı tarafından sonlandığını varsayabilirsiniz.
Cevabınız tam bir program olmalıdır, ancak girdiyi uygun olan herhangi bir şekilde belirleyebilirsiniz.
Diller ve kütüphaneler
İstediğiniz dil veya kitaplığı kullanabilirsiniz.
notlar
Dosyadaki satır sayısını hesaplama konusunda bir endişe vardı. Nimi yorumlarda belirtildiği gibi, bunu dosya boyutundan ve satır başına karakter sayısından çıkarabilirsiniz.
Motivasyon
Sohbette bazı insanlar bunun gerçekten "Y olmadan X Yap" sorusu olup olmadığını sordu. Bunu, kısıtlamaların olağandışı yapay olup olmadığını sormak için yorumluyorum.
Devasa dosyalardan rasgele örnekleme görevi nadir değildir ve aslında bazen yapmak zorunda olduğum bir şeydir. Bunu yapmanın bir yolu bash'tır:
shuf -n <num-lines>
Ancak bu, tüm dosyada okunduğu gibi büyük dosyalar için çok yavaştır.
fseek
, diğerlerinde imkansızdır. Ayrıca, n
dosyadaki satır sayısından fazla olursa ne olur ?
sum()
. Bir dosyayı belleğe okumamak, hiçbir şekilde keyfi olmayan açık ve tutarlı bir kısıtlamadır. Hafızadan daha büyük bir dosya ile test edilebilir ve bu dosyalar dil farkları ile çözümlenemez. Aynı zamanda gerçek dünya uygulamalarına da sahiptir (bir golf için gerekli olmasa da ...).