লাইন নম্বর - এনএল বাস্তবায়ন


13

আপনার কাজটি হ'ল nlজিএনইউ কোর ইউটিলিটিগুলি থেকে কমান্ড-লাইন সরঞ্জামের মতো একটি প্রোগ্রাম কার্যকর করা ।

স্ট্যান্ডার্ড লুফোলগুলি নিষিদ্ধ করা হয়েছে।

আপনি কোনও অন্তর্নির্মিত বা বাহ্যিক ফাংশন, প্রোগ্রাম বা ইউটিলিটি কোনও ফাইল বা স্ট্রিংয়ের লাইন সংখ্যা নির্ধারণের জন্য ব্যবহার করতে পারবেন না, যেমন nlনিজে বা =জিএনইউ সেডের কমান্ড।

সবিস্তার বিবরণী

ইনপুট

প্রোগ্রামটি আর্গুমেন্ট হিসাবে ফাইলের নাম গ্রহণ করে। আপনার কোড ক্রস প্ল্যাটফর্ম হতে হবে না; কোডটি চলমান ওএসের ফাইল নাম ফর্ম্যাটটি ব্যবহার করা উচিত, অর্থাত্ যদি আপনি উইন্ডোজটিতে থাকেন তবে ডিরেক্টরি বিভাজক হতে পারে \বা /

-নির্দিষ্ট করে দেওয়া আছে কিনা তা সহ আপনি অবশ্যই 64৪ ইনপুট ফাইল নিতে সক্ষম হবেন । যদি 64 এর বেশি দেওয়া হয় তবে কেবল প্রথম 64 টি পরিচালনা করুন।

ফাইলের নামের তালিকায়, -স্ট্যান্ডার্ড ইনপুট উপস্থাপন করে।

যদি ফাইলের নাম দেওয়া হয় তবে ফাইলগুলি যে ক্রমে দেওয়া হয়েছে সেগুলি থেকে সেগুলি পড়ুন এবং তাদের সামগ্রীর সাথে একত্রীকরণ করুন এবং প্রতিটিটির মধ্যে এবং শেষে একটি নতুন লাইন সন্নিবেশ করান। যদি আপনি এক বা একাধিক ফাইলের নাম থেকে পড়তে না পারেন (কারণ ফাইলটির অস্তিত্ব নেই বা এর জন্য আপনার কাছে পড়ার অনুমতি নেই) তবে এগুলি উপেক্ষা করুন। নির্দিষ্ট করা সমস্ত ফাইলের নাম যদি অবৈধ হয় তবে আউটপুট কিছুই হবে না।

যদি কোনও ফাইলের নাম দেওয়া না হয় তবে স্ট্যান্ডার্ড ইনপুট থেকে পড়ুন। কোনও ফাইলের নাম দেওয়া না থাকলে বা দেওয়া হলে কেবল স্ট্যান্ডার্ড ইনপুট থেকে পড়ুন -

আউটপুট

প্রোগ্রাম ইচ্ছা আউটপুট, মানক আউটপুটে, লাইন ইনপুট এইভাবে সংখ্যাযুক্ত (আপনি অনুমান হতে পারে ইনপুট আছে \n, \r\nবা \rলাইন শেষা w শ; বাছাই যেটা আপনার জন্য সুবিধাজনক, কিন্তু যা এক নির্দিষ্ট):

<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 লাইনের পরে আপনার কোনও কিছুই আউটপুট করা উচিত নয়।

ইনপুট খালি থাকলে আউটপুট কিছুই না nothing

প্রস্থান স্থিতি

নিম্ন সংখ্যাগুলি অগ্রাধিকার গ্রহণ করে: যদি 1 এবং 2 ত্রুটির মুখোমুখি হয় তবে স্থিতি 1 দিয়ে প্রস্থান করুন।

ইনপুটটি সফলভাবে পাওয়া গেলে এবং লাইনগুলি সফলভাবে নম্বরযুক্ত এবং আউটপুট প্রাপ্ত হলে স্থিতি 0 দিয়ে প্রস্থান করুন।

কমান্ড লাইনে উল্লিখিত এক বা একাধিক ফাইল খুঁজে পাওয়া না গেলে বা সেগুলি থেকে পড়তে না পারা পরিস্থিতি 1 সহ প্রস্থান করুন।

