ความท้าทายนี้เกี่ยวกับการอ่านบรรทัดสุ่มจากไฟล์ขนาดใหญ่ที่อาจเกิดขึ้นโดยไม่ต้องอ่านไฟล์ทั้งหมดลงในหน่วยความจำ
อินพุต
จำนวนเต็มn
และชื่อของไฟล์ข้อความ
เอาท์พุต
n
บรรทัดของไฟล์ข้อความที่เลือกอย่างสุ่มโดยไม่ต้องเปลี่ยน
คุณสามารถสันนิษฐานได้ว่าn
อยู่ในช่วง 1 ถึงจำนวนบรรทัดในไฟล์
ระวังเมื่อสุ่มตัวอย่างn
ตัวเลขโดยการสุ่มจากช่วงที่คำตอบที่คุณได้รับนั้นเหมือนกัน rand()%n
ใน C ไม่เหมือนกัน ทุกผลลัพธ์จะต้องมีโอกาสเท่าเทียมกัน
กฎและข้อ จำกัด
แต่ละบรรทัดของไฟล์ข้อความจะมีจำนวนอักขระเท่ากันและจะต้องไม่เกิน 80
รหัสของคุณจะต้องไม่อ่านเนื้อหาใด ๆ ของไฟล์ข้อความยกเว้น:
- สายเหล่านั้นมันออกมา
- บรรทัดแรกในการคำนวณจำนวนอักขระต่อบรรทัดในไฟล์ข้อความ
เราสามารถสมมติว่าตัวละครแต่ละตัวในไฟล์ข้อความใช้เวลาหนึ่งไบต์
ตัวแยกบรรทัดจะถือว่ามีความยาว 1 ไบต์ วิธีแก้ปัญหาอาจใช้ตัวคั่นบรรทัดยาว 2 ไบต์เฉพาะในกรณีที่พวกเขาระบุความต้องการนี้ คุณอาจจะสมมติว่าบรรทัดสุดท้ายถูกยกเลิกโดยตัวแยกบรรทัด
คำตอบของคุณควรเป็นโปรแกรมที่สมบูรณ์ แต่คุณสามารถระบุอินพุตในวิธีใดก็ได้ที่สะดวก
ภาษาและห้องสมุด
คุณสามารถใช้ภาษาหรือไลบรารีที่คุณต้องการ
หมายเหตุ
มีข้อกังวลเกี่ยวกับการคำนวณจำนวนบรรทัดในไฟล์ เมื่อ nimi ชี้ให้เห็นในความคิดเห็นคุณสามารถสรุปได้จากขนาดไฟล์และจำนวนตัวอักษรต่อบรรทัด
แรงจูงใจ
ในการแชทบางคนถามว่านี่เป็นคำถามที่ว่า "Do X ปราศจาก Y" หรือไม่ ฉันตีความสิ่งนี้เพื่อถามว่าข้อ จำกัด นั้นผิดปกติหรือไม่
งานของการสุ่มตัวอย่างบรรทัดจากไฟล์ขนาดใหญ่ไม่ใช่เรื่องแปลกและในความเป็นจริงแล้วบางครั้งฉันต้องทำ วิธีหนึ่งในการทำเช่นนี้คือการทุบตี:
shuf -n <num-lines>
อย่างไรก็ตามสิ่งนี้ช้ามากสำหรับไฟล์ขนาดใหญ่เนื่องจากอ่านได้ทั้งไฟล์
fseek
และเป็นไปไม่ได้ในผู้อื่น นอกจากนี้จะเกิดอะไรขึ้นถ้าn
มากกว่าจำนวนบรรทัดในไฟล์
sum()
ซึ่งให้ประโยชน์กับภาษาที่มี การไม่อ่านไฟล์ลงในหน่วยความจำเป็นข้อ จำกัด ที่ชัดเจนและสอดคล้องกัน สามารถทดสอบกับไฟล์ที่มีขนาดใหญ่กว่าหน่วยความจำซึ่งไม่สามารถแก้ไขได้ด้วยความแตกต่างของภาษา มันยังเกิดขึ้นกับแอปพลิเคชันในโลกแห่งความเป็นจริง (แม้ว่ามันไม่จำเป็นสำหรับกอล์ฟ ... )