लाइन नंबरिंग - लागू करें nl


13

आपका कार्य nlGNU कोर उपयोगिताओं से कमांड-लाइन टूल के समान एक कार्यक्रम को लागू करना है ।

मानक खामियों पर रोक लगाई जाती है।

आप किसी फ़ाइल या स्ट्रिंग की रेखाओं को गिनने के लिए किसी भी अंतर्निहित या बाहरी फ़ंक्शन, प्रोग्राम या उपयोगिता का उपयोग नहीं कर सकते हैं, जैसे कि nlस्वयं या =GNU sed में कमांड।

विशिष्टता

इनपुट

कार्यक्रम तर्कों को तर्क के रूप में स्वीकार करता है। आपके कोड को क्रॉस-प्लेटफ़ॉर्म नहीं होना चाहिए; कोड चलाने वाले OS के फ़ाइल नाम प्रारूप का उपयोग किया जाना चाहिए, अर्थात यदि आप विंडोज पर होते हैं, तो निर्देशिका विभाजक \या हो सकता है /

यदि आप -निर्दिष्ट हैं , तो आपको 64 इनपुट फ़ाइलें लेने में सक्षम होना चाहिए । यदि 64 से अधिक दिए गए हैं, तो केवल पहले 64 को संभालें।

फ़ाइल नाम की सूची में, -मानक इनपुट का प्रतिनिधित्व करता है।

यदि फ़ाइलनाम दिए गए हैं, तो फ़ाइलों को उस क्रम में पढ़ें, जो उन्हें दिए गए हैं और उनकी सामग्री को संक्षिप्त करते हैं, प्रत्येक के बीच और अंत में एक नई पंक्ति सम्मिलित करते हैं। यदि आप एक या अधिक फ़ाइल नाम से नहीं पढ़ सकते हैं (क्योंकि फ़ाइल मौजूद नहीं है या आपके पास इसके लिए पढ़ने की अनुमति नहीं है), तो उन्हें अनदेखा करें। यदि निर्दिष्ट सभी फ़ाइलनाम अमान्य हैं, तो आउटपुट कुछ भी नहीं है।

यदि कोई फ़ाइल नाम नहीं दिया गया है, तो मानक इनपुट से पढ़ें। यदि कोई फ़ाइल नाम नहीं दिया गया है या दिया गया है तो केवल मानक इनपुट से पढ़ें -

उत्पादन

कार्यक्रम आउटपुट के लिए, मानक आउटपुट के लिए, इस तरह से लाइनों के साथ इनपुट (आप मान सकते हैं कि इनपुट है \n, \r\nया \rलाइन अंत; जो भी आपके लिए सुविधाजनक हो; लेकिन जो एक निर्दिष्ट करें):

<5 spaces>1<tab><content of line 1 of input>
<5 spaces>2<tab><content of line 2 of input>
...
<4 spaces>10<tab><content of line 10 of input>
...
<3 spaces>100<tab><content of line 100 of input>
...
...

अंतरिक्ष के 6 अक्षर लाइन नंबर के लिए आवंटित किए जाते हैं, और इसे इन पात्रों के अंत में डाला जाता है; बाकी स्थान बन जाते हैं (जैसे 15 प्रमुख स्थान 22होंगे, 4 प्रमुख स्थान होंगे, ...)। यदि इनपुट पर्याप्त रूप से लंबा है, तो आप अंततः लाइन पर, लाइन नंबर के लिए अंतरिक्ष से बाहर चलेंगे 999999। आपको लाइन 999999 के बाद कुछ भी आउटपुट नहीं करना चाहिए।

यदि इनपुट खाली है, तो आउटपुट कुछ भी नहीं है।

बाहर निकलने की स्थिति

निचली संख्या प्राथमिकता लेती है: यदि त्रुटियाँ 1 और 2 का सामना करना पड़ा, तो स्थिति 1 से बाहर निकलें।

स्थिति के साथ बाहर निकलें 0 यदि इनपुट सफलतापूर्वक प्राप्त हुआ था, और लाइनें सफलतापूर्वक क्रमांकित और आउटपुट।