স্ট্যাটাস 2 দিয়ে প্রস্থান করুন যদি খুব বেশি ফাইল (64৪ এর বেশি) দেওয়া হয়।

ইনপুটটি দীর্ঘ (999999 লাইনের বেশি) হলে স্থিতি 3 দিয়ে প্রস্থান করুন \

স্কোরিং

এটি কোড-গল্ফ - সংক্ষিপ্ততম প্রোগ্রামের জয়!

কিছু নির্দিষ্ট বিকল্পের প্রয়োগের জন্য আমি পরে বোনাস যুক্ত করতে পারি nl। এই মুহুর্তে কোনও বোনাস নেই।


লাইন-নম্বর ক্রমাগত বা সংক্ষিপ্ত এটি প্রতিটি পৃথক ফাইলের জন্য নিজেকে "রিসেট" করে?
ব্রিটিশিয়া

@ ব্রিটিশটিয়া এটি অবিচ্ছিন্ন

1
সুতরাং, আমরা জেএস-তে কিছু জমা দিতে চাইলে নোড ব্যবহার করা কি প্রয়োজনীয়? অথবা আমরা ফাংশন আরগগুলি ব্যবহার করতে পারি বা prompt()প্রোগ্রাম আরগস এবং স্টিডিন অনুকরণ করতে পারি ?
ড্যাঙ্কমেস

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
@ ডিজিটালট্রামা আমি একটি জিনিস শিখেছি!
সম্মিলিত

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এটি কোনওভাবে ব্যবহার করে আরও কমে যেতে পারে (এমনকি এটি স্টিডিন "-"হিসাবে স্বীকৃত বলে মনে হয় )।
ব্রিটিশিয়া

ব্রিটিশটানল: 4: ইন block in <main>': undefined method [] '# # গণকের জন্য: 0x000006002980c8> (NoMethodError) ব্রিটিশটিয়ান থেকে: 2: each' from britishteanl:2:in <মেইন>' - কী ভুল? আমি এটি হিসাবে ruby britishteanl folder/filename

আমি সন্দেহ করি এটি রুবি সংস্করণে একটি পার্থক্য। আমি রুবি ২.০.০ এবং রুবি ২.১.২ উভয় ক্ষেত্রেই সমস্যা ছাড়াই চালিয়েছি। আপনি কি সংস্করণ ব্যবহার করছেন?
ব্রিটিস্তে

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মধ্যে while/ continueলুপ
  • BEGIN কোডটি (অন্তর্ভুক্ত) প্রধান অংশের আগে কার্যকর করা হবে
  • -rযদি ফাইল উপস্থিত না থাকে !-eএবং পরীক্ষার ক্ষেত্রে ডিফল্ট থাকে তবে ফাইল পরীক্ষাও ব্যর্থ হয় $_impmap { ... } @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(স্টিডিন) এর বিষয়বস্তু পড়ুন, অন্যথায় element উপাদানটির নামে থাকা ফাইলের সামগ্রীগুলি পড়ুন read যদি এটি ব্যর্থ হয় (যেমন ফাইলের অস্তিত্ব নেই), উপরের কোডটি এটি ধরবে এবং ফিরে আসবে 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 সহ ইতিমধ্যে উপস্থিত রয়েছে। $.পঠিত রেখার সংখ্যা is $*হ'ল কমান্ড লাইন আর্গুমেন্টগুলি এবং ফাইলগুলি পড়ার সাথে সাথে ফাইলগুলি পপআপ হয়। pপতাকা executes BEGINব্লক এবং কিছুদিনের-পায়-প্রিন্ট লুপ ভিতরে প্রোগ্রাম বাকি গোপন ব্যবহার $_ইনপুট / আউটপুট হিসেবে।


অনুমানটি বলছে আপনার প্রথম 64৪ টি ইনপুট হ্যান্ডেল করা উচিত যদি কেবল শুরুতে হাল ছেড়ে দেওয়ার চেয়ে 64৪ এর বেশি দেওয়া হয়।
অ্যান্ডার্স কাসেরগ

পছন্দ করেছেন
ডানিরো

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}

এটি সর্বাধিক argument৪ টি আর্গুমেন্ট এবং প্রস্থান স্থিতির সম্পর্কিত স্পেসিফিকেশনটি পূরণ করে না।
অ্যান্ডারস কাসরগ

পছন্দ করেছেন
গওথাম

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;}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.