"ট্যাক" প্রয়োগ করুন: বিপরীতে কোনও ফাইল থেকে লাইনগুলি মুদ্রণ করুন


30

মধ্যে বিড়ালছানা প্রশ্ন এবং এইজন্য ইউ & এল এ প্রশ্ন কয়েকটির বিষয়ে sedজাদু, কিভাবে সম্পর্কে বাস্তবায়নে tac?


উদ্দেশ্য

এমন একটি প্রোগ্রাম প্রয়োগ করুন যা কোনও ফাইলে লাইনগুলি বিপরীত ও মুদ্রণ করবে।


ইনপুট

একটি ফাইল, নাম হিসাবে বা স্ট্যান্ডার্ড ইনপুটের মাধ্যমে সরবরাহ করা


আউটপুট

লাইনগুলি, বিপরীত, স্ট্যান্ডার্ড আউট করতে।


স্কোরিং

উত্স কোড বাইট।


9
tacযখন পেছনের লাইনেফিড আসে তখন কিছুটা অদ্ভুত। এটি a\nb\n(ট্রেলিং লাইনফিড) b\na\nএবং a\nb(কোনও ট্রেলিং লাইনফিড) রূপান্তর করে ba\n। আমাদের কোডটি এটি আচরণ করার কথা?
ডেনিস


10
এছাড়াও, আমাদের যদি ট্যাকের আচরণের প্রতিলিপি তৈরি করতে হয় তবে 3 বাইট বাশ উত্তর দেয় যে মৃত্যুদণ্ড কার্যকর tacকরা কেবল সময়ের বিষয় ...
ডেনিস

1
@ ডেনিস এই মুহুর্তে সম্ভবত সেরা অপরিশোধিত ছেড়ে চলে যাওয়া।
নিক টি টি

1
@ ডেনিস আমাকে বোঝায়। সমস্ত ফাইলের লাইনকে অনুভূমিক সারি হিসাবে ভিজ্যুয়ালাইজ করুন \ntacএই সারিগুলির ক্রমটিকে বিপরীত করে। যদি \nফাইলের মাঝামাঝি থেকে একটি অপসারণ করা হয়, তবে এটি সারি করা সারিটি পরবর্তী সারিতে যুক্ত হবে, তবে শেষ লাইনের ক্ষেত্রে যোগ দেওয়ার জন্য পরবর্তী কোনও সারি নেই।
ব্ল্যাকলাইট জ্বলজ্বল

উত্তর:


15

জিএস 2, 3 বাইট

* +

তিনটি বাইট হ'ল, ক্রম অনুসারে বিভক্ত লাইন, বিপরীত এবং যুক্ত লাইনগুলিতে।


9

পার্ল, 11 বাইট

