यह चुनौती पूरी फ़ाइल को मेमोरी में पढ़े बिना संभावित रूप से विशाल फ़ाइल से यादृच्छिक लाइनें पढ़ने के बारे में है।
इनपुट
एक पूर्णांक n
और एक पाठ फ़ाइल का नाम।
उत्पादन
n
प्रतिस्थापन के बिना पाठ फ़ाइल की लाइनें समान रूप से यादृच्छिक रूप से चुनी गई हैं।
आप मान सकते हैं कि n
फ़ाइल में लाइनों की संख्या 1 से सीमा तक है।
जब n
आप जो उत्तर प्राप्त करते हैं उस क्रम से यादृच्छिक पर संख्याओं का नमूना करते समय सावधान रहें । rand()%n
सी में उदाहरण के लिए एक समान नहीं है। हर परिणाम समान रूप से होने की संभावना है।
नियम और प्रतिबंध
पाठ फ़ाइल की प्रत्येक पंक्ति में समान वर्ण होंगे और यह संख्या 80 से अधिक नहीं होगी।
आपके कोड को छोड़कर टेक्स्ट फ़ाइल की कोई सामग्री नहीं पढ़नी चाहिए:
- उन लाइनों यह आउटपुट।
- पाठ फ़ाइल में प्रति पंक्ति कितने वर्ण हैं, यह जानने के लिए पहली पंक्ति।
हम मान सकते हैं कि पाठ फ़ाइल में प्रत्येक वर्ण बिल्कुल एक बाइट लेता है।
लाइन विभाजकों को 1 बाइट लंबा माना जाता है। समाधान 2 बाइट लंबी लाइन विभाजक का उपयोग कर सकते हैं केवल अगर वे इस आवश्यकता को निर्दिष्ट करते हैं। आप यह भी मान सकते हैं कि अंतिम लाइन एक लाइन विभाजक द्वारा समाप्त हो गई है।
आपका उत्तर पूर्ण कार्यक्रम होना चाहिए लेकिन आप इनपुट को किसी भी तरह से निर्दिष्ट कर सकते हैं जो सुविधाजनक हो।
भाषाएं और पुस्तकालय
आप अपनी पसंद की किसी भी भाषा या लाइब्रेरी का उपयोग कर सकते हैं।
टिप्पणियाँ
फ़ाइल में लाइनों की संख्या की गणना करने के बारे में एक चिंता थी। जैसा कि निमि टिप्पणियों में बताते हैं, आप इसे फ़ाइल आकार और प्रति पंक्ति वर्णों की संख्या से अनुमान लगा सकते हैं।
प्रेरणा
चैट में कुछ लोगों ने पूछा कि क्या यह वास्तव में "वाई के बिना एक्स एक्स" सवाल है। मैं यह पूछने के लिए व्याख्या करता हूं कि क्या प्रतिबंध असामान्य रूप से कृत्रिम हैं।
बड़ी फ़ाइलों से यादृच्छिक रूप से नमूने लेने का कार्य असामान्य नहीं है और वास्तव में एक है जो मुझे कभी-कभी करना पड़ता है। ऐसा करने का एक तरीका है:
shuf -n <num-lines>
हालाँकि यह बड़ी फ़ाइलों के लिए बहुत धीमी है क्योंकि यह पूरी फ़ाइल में पढ़ती है।
fseek
, और दूसरों में असंभव है। इसके अतिरिक्त, क्या होगा अगर n
फ़ाइल में लाइनों की संख्या से अधिक है?
sum()
। फ़ाइल को मेमोरी में न पढ़ना एक स्पष्ट और सुसंगत प्रतिबंध है जो किसी भी तरह से मनमाना नहीं है। इसे मेमोरी से बड़ी फ़ाइल के साथ टेस्ट किया जा सकता है, जिसे भाषा के अंतर से काम नहीं किया जा सकता है। यह वास्तविक विश्व अनुप्रयोगों के लिए भी होता है (हालांकि यह गोल्फ के लिए आवश्यक नहीं है ...)।