स्थिति 1 के साथ बाहर निकलें यदि कमांड लाइन पर निर्दिष्ट एक या अधिक फाइलें नहीं मिली थीं या उनसे पढ़ी नहीं जा सकीं।

स्थिति 2 के साथ बाहर निकलें अगर बहुत सारी फाइलें (64 से अधिक) दी गई थीं।

यदि इनपुट बहुत लंबा था (तो 999999 लाइनों से अधिक) स्थिति 3 से बाहर निकलें। "

स्कोरिंग

यह कोड-गोल्फ है - सबसे छोटा कार्यक्रम जीत!

मैं कुछ विकल्पों को लागू करने के लिए बाद में बोनस जोड़ सकता हूं nl। फिलहाल कोई बोनस नहीं है।


क्या प्रत्येक व्यक्ति की फ़ाइल के लिए लाइन-नंबरिंग निरंतर या संक्षिप्त है?
ब्रिटिश

@britishtea यह निरंतर है

1
तो क्या नोड का उपयोग करना आवश्यक है यदि हम js में कुछ सबमिट करना चाहते हैं? या क्या हम फ़ंक्शन आर्ग या prompt()प्रोग्राम आर्ग और स्टड का अनुकरण कर सकते हैं ?
DankMemes

1
बाइनरी फाइलें? एन्कोडिंग? यूनिकोड मार्कर?
edc65

जवाबों:


6

बैश, 121