$\=$_.$\}{

ঠিক মত আচরণ tac। এই কোডটির জন্য -pস্যুইচ দরকার যা আমি 1 বাইট হিসাবে গণনা করেছি।

টেস্ট রান

$ echo -en 'a\nb' | perl -pe'$\=$_.$\}{' | xxd -g 1
0000000: 62 61 0a                                         ba.
$ echo -en 'a\nb\n' | perl -pe'$\=$_.$\}{' | xxd -g 1
0000000: 62 0a 61 0a                                      b.a.

কিভাবে এটা কাজ করে

এখানে বর্ণিত হিসাবে , -pস্যুইচটি মূলত while (<>) { ... ; print }প্রোগ্রামের চারপাশে মোড়ানো হয়, সুতরাং উত্স কোডটি সমান

 while(<>)
 {
   $\ = $_ . $\
 }
 print

ইনপুট প্রতিটি লাইন জন্য, আমরা বর্তমান লাইন ( $_) থেকে $\(প্রাথমিকভাবে অপরিবর্তিত) পূর্বে, ফলাফল সঙ্গে উত্তরোত্তর আপডেট।

সমস্ত লাইন প্রক্রিয়া করার পরে, printস্থানীয় ভেরিয়েবলের মান প্রিন্ট করে $_(এই সুযোগে অপরিবর্তিত), তারপরে আউটপুট রেকর্ড বিভাজক ( $\)।


এটি কিভাবে কাজ করে তা বোঝানোর জন্য যত্নশীল?
xebtl

2
পুনঃটুইট -pস্যুইচ যুক্ত করা আপনার কোডটিকে একটি লুপে মোড়কে দেয় যা শুরু while(<>){এবং শেষ হয় } continue { print }, যা কেবল সংশোধন করে ফিল্টারিং ইনপুটকে অনুমতি দেয় $_$\=$_.$\আউটপুট রেকর্ড টার্মিনেটরে প্রতিটি লাইন ইনপুট প্রিপেন্ড করে এবং সময় }{পূর্বে পার্ল সরবরাহিত whileব্লকটি শেষ করে , তাই continueব্লকটি আর এর সাথে যুক্ত থাকে না। সুতরাং ইনপুটটির সমস্ত লাইনগুলি $\বিপরীত ক্রমে যুক্ত করা হয়, তারপরে শেষ continue { print }পর্যন্ত শেষ হয় "কিছুই না" মুদ্রণ ( $_ইনপুট শেষ হওয়ার পরে অপরিবর্তিত হবে), তবে একটি টার্মিনেটর সহ $\
hobbs

@ xebtl grr, মন্তব্যে কোড বিন্যাস কিছুটা ভাঙা মনে হচ্ছে যেখানে ব্যাকস্ল্যাশ এবং ব্যাকটিকগুলি একে অপরের কাছে আসে। আমি কী বলতে চাইছিলাম তা সম্ভবত আপনি অনুমান করতে পারেন।
hobbs

1
@ প্রিমো প্রথম উদাহরণটি দেখায় যে এই ক্ষেত্রে কী ঘটে। আউটপুটটি অদ্ভুত হবে তবে একেবারে ট্যাকের মতো।
ডেনিস

1
@Dennis পৃষ্ঠাগুলির 18 FF এই বই
msh210

8

পাইথ, 4 বাইট

j_.z

.z, ইনপুট একটি তালিকা হিসাবে লাইন দিয়ে আলাদা করা হয় _এটা reverses এবং jএকটি অক্ষর, যা ডিফল্টভাবে হয় দ্বারা এটি যোগদান করে \n



7

রেটিনা , 7 বাইট

!rm`.*$

একটি একক রেজেক্সের সাথে, রেটিনা ম্যাচ মোডে চলে। এটি সাধারণত ম্যাচের সংখ্যা প্রিন্ট করে তবে !আমরা এটির পরিবর্তে আসল ম্যাচগুলি মুদ্রণের জন্য কনফিগার করেছি (লাইনফিড দ্বারা আলাদা)।

আসল রেজেক্স নিছক .*$.*যে কোনও লাইনের সাথে মিল রয়েছে (সম্ভাব্য খালি), কারণ .লাইনফিড ছাড়া অন্য কোনও অক্ষরের সাথে মেলে। আমি $এক মিনিটের মধ্যে পৌঁছে যাব ।

আমরা কীভাবে এটি বিপরীতে ম্যাচগুলি মুদ্রণ করব? .NET- র ডান থেকে বামে ম্যাচিং মোডটি ব্যবহার করে, দিয়ে সক্রিয় করা হয়েছে r। এর অর্থ ম্যাচগুলি সন্ধান করার সময় এবং রেগেক্স ইঞ্জিনটি স্ট্রিংয়ের শেষে শুরু হয় এবং পিছনের দিকে কাজ করে।

অবশেষে, mতোলে $ম্যাচে শেষে লাইন স্ট্রিংয়ের শেষ প্রান্ত বদলে। কেন আমাদের এমনকি এটি প্রয়োজন? সমস্যাটি হচ্ছে .*বহিরাগত ম্যাচগুলি উত্পন্ন করে। রেজেক্স বিকল্পটি বিবেচনা করুন

s/a*/$0x/

ইনপুট প্রয়োগ baaababaa। আপনি ভাবেন যে baaaxbaxbaaxএটি পেতে পারে তবে এটি আপনাকে দেয় baaaxxbaxxbaaxx। কেন? কারণ aaaইঞ্জিনের কার্সারটি মিলানোর পরে aএবং এর মধ্যে রয়েছে b। এখন এটি আর আর মেলাতে পারে না a, তবে a*খালি স্ট্রিং দিয়ে সন্তুষ্ট। এর অর্থ, প্রতিটি একক ম্যাচের পরে আপনি আর একটি খালি ম্যাচ পান।

আমরা এখানে এটি চাই না, কারণ এটি অতিরিক্ত খালি রেখাগুলি প্রবর্তন করবে, তাই আমরা ম্যাচগুলির শেষে অন্তর্ভুক্ত করে ম্যাচগুলি আবশ্যক করে matches বাহ্যিক ম্যাচগুলি (যা লাইনগুলির শুরুতে ডান থেকে বাম মোডের কারণে রয়েছে) বাতিল করে দেই লাইন.


6

হাস্কেল, 34 বাইট

main=interact$concat.reverse.lines

[সম্পাদনা]

প্রতিস্থাপন পর এক বাইট সংরক্ষিত unlinesসঙ্গে concat


4

সিজেম, 7 বাইট

qN/W%N*

স্টিডিন পড়েন, প্রিন্ট করে স্টাডাউট করুন।

ব্যাখ্যা:

q       Get input.
N/      Split at newlines.
W%      Reverse list.
N*      Join with newlines.


4

বেফুঞ্জ -৩৩, ১ by বাইট

~:1+!#v_
>:#,_@>$

এখানে অভিনব কিছুই নয়; কেবল স্ট্যাকের উপর সবকিছু রাখুন, তারপরে এটি পপ অফ করুন।


4

খাঁটি বাশ (কোনও বাহ্যিক উপযোগ নেই), 56

mapfile a
for((i=${#a[@]};i--;));{
printf %s "${a[i]}"
}

ডেনিসের মন্তব্যেtac যেমন জিজ্ঞাসা করা হয়েছে, ঠিক অনুকরণ করার জন্য এটি কয়েকটি জবাবগুলির মধ্যে একটি :

$ echo -en 'a\nb' | ./tacemu.sh | xxd -g 1
0000000: 62 61 0a                                         ba.
$ echo -en 'a\nb\n' | ./tacemu.sh | xxd -g 1
0000000: 62 0a 61 0a                                      b.a.
$ 

সুন্দর এবং অনুপ্রেরণামূলক
manatwork


4

জাভাস্ক্রিপ্ট (স্পাইডারমনকি শেল), 38 বাইট

[...read(readline())].reverse().join``

বেশ সহজ


read() একটি ফাইল পড়ে

readline() STDIN থেকে একটি স্ট্রিং পড়ে reads

[...str]বিভক্ত হবে Str অক্ষর একটি অ্যারের মধ্যে

reverse() অ্যারে বিপরীত হবে

join`` অ্যারে একটি স্ট্রিং মধ্যে collpase হবে


4

পাইথন 2, 52 বাইট

import sys;print''.join(sys.stdin.readlines()[::-1])

1
স্ট্যান্ডিন থেকে ইনপুট () এক লাইন পড়ে না?
লিন

@ মরিস এটি সম্পাদনা করেছেন
বিটা

কি হবে import sys;print sys.stdin.read()[::-1]?
ডাইটার

@ ডিটার যা প্রতিটি চরিত্রকে উল্টো করে দেয়, চ্যালেঞ্জটি কেবল লাইনগুলি উল্টে ফেলার জন্য জিজ্ঞাসা করে
বিটা ডিকায়

ঠিক আছে আমার খারাপ - এটি মনোযোগ সহকারে পড়েনি, দুঃখিত
ডাইটার 16

4

সি #, 179 171 বাইট

using B=System.Console;class A{static void Main(){var a=new System.Collections.Stack();string b;while((b=B.ReadLine())!=null)a.Push(b);foreach(var c in a)B.WriteLine(c);}}

লাইনগুলি পড়ায়, এগুলি একটি স্ট্যাকের মধ্যে রেখে, এবং তারপরে সেগুলি পিছনের দিকে লিখে। আমি এটির জন্য ম্যাথেমেটিকাকে ব্যবহার করব তবে এটি ইওএফটির কোনও ধারণা নেই।


3

সেড, 9 বাইট

1!G;h;$!d

কোনও উত্সাহ চেয়েছিল না, এটি একটি বিখ্যাত সেড ওয়ান-লাইনার।


10
যদি এটি আপনার নিজের কাজ না হয় তবে আমি আপনার উত্তর সম্প্রদায়ের উইকি বানানোর পরামর্শ দিচ্ছি।
lirtosiast


3

পাওয়ারশেল, 41 বাইট

$a=$args|%{gc $_};[array]::Reverse($a);$a

ফাইল লাইনের বিষয়বস্তু লাইনে রেখে সংরক্ষণ করে a, বিপরীত হয় aএবং শেষ পর্যন্ত এটি মুদ্রণ করে।



3

বার্লেস্ক , 6 বাইট

ln<-uN

lnবিচ্ছিন্ন লাইন, <-বিপরীতমুখী, uNকাঁচা আউটপুট জন্য লাইন এবং ফর্ম্যাট যোগ।


3

বাশ, 48 43 টি অক্ষর

(দ্বারা অনুপ্রাণিত ডিজিটাল ট্রমা এর ব্যাশ উত্তর । ধারণা জন্য Upvotes তার কাছে যেতে উচিত।)

mapfile -c1 -C's=$2$s;set'
printf %s "$2$s"

নমুনা রান:

bash-4.3$ echo -en 'a\nb' | bash tac.sh | xxd -g 1
0000000: 62 61 0a                                         ba.

bash-4.3$ echo -en 'a\nb\n' | bash tac.sh | xxd -g 1
0000000: 62 0a 61 0a                                      b.a.

আমি মনে করি আপনি mapfile -c1 -Cfপরিবর্তে করতে পারেন mapfile -c1 -Cf a
ডিজিটাল ট্রমা

সঠিক। আমি এর মধ্যে এটিও আবিষ্কার করেছিলাম, -Cপ্রথমে প্রথমে সেই কৌতূহলের আশপাশে কিছু চেষ্টা করেছি ।
manatwork

3

জিএনইউ আওক, ২ characters টি অক্ষর

(দ্বারা অনুপ্রাণিত এড মরটন এর গনুহ awk উত্তর । সি ডব্লিউ হিসাবে আমি তার সমাধান হাইজ্যাক করার উদ্দেশ্যে।)

{s=$0RT s}END{printf"%s",s}

পরিবর্তন করে নোট করুন RTRS এই পোর্টেবল মান awk হয়ে কিন্তু চূড়ান্ত সম্পর্কে newline অভাবে সংরক্ষণ করার ক্ষমতা হারায়।

নমুনা রান:

bash-4.3$ echo -en 'a\nb' | awk '{s=$0RT s}END{printf"%s",s}' | xxd -g 1
0000000: 62 61 0a                                         ba.

bash-4.3$ echo -en 'a\nb\n' | awk '{s=$0RT s}END{printf"%s",s}' | xxd -g 1
0000000: 62 0a 61 0a                                      b.a.

আপনি "% s" অপসারণ করতে পারেন
নিনজালজ

@ নিনজালজ, কেবলমাত্র যদি আমরা ধরে নিতে পারি যে ইনপুটটিতে কখনই "%" থাকবে না।
manatwork



2

হাসিয়াম , 90 বাইট 86 বাইট

use IO;func main(){c=File.readLines(args[0]);for(x=c.length-1;x>=0; println(c[x--]))0;

এখানে প্রসারিত দেখুন


1
আমি আপনাকে forসিনট্যাক্স অপব্যবহার করে এটিকে অনেক ছোট করতে পারি । এখানে
FryAmTheEggman

শুভ কল @ ফ্রিআমএইজিগম্যান! আমি এটিতে যুক্ত করেছি
জ্যাকব মিসিরিয়ান

2

সেড, 7 বাইট

G;h;$!d

এটি আমার পক্ষে কাজ করে (এবং এটি অন্য কোথাও সংক্ষিপ্ত সমাধান) তবে আমি কেন তা সত্যিই খুঁজে পেতে চাই না। আমি এটি খুঁজে না পাওয়া পর্যন্ত আমি বিখ্যাত 9-বাইট ট্রিকের সাথে চারপাশে গোলমাল করেছি। আমি অনুমান করি Gপ্রথম লাইনে আইএনও কিছু করে না?


2
আসলে কিছু করে: আপনার কোড আউটপুট শেষে একটি অতিরিক্ত নিউলাইন তৈরি করে। ( Gপ্যাটার্ন স্পেসে একটি নতুন লাইন এবং হোল্ড স্পেসের বিষয়বস্তু সংযোজন করা হয় empty খালি হোল্ড স্পেসের বিষয়বস্তু সংযোজন করা সত্যই নিরীহ হলেও, নতুন
লাইনটি

2

জাভাস্ক্রিপ্ট (নোড.জেএস), 91 বাইট

console.log(require('fs').readFileSync(process.argv[2])+"".split(d="\n").reverse().join(d))

আপনি কি বলতে চান console.log((require('fs').readFileSync(process.argv[2])+"").split(d="\n").reverse().join(d))(92 বাইট)? আপনার বর্তমান কোড লাইনগুলি বিপরীত করে না।
টুথব্রাশ

2

বাশ + সাধারণ ইউটিলিটিস, 25

tr \\n ^G|rev|tr ^G \\n|rev

এখানে ^Gএকটি আক্ষরিক হয়BEL চরিত্র। আমি ধরে নিচ্ছি ইনপুটটি কেবল প্রিন্টযোগ্য আসকিই।

এটি trসম্পূর্ণ ইনপুটটিকে এক লাইনে বিএলএস দিয়ে নতুন লাইনের পরিবর্তে উত্তর দেয়, তারপরে revসেই লাইনটি প্রসারিত করে, আবার trমাল্টলাইনে ফিরে উত্তর দেয়, তারপরে revপ্রতিটি লাইনটি আবার কাটিয়ে দেয়, পছন্দসই আউটপুট পেতে।


2

ম্যাটল্যাব, ৪৪

@(x) strjoin(fliplr(strsplit(x,'\n')),'\n');

স্ট্রিংটিকে নতুন লাইনে বিভক্ত করে, ফলাফলগুলি অ্যারে ফ্লিপ করে, তারপরে নতুন রেখার অক্ষরগুলির সাথে পুনরায় যোগদান করে।


2

জুলিয়া, 65 বাইট

open(s->print(join(reverse([l for l=readlines(s)]),"")),ARGS[1])

এটি একটি ফাইলকে কমান্ড লাইন আর্গুমেন্ট হিসাবে নেয় এবং বিপরীত ক্রমে তার লাইনগুলি মুদ্রণ করে। ট্রেলিং করা নতুন লাইনগুলি বিপরীতে, সামনের দিকে সরানো হয়tac , যা বৈধ।

Ungolfed:

function p(s::Stream)
    # Create a vector of the lines of the input stream
    L = [l for l in readlines(s)]

    # Reverse the vector and join it back into a string
    j = join(reverse(L), "")

    # Print the string to STDOUT
    print(j)
end

# Open the file specified in the first command line argument
# and apply the function p to its contents
open(p, ARGS[1])

2

বীচি , 3 + 2 = 5 বাইট

rএবং nপতাকা ব্যবহার করে ; স্টাডিন থেকে পড়া।

RVg

rপতাকায় লাইনের একটি তালিকা হিসাবে stdin এবং এটি দোকানে সার্চ g(যা সাধারণত কম্যান্ড-লাইন আরবী ভাষায় একটি তালিকা রয়েছে গ্রাম গুলি)। তারপরে আমরা সেই তালিকাটি বিপরীত করি এবং এটি স্বয়ংক্রিয়ভাবে মুদ্রিত হয়। nপতাকা কারণগুলো তালিকা একটি বিভাজক হিসেবে রাখুন NEWLINE আউটপুট যাবে।

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