Zwischen der Kätzchenfrage und der Frage bei U & L nach etwas sed
Magie, wie wäre es mit der Implementierung tac
?
Zielsetzung
Implementieren Sie ein Programm, das die Zeilen in einer Datei umkehrt und druckt.
Eingang
Eine Datei, die als Name oder über die Standardeingabe bereitgestellt wird
Ausgabe
Die Linien sind vertauscht, um zu standardisieren.
Wertung
Bytes des Quellcodes.
tac
ist etwas seltsam, wenn es um nachgestellte Zeilenvorschübe geht. Es wandelt sich ina\nb\n
(Trailing Linefeed)b\na\n
und ina\nb
(No Trailing Linefeed) umba\n
. Soll sich unser Code so verhalten?tac
wird, nur eine Frage der Zeit ...\n
.tac
kehrt die Reihenfolge dieser Zeilen um. Wenn ein\n
aus der Mitte der Datei entfernt wird, wird die abgeschlossene Zeile mit der nächsten Zeile verbunden. Bei der letzten Zeile gibt es jedoch keine nächste Zeile, zu der eine Verbindung hergestellt werden kann.Antworten:
GS2, 3 Bytes
Die drei Bytes sind in der Reihenfolge geteilte Zeilen, umgekehrte Zeilen und Verbindungszeilen.
quelle
Perl, 11 Bytes
Benimmt sich genau so
tac
. Dieser Code erfordert den-p
Schalter, den ich als 1 Byte gezählt habe.Testläufe
Wie es funktioniert
Wie hier erklärt ,
-p
umschließt der Schalterwhile (<>) { ... ; print }
das Programm im Grunde genommen , sodass der Quellcode äquivalent zu istFür jede Eingabezeile stellen wir die aktuelle Zeile voran (
$_
) vor$\
(anfangs undefiniert) und aktualisieren letztere mit dem Ergebnis.Nachdem alle Zeilen verarbeitet wurden, wird
print
der Wert der lokalen Variablen$_
(in diesem Bereich nicht definiert) gefolgt vom Trennzeichen für Ausgabedatensätze ($\
) gedruckt .quelle
-p
Schalters wird der Code in eine Schleife eingeschlossen, die beginntwhile(<>){
und endet} continue { print }
, sodass Eingaben nur durch Ändern gefiltert werden können$_
.$\=$_.$\
stellt jede Eingabezeile vor den Abschluss des Ausgabedatensatzes und}{
beendet den von Perl bereitgestelltenwhile
Block vorzeitig, sodass dercontinue
Block nicht mehr an ihn angehängt wird. Alle Eingabezeilen werden also$\
in umgekehrter Reihenfolge hinzugefügt. Am Ende wirdcontinue { print }
schließlich "nothing" ($_
wird nach dem Ende der Eingabe undef sein) ausgegeben, jedoch mit einem Abschlusszeichen von$\
.Pyth, 4 Bytes
.z
Ist die Eingabe durch Zeilen getrennt als Liste,_
kehrt sie um undj
verbindet sie mit einem Zeichen, was standardmäßig so ist\n
.quelle
FlogScript , 2 Bytes
(Versuchen Sie es auf Anarchie Golf .)
Der
)
Aktivierungsmodus--in-out-line-array
und der Rest des Programms ist das"
Umkehren des Zeilenarrays.quelle
Retina , 7 Bytes
Mit einem einzigen regulären Ausdruck wird Retina im Match-Modus ausgeführt. Dies gibt normalerweise nur die Anzahl der Übereinstimmungen aus, aber mit
!
wir konfigurieren es stattdessen so, dass die tatsächlichen Übereinstimmungen gedruckt werden (durch Zeilenvorschübe getrennt).Der eigentliche reguläre Ausdruck ist lediglich
.*$
..*
Stimmt mit jeder Zeile überein (möglicherweise leer), da.
sie mit jedem Zeichen außer Zeilenvorschub übereinstimmen kann. Ich komme zum$
.Wie bringen wir es dazu, die Übereinstimmungen in umgekehrter Reihenfolge auszudrucken? Verwenden Sie den von rechts nach links abgleichenden Modus von .NET, der mit aktiviert wird
r
. Dies bedeutet, dass die Regex-Engine bei der Suche nach Übereinstimmungen am Ende der Zeichenfolge startet und rückwärts arbeitet.Schließlich
m
wird die$
Übereinstimmung mit dem Ende einer Zeile anstelle des Endes der Zeichenfolge hergestellt. Warum brauchen wir das überhaupt? Das Problem ist, dass.*
irrelevante Übereinstimmungen entstehen. Betrachten Sie die Regex-Substitutionauf den Eingang angewendet
baaababaa
. Sie würden denken, dies würde nachgebenbaaaxbaxbaax
, aber es gibt Ihnen tatsächlichbaaaxxbaxxbaaxx
. Warum? Denn nach dem Abgleichen befindet sichaaa
der Cursor des Motors zwischen dema
und demb
. Jetzt kann es nicht mehr mita
s übereinstimmen , sonderna*
ist auch mit einem leeren String zufrieden. Dies bedeutet, dass Sie nach jedem einzelnen Spiel ein weiteres leeres Spiel erhalten.Wir wollen das hier nicht, weil es zusätzliche Leerzeilen einführen würde, also verwerfen wir diese irrelevanten Übereinstimmungen (die aufgrund des Modus von rechts nach links am Anfang der Zeilen stehen), indem wir verlangen, dass Übereinstimmungen das Ende von enthalten die Linie.
quelle
Haskell, 34 Bytes
[bearbeiten]
Gespeichert ein Byte durch den Ersatz
unlines
mitconcat
.quelle
CJam, 7 Bytes
Liest stdin, druckt nach stdout.
Erläuterung:
quelle
Pyth, 5 Bytes
Dies kehrt die Reihenfolge der Zeilen mit einem einfachen Split-Reverse-Join-Ansatz um, jedoch nicht ganz wie bei tac .
Probieren Sie es online aus.
quelle
Befunge-93, 17 Bytes
Nichts Besonderes hier; lege einfach alles auf den Stapel und lege es dann ab.
quelle
Pure Bash (keine externen Dienstprogramme), 56
Dies ist eine der wenigen Antworten, um eine exakte
tac
Emulation durchzuführen, wie in Dennis 'Kommentar gefragt :quelle
Ruby, 16 Bytes
quelle
JavaScript (SpiderMonkey-Shell), 38 Byte
Ziemlich einfach
read()
liest eine Dateireadline()
liest einen String aus STDIN[...str]
wird str in eine Reihe von Zeichen aufteilenreverse()
kehrt das Array umjoin``
wird das Array in eine Zeichenkette zusammenfassenquelle
Python 2, 52 Bytes
quelle
import sys;print sys.stdin.read()[::-1]
?C #
179171 BytesLiest Zeilen, legt sie in einen Stapel und schreibt sie dann rückwärts. Ich würde dafür Mathematica verwenden, aber es hat keinen Sinn für EOF.
quelle
sed, 9 bytes
Keine Gegenstimme erwünscht, dies ist ein berühmter sed Einzeiler.
quelle
Perl, 16 Bytes
quelle
Powershell, 41 Bytes
Speichert den Inhalt einer Datei zeilenweise
a
, kehrt ihn uma
und druckt ihn schließlich aus.quelle
GolfScript, 7 Bytes
Online Test hier .
quelle
Burlesque , 6 Bytes
ln
Teilt Linien,<-
kehrt sie um,uN
fügt Linien und Formate für die Rohausgabe zusammen.quelle
Bash,
4843 Zeichen(Inspiriert von Digital - Trauma ‚s Bash Antwort . Upvotes für die Idee zu ihm gehen soll.)
Probelauf:
quelle
mapfile -c1 -Cf
stattmapfile -c1 -Cf a
.-C
.GNU Awk, 27 Zeichen
(Inspiriert von Ed Morton ‚s GNU Awk Antwort . CW , da ich nicht seine Lösung kapern gedacht.)
Beachten Sie dies, indem Sie
RT
→ ändernRS
dies zum portablen Standard-Awk wird, jedoch die Fähigkeit verloren geht, das Fehlen des letzten Zeilenumbruchs beizubehalten.Probelauf:
quelle
SNOBOL, 42 Bytes
quelle
Gema, 25 Zeichen
Probelauf:
quelle
Hassium ,
90 Bytes86 BytesSiehe hier erweitert
quelle
for
Syntax missbraucht . Sehen Sie eine Probe hiersed, 7 bytes
Dies funktioniert für mich (und es ist die kürzeste Lösung an anderer Stelle), aber ich möchte nicht wirklich herausfinden, warum. Ich habe nur mit dem berühmten 9-Byte-Trick rumgespielt, bis ich ihn gefunden habe. Ich vermute,
G
die erste Zeile macht nichts?quelle
G
Fügt eine neue Zeile und den Inhalt des Haltebereichs an den Musterbereich an. Während das Anhängen des Inhalts des leeren Haltebereichs in der Tat harmlos ist, wird die neue Zeile immer noch angehängt.)JavaScript (Node.js), 91 Bytes
quelle
console.log((require('fs').readFileSync(process.argv[2])+"").split(d="\n").reverse().join(d))
(92 bytes)? Ihr aktueller Code kehrt die Zeilen nicht um.Bash + gemeinsame Dienstprogramme, 25
Hier
^G
ist das ein wörtlichesBEL
Buchstabe. Ich gehe davon aus, dass die Eingabe nur als ASCII druckbar ist.Dadurch
tr
wird die gesamte Eingabe in eine Zeile umgewandelt, indem neue Zeilen durch BELs ersetzt werden. Anschließendrev
wird diese Zeile ersetzt. Anschließend wird dietr
Eingabe inrev
mehrere Zeilen umgewandelt und jede Zeile erneut ersetzt, um die gewünschte Ausgabe zu erhalten.quelle
MATLAB, 44
Teilt die Zeichenfolge in neue Zeilen, dreht das resultierende Array um und fügt dann neue Zeilenzeichen hinzu.
quelle
Julia, 65 Bytes
Dabei wird eine Datei als Befehlszeilenargument verwendet und die Zeilen in umgekehrter Reihenfolge gedruckt. Nachfolgende Zeilenumbrüche werden im Gegensatz dazu nach vorne verschoben
tac
, was legitim ist.Ungolfed:
quelle
Pip , 3 + 2 = 5 Bytes
Verwendet die
r
undn
Flags; liest aus stdin.Das
r
Flag liest stdin und speichert es als Liste von Zeilen ing
(was normalerweise eine Liste von Befehlszeilen-Ar g en ist). Wir kehren diese Liste dann um und sie wird automatisch gedruckt. Dasn
Flag bewirkt, dass Listen mit Zeilenvorschub als Trennzeichen ausgegeben werden.quelle