“Tac” uygula: Bir dosyadan satırları tersten yazdır


30

Arasında yavru soru ve görme U & L bu soruyu bazıları hakkında sednasıl uygulanması hakkında, büyü tac?


Amaç

Bir dosyadaki satırları ters çevirecek ve yazdıracak bir program uygulayın.


Giriş

Bir ad veya standart giriş yoluyla sağlanan bir dosya


Çıktı

Satırlar ters çevrildi, standartlaştırıldı.


puanlama

Kaynak kodun baytları.


9
tacizleyen satır sıkıntısı söz konusu olduğunda biraz garip. Bu dönüşümleri a\nb\niçerisine (arka LF) b\na\nve a\nbiçine (Sonunda satır besleme) ba\n. Bizim kodumuz böyle mi davranmalı?
Dennis,


10
Ayrıca, tac'ın davranışını çoğaltmamız gerekiyorsa, 3 byte Bash'in yaptığı yanıtlar tacsadece bir zaman meselesidir ...
Dennis

1
@Dennis bu noktada muhtemelen tanımsız bırakmak için en iyisidir.
Nick T

1
@Dennis Bana mantıklı geliyor. Bir dosyanın satırlarını, hepsi ile biten yatay satırlar olarak görselleştirin \n. tacbu satırların sırasını tersine çevirir. Bir \ndosyanın ortasından kaldırılırsa, sonlandırıldığı satır bir sonraki satıra birleştirilir, ancak son satırda, birleştirilecek bir sonraki satır yoktur.
Blacklight Shining

Yanıtlar:


15

GS2, 3 bayt

* +

Üç bayt sırayla, satırları bölün, satırları ters çevirir ve satırlardır.


9

Perl, 11 bayt

