2017-04-24 10 views
6

मैं निम्नलिखित डी प्रोग्राम है जो आकार 3.Dlang byLineCopy लंघन लाइनों

import std.stdio; 
import std.range; 
import std.array; 

void main() 
{ 
    while (!stdin.eof) { 
    auto currentBlock = array(take(stdin.byLineCopy, 3)); 

    foreach (i, e; currentBlock) { 
     writefln("%d) %s", i, e); 
    } 
    } 
} 

के समूहों में समूह इनपुट लाइनों की अपेक्षा की और निम्न इनपुट

Mercury 
Venus 
Earth 
Mars 
Jupiter 
Saturn 
Uranus 
Neptune 
Pluto 

यह उत्पादन का उत्पादन दिया जाता है की है।

0) Mercury 
1) Venus 
2) Earth 
0) Jupiter 
1) Saturn 
2) Uranus 
0) Pluto 

प्रत्येक पुनरावृत्ति पर सीमा पर रेखा को छोड़कर (मंगल और नेप्च्यून आउटपुट में नहीं हैं)। मैं क्या गलत कर रहा हूं?

+0

एचएम मुझे लेक समारोह में एक बग की तरह लगता है। यदि आप एक ही चीज़ को प्राप्त करने के दौरान कुछ अन्य फ़ंक्शन चाहते हैं, तो '.chunks (3)' का उपयोग करें जो 3 लंबाई सीमा – WebFreak001

+0

@ WebFreak001 'chunks' की एक श्रृंखला देता है मेरे लिए काम नहीं कर रहा है। ऐसा लगता है कि 'byLineCopy' एक 'इनपुट रेंज' देता है और 'भाग' को 'फॉरवर्डरेंज' की अपेक्षा करता है। –

उत्तर

4

stdin.byLineCopycallspopFront, जिसका अर्थ है कि उसी इनपुट स्ट्रीम पर बार-बार कॉल तत्वों को छोड़ देंगे। केवल एक बार शुरू में एक byLineCopy रेंज बनाने का प्रयास करें:

void main() 
{ 
    auto r = stdin.byLineCopy; 
    while (!r.empty) { 
     foreach (i, e; r.take(3).enumerate) { 
      writefln("%d) %s", i, e); 
     } 
    } 
} 

आप eof के लिए जाँच करने के रूप में byLineCopy कि संभाल चाहिए जरूरत नहीं है।

+0

इस समाधान में मेरा व्यवहार है। क्या यह 'byLineCopy' में एक बग नहीं है? –

+0

मैं स्रोत को बदलने के लिए एक सीमा बनाने की अपेक्षा नहीं करता। श्रेणी 'एपीआई' कहती है कि हमें 'फ्रंट', फिर 'पॉपफ्रंट' कॉल करना चाहिए। हालांकि, यह 'stdin' के लिए काफी काम नहीं करता है, जहां आपको पहली बार 'फ्रंट' तक पहुंचने के लिए इसे अग्रिम करना होगा, जिसका अर्थ है कि हमें चीजों को पाने के लिए प्रारंभिक 'पॉपफ्रंट' की आवश्यकता है। आप इसे एक बग कह सकते हैं, मैं इसे एक दुर्भाग्यपूर्ण वास्तविकता कहता हूं :) – rcorre

1

लगता है कि आपने std.range.chunks चाहते हैं, सूचकांक को संरक्षित करने के std.range.enumerate के साथ संयुक्त:

void main() 
{ 
    foreach (i, chunk; stdin.byLineCopy.array.chunks(3).enumerate) { 
     writefln("%s", chunk); 
    } 
} 

ध्यान दें कि .arraychunks के रूप में की जरूरत है की आवश्यकता है एक ForwardRange जबकि stdin.byLineCopy एक InputRange है।

+1

आपका समाधान काम करता है। लेकिन, मैं पूरे इनपुट को सरणी में रखने के ऊपरी हिस्से से बचना चाहता हूं (मुझे विश्वास है कि यह '.array' करता है) जब मुझे एक समय में स्मृति में केवल एक छोटे से हिस्से की आवश्यकता होती है। यह उन कारणों में से एक है जिनसे मैंने पहली जगह 'चंक्स' के बजाय 'टेक' का उपयोग किया था। –

+0

मैं देखता हूं। मुझे लगता है कि मैंने अब एक बेहतर जवाब दिया है। यदि यह कोई मूल्य नहीं जोड़ता है तो मैं इसे हटा दूंगा। – rcorre

संबंधित मुद्दे