s=$[2*($#>64)]
for f in "$@";{ [ -f $f ]||s=1;}
((s))&&exit $s
awk '{if(NR>=10**6){exit 3}printf("%6d\t%s\n",NR,$0)}' $@

1
ifयदि आप अंकगणितीय अभिव्यक्तियों का उपयोग करते हैं, तो आप अपने भावों को थोड़ा कम कर सकते हैं, जैसे(($#>64))&&s=2
डिजिटल ट्रामा

2
@DigitalTrauma मैंने एक चीज़ सीखी!
सैममिच

1
आप बदल सकते हैं s=0;(($#>64))&&s=2के साथ s=$[2*($#>64)], (($s==0))||के साथ ((s))&&और ifसाथ बयान [ -f "$f" ]||s=1
डेनिस


2
awkकई फ़ाइलों को पारित कर दिया, तो यह भी संक्षिप्त होगा, इसलिए यह आधिकारिक तौर पर बिल्ली के बेकार उपयोग के रूप में गिना जाता है; ;-) इसके बजाय मुझे लगता है कि यह काम करेगा:awk '...' $@
डिजिटल ट्रॉमा

2

रूबी, 195

o,l=$*[64]?[2]:[],999999
($*==[]?[?-]:$*).each{|n|f=n==?-?STDIN: open(n)rescue o<<1&&next
s=f.read.lines
s[l]?o<<3:1
puts s[0..l].map.with_index(1){|l,i|i.to_s.rjust(6)+?\t+l}}
exit !o[0]?0:o.min

मुझे लगता STDINहै कि इसके लिए अलियास है $<
मार्टिन एंडर

यह उर्फ ​​के लिए है ARGF, जो बाकी फाइलों के साथ-साथ तर्कों के रूप में भी पढ़ेगा। मुझे लगता है कि ARGFइसे किसी तरह इस्तेमाल करके आगे बढ़ाया जा सकता है (यह स्टडिन के "-"रूप में पहचाना भी जाता है)।
ब्रिटिश

britishteanl: 4: in block in <main>': undefined method [] 'के लिए # <Enumerator: 0x000006002980c8> (NoMethodError) britishteanl से: 2: each' from britishteanl:2:in <main>' में - क्या गलत है? मैंने इसे इस रूप में चलायाruby britishteanl folder/filename

मुझे संदेह है कि यह रूबी संस्करण में अंतर है। मैंने रूबी 2.0.0 और रूबी 2.1.2 दोनों पर नमूना समस्याओं के बिना चलाया है। आप कौन सा संस्करण उपयोग कर रहे हैं?
ब्रिटिश

2

पर्ल, 84 + 2 ( -pl) = 86 बाइट्स

perl -ple'BEGIN{map{-r||exit 1}@ARGV;@ARGV>63&&exit 2}$.>=1e6&&exit 3;$_=printf"%5d\t%s",$.,$_'

Deparsed:

perl -MO=Deparse -ple'BEGIN{map{-r||exit 1}@ARGV;@ARGV>63&&exit 2}$.>=1e6&&exit 3;$_=printf"%5d\t%s",$.,$_' output.txt; echo $?

BEGIN { $/ = "\n"; $\ = "\n"; }
sub BEGIN {
    map {exit 1 unless -r $_;} @ARGV;
    exit 2 if @ARGV > 63;
}
LINE: while (defined($_ = <ARGV>)) {
    chomp $_;
    exit 3 if $. >= 1000000;
    $_ = printf("%5d\t%s", $., $_);
}
continue {
    die "-p destination: $!\n" unless print $_;
}
-e syntax OK

यह जानना महत्वपूर्ण है:

  • -p/ लूप -eमें दिए गए प्रोग्राम को लपेटता हैwhilecontinue
  • BEGIN कोड (निहित) मुख्य भाग से पहले निष्पादित किया जाएगा
  • फ़ाइल परीक्षण -rभी विफल रहता है यदि फ़ाइल मौजूद नहीं है !-eऔर परीक्षण के लिए चूक है $_, तो संक्षेप में दिया गया हैmap { ... } @ARGV
  • $. वर्तमान लाइन नंबर रखती है
  • बाकी आत्म-व्याख्यात्मक होना चाहिए;)

महान जवाब, और प्रोग्रामिंग पहेलियाँ और कोड गोल्फ में आपका स्वागत है! शायद आप यह समझाने के लिए संपादन कर सकते हैं कि आपका कोड कैसे काम करता है।
wizzwizz4

1

अजगर १ 173३

import os,sys
c=0
l=1
for f in sys.argv[1:]:
    if c>64:exit(2)
    if not os.path.isfile(f):exit(1)
    c+=1
    for x in open(f):
        if l>=10**6:exit(3)
        print '%6d\t%s'%(l,x),;l+=1

मैं अपने कोड वर्तमान में याद आ रही है लगता है -के लिए sys.stdin। एक संभावित समाधान कुछ ऐसा हो सकता है fh=sys.stdin if f=='-' else open(f)और फिर साथ जाना x=fh.readline()चाहिए! दुर्भाग्य से यह हालांकि इसे कोई छोटा नहीं बनाता है। :)
डेव जे।

1

जे (162)

exit(((2*64<#)[exit@3:`(stdout@(,&LF)@;@(,&TAB@(6&":)&.>@>:@i.@#,&.>]))@.(1e6>#)@(<;.2)@(1!:1)@(<`3:@.('-'-:]))&.>@;@{.@(_64&(<\))) ::1:)]`(]&<&'-')@.(0=#)2}.ARGV

स्पष्टीकरण:

  • ]`(]&<&'-')@.(0=#)2}.ARGV: कमांड लाइन तर्क प्राप्त करें, और पहले दो को हटा दें (क्योंकि वे दुभाषिया और स्क्रिप्ट फ़ाइल नाम हैं)। यदि परिणामी सूची खाली है, तो वापस लौटें ['-'](जैसे कि उपयोगकर्ता केवल पास हुआ था -), अन्यथा सूची को अपरिवर्तित लौटाएं।
  • (... ::1:): यदि आंतरिक फ़ंक्शन विफल हो जाता है, तो वापस लौटें 1, अन्यथा जो भी आंतरिक फ़ंक्शन वापस लौटा है।
  • ((2*64<#)[... ): आंतरिक कार्य का मूल्यांकन करें और परिणाम को फेंक दें। फिर, यदि उत्तीर्ण सूची की लंबाई से अधिक नहीं थी 64, तो वापस लौटें 0, अन्यथा वापस लौटें 2
  • &.>@;@{.@(_64&(<\)): 64सूची से अधिकांश तत्वों को प्राप्त करें, और उनमें से प्रत्येक के लिए निम्नलिखित फ़ंक्शन चलाएं:
    • (1!:1)@(<`3:@.('-'-:])): यदि तत्व था -, तो फ़ाइल डिस्क्रिप्टर 3(स्टडिन) की सामग्री को पढ़ें, अन्यथा उस तत्व द्वारा नामित फ़ाइल की सामग्री को पढ़ें। यदि यह विफल रहता है (यानी फ़ाइल मौजूद नहीं है), तो ऊपर दिया गया कोड इसे पकड़ लेगा और वापस आ जाएगा 1
    • exit@3:`(... )@.(1e6>#)@(<;.2): स्ट्रिंग को उसकी लाइन अंत पर विभाजित करें। यदि 1.000.000 या अधिक लाइनें हैं, तो स्थिति से बाहर निकलें 3। अन्यथा:
      • ,&TAB@(6&":)&.>@>:@i.@#: प्रत्येक पंक्ति के लिए संख्याएँ बनाएँ, उन्हें 6-अंकीय कॉलम में प्रारूपित करें, और TABप्रत्येक स्ट्रिंग के अंत में एक जोड़ दें ,
      • ,&.>]: प्रत्येक पंक्ति को प्रत्येक पंक्ति के सामने जोड़ें।
      • stdout@(,&LF)@;: तब पूरी चीज़ का उत्पादन, उसके बाद एक अतिरिक्त LF
  • exit: उस फ़ंक्शन के रिटर्न मान के साथ बाहर निकलें

1

रूबी, 76 बाइट्स

pझंडे के लिए एक बाइट । के साथ चला ruby -p nl.rb

BEGIN{x=$*.size-65}
exit 2if$*.size==x
exit 3if$.>999999
$_="%6d"%$.+?\t+$_

रूडी द्वारा स्टड या फ़ाइल तर्क को स्वचालित रूप से नियंत्रित किया जाता है। यह पहले से ही कोड 1 के साथ बाहर निकलता है अगर कोई फ़ाइल तर्क मौजूद नहीं है। $.पढ़ी गई लाइनों की संख्या है। $*कमांड लाइन आर्ग्युमेंट्स हैं, और फाइल के पढ़ते ही फाइल पॉप-अप हो जाती हैं। pझंडा कार्यान्वित BEGINब्लॉक और थोड़ी देर-हो जाता है प्रिंट पाश अंदर कार्यक्रम के बाकी लपेटता, का उपयोग करते हुए $_इनपुट / आउटपुट के रूप में।


युक्ति कहती है कि आपको पहले 64 इनपुट को संभालना चाहिए यदि 64 से अधिक दिए गए हैं, बजाय केवल शुरुआत में देने के।
एंडर्स कासोर्ग

@AndersKaseorg तय
daniero

1

पर्ल, 125 122 बाइट्स

@a=@ARGV;for(@a){$i++>63&&exit 2;($_ eq '-'or-e$_)or next;@ARGV=$_;while(<>){$c>1E6-2&&exit 3;printf"%5d\t%s",++$c,$_}say}

यह 64 तर्क अधिकतम और निकास स्थिति के बारे में विनिर्देश को संतुष्ट नहीं करता है।
एंडर्स कासोर्ग

@AndersKaseorg फिक्स्ड!
गौतम

0

सी, 362 359

सिर्फ इसके मनोरंजन के लिए। ;-) एलएफ या सीआर / एलएफ लाइनफीड्स के साथ काम करता है।

#include<stdio.h>
#define R return
#define P printf(
e,t,l;void*f;r(){P"% 6d\t",++l);for(;(t=fgetc(f))^-1&&l<1000000;){if(ferror(f))R 1;P"%c",t);if(t==10)P"% 6d\t",++l);}P"\n");R l<1000000?0:3;}main(int c,char**v){e=c>65?2:0;for(++v;*v||c<2;++v){t=c<2||!strcmp(*v,"-")?f=stdin,0:!(f=fopen(*v,"rb"));if(t||(t=r()))e=!e|(e>t)?t:e;if(f&&f!=stdin)fclose(f);}R e;}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.