$\=$_.$\}{

Aynen gibi davranır tac. Bu kod -p1 bayt olarak saydığım anahtarı gerektiriyor .

Test çalıştırması

$ 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.

Nasıl çalışır

As açıkladı Burada , -panahtar temelde sarar while (<>) { ... ; print }kaynak kodu eşdeğerdir, böylece program etrafında

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

Her girdi satırı için, geçerli satırı ( $_) için $\(başlangıçta tanımsız) olarak hazırlıyoruz, ikincisini sonuçla güncelliyoruz.

Tüm satırlar işlendikten sonra print, yerel değişkenin değerini $_(bu kapsamda tanımlanmamış) ve ardından çıkış kayıt ayırıcısını ( $\) yazdırın .


Bunun nasıl çalıştığını açıklamak ister misiniz?
xebtl

2
@ xebtl Evilly. -pAnahtarın eklenmesi kodunuzu başlayıp while(<>){biten bir döngüye sararak } continue { print }girişin değiştirilerek filtrelenmesine izin verir $_. $\=$_.$\her girdi satırını çıktı kayıt sonlandırıcısına hazırlar }{ve perl tarafından sağlanan whilebloğu erken sonlandırır , böylece continueblok artık ona bağlı değildir. Böylece tüm girdi satırları $\ters sırayla eklenir , ardından continue { print }sonunda çalışır, "hiçbir şey" yazdırılmaz $_(girişin sonunda belirsiz olur), ancak sonlandırıcısı ile $\.
Ocaklar

@ xebtl grr, yorumlarda kod biçimlendirme, ters eğik çizgiler ve arka çubukların birbirine yaklaştığı yerlerde biraz bozuk görünüyor. Belki de söylemeye çalıştığım şeyi tahmin edebilirsiniz.
Ocaklar

1
@primo İlk örnek, bu durumda ne olduğunu göstermektedir. Çıktılar tuhaf olacak ama aynen tac'lerinki gibi.
Dennis

1
@Dennis bu kitabın
msh210

8

Pyth, 4 bayt

j_.z

.zSatırlarla liste halinde ayrılan giriş, _onu ters çevirir ve jvarsayılan olarak olduğu gibi bir karakterle birleştirir \n.



7

Retina , 7 bayt

!rm`.*$

Tek bir regex ile, Retina Maç modunda çalışır. Bu normalde yalnızca eşleşme sayısını yazdırır, ancak !bunun yerine gerçek eşleşmeleri yazdırmak üzere yapılandırırız (satır beslemeleri ile ayrılmış).

Gerçek regex sadece .*$. .*satırlar .dışında herhangi bir karakterle eşleşebileceğinden herhangi bir satırla eşleşebilir (potansiyel olarak boş) . $Bir dakika içinde içeri gireceğim.

Kibritleri tersten nasıl yazdırabiliriz? .NET'in sağdan sola eşleme modunu kullanarak, ile etkinleştirilir r. Bu, regex motorunun, eşleşmeleri ararken geriye doğru çalıştığı ve dizenin sonunda başladığı anlamına gelir.

Son olarak, mmake $eşleşmeyi dizenin sonu yerine satırın sonuna getirir . Neden buna ihtiyacımız var? Sorun, .*yabancı eşleşmeler yaratmasıdır. Regex ikamesini düşünün

s/a*/$0x/

girişe uygulanır baaababaa. Bunun sonuç vereceğini düşünürsün baaaxbaxbaax, ama aslında sana verir baaaxxbaxxbaaxx. Niye ya? Çünkü aaamotorun imleci eşleştikten sonra ave arasındadır b. Şimdi daha fazla as eşleşemiyor, ancak a*boş bir dize ile de tatmin oluyor. Bu, her bir maçtan sonra başka bir boş maç elde edeceğiniz anlamına gelir.

Bunu istemiyoruz, çünkü ek boş satırlar ortaya koyacağından, bu yabancı eşleşmeleri ( satırın başlangıcında , sağdan sola modu nedeniyle) eşleştirmelerin sona ermesini isteyerek atarız. çizgi.


6

Haskell, 34 bayt

main=interact$concat.reverse.lines

[Düzenle]

Değiştirerek bir bayt Kaydedilen unlinesile concat.


4

CJam, 7 bayt

qN/W%N*

Stdin okur, stdout'a yazdırır.

Açıklama:

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


4

Befunge-93, 17 bayt

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

Burada hiçbir şey fantezi değil; Sadece her şeyi yığına koyun, sonra çıkarın.


4

Saf Bash (harici yardımcı program yoktur), 56

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

Bu, Dennis'in yorumundatac sorulduğu gibi, tam bir emülasyon yapmak için verilen birkaç cevaptan biri :

$ 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.
$ 

Güzel ve ilham verici .
Manatwork


4

JavaScript (SpiderMonkey Kabuğu), 38 bayt

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

Oldukça basit


read() bir dosyayı okur

readline() STDIN'den bir dize okur

[...str]str'yi bir karakter dizisine böler

reverse() diziyi tersine çevirir

join`` diziyi bir dizgeye sıkıştırır


4

Python 2, 52 bayt

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

1
İnput (), stdin'den bir satır okumuyor mu?
Lynn,

@Mauris Düzenlendi
Beta Decay

Ne hakkında import sys;print sys.stdin.read()[::-1]?
diyet

@ dieter Her karakteri tersine çeviren mücadelede sadece tersine çevrilecek satırlar isteniyor
Beta Decay

Tamam benim kötü - Dikkatlice okudum, üzgünüm
Deterya

4

C #, 179 171 bayt

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);}}

Çizgileri okur, bunları bir yığına yerleştirir ve sonra geriye doğru yazar. Bunun için Mathematica'yı kullanırdım, ancak EOF anlayışı yok.


3

sed, 9 bayt

1!G;h;$!d

İstenmeyen bir oylama yok, bu meşhur bir tek gömlek.


10
Bu sizin kendi işiniz değilse, cevap topluluk wiki yapmanızı öneririm.
lirtosiast


3

Powershell, 41 bayt

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

Bir dosyanın içeriğini satır satır asaklar, tersine çevirir ave sonunda yazdırır.



3

Burlesque , 6 bayt

ln<-uN

lnsatırları böler, <-tersine çevirir, uNham çıktı için çizgileri ve biçimleri birleştirir.


3

Bash, 48 43 karakter

(Esinlenerek Dijital Travma 'ın Bash cevap . Fikir için upvotes ona gitmelidir.)

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

Örnek çalışma:

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.

Bunun mapfile -c1 -Cfyerine yapabileceğini düşünüyorum mapfile -c1 -Cf a.
Dijital Travma

Doğru. Bu arada onu keşfettim, -Cilk önce o zorlu şeyi denedim .
Manatwork

3

GNU Awk, 27 karakter

(Esinlenerek Ed Morton 'ın GNU Awk cevap ben onun çözümünü kaçırma amaçlandığı gibi. CW.)

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

Bunu değiştirerek RTRSbunun taşınabilir bir standart Awk olduğunu ancak son satırın yokluğunu koruma yeteneğini kaybettiğini unutmayın.

Örnek çalışma:

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.


@ ninjalj, yalnızca girdinin asla “%” içermeyeceğini varsayabilirsek.
Manatwork

3

SNOBOL, 42 bayt

S S =INPUT CHAR(10) S :S(S)
 OUTPUT =S
END

2

Gema, 25 karakter

*\n=@set{s;$0${s;}}
\Z=$s

Örnek çalışma:

bash-4.3$ echo -en 'a\nb' | gema '*\n=@set{s;$0${s;}};\Z=$s'
ba

bash-4.3$ echo -en 'a\nb\n' | gema '*\n=@set{s;$0${s;}};\Z=$s'
b
a


2

sed, 7 bytes

G;h;$!d

This works for me (and it's the shortest solution elsewhere), but I don't really want to find out why. I just messed around with the famous 9-byte trick until I found this. I guess Ging the first line does nothing?


2
Actually does something: your code produces an extra newline at the end of output. (G appends a newline and the content of hold space to the pattern space. While appending the content of empty hold space is indeed harmless, the newline is still appended.)
manatwork

2

JavaScript(Node.js), 91 Bytes

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

Did you mean console.log((require('fs').readFileSync(process.argv[2])+"").split(d="\n").reverse().join(d)) (92 bytes)? Your current code does not reverse the lines.
Toothbrush

2

Bash + common utilities, 25

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

Here the ^G is a literal BEL character. I'm assuming the input is only printable ascii.

This transforms the entire input to one line by replacing newlines with BELs, then reverses that line, then transforms back to multiline, then reverses each line again, to get the desired output.


2

MATLAB, 44

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

Splits the string at new lines, flips the resulting array, then rejoins with new line characters.


2

Julia, 65 bytes

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

This takes a file as a command line argument and prints its lines in reverse order. Trailing newlines are moved to the front, unlike tac, which is legit.

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

Pip, 3 + 2 = 5 bytes

Uses the r and n flags; reads from stdin.

RVg

The r flag reads stdin and stores it as a list of lines in g (which is normally a list of command-line args). We then reverse that list, and it is auto-printed. The n flag causes lists to be output with newline as a separator.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.