Pomiędzy pytaniem o kotka a tym pytaniem w U&L o sed
magii, co powiesz na wdrożenie tac
?
Cel
Zaimplementuj program, który odwróci i wydrukuje linie w pliku.
Wkład
Plik podany jako nazwa lub przez standardowe wejście
Wydajność
Linie odwrócone do standardowych.
Punktacja
Bajty kodu źródłowego.
tac
jest trochę dziwne, jeśli chodzi o końcowe linie. Przekształcaa\nb\n
(trailing linefeed) wb\na\n
ia\nb
(bez trailing linefeed) wba\n
. Czy tak ma zachowywać się nasz kod?tac
to tylko kwestia czasu ...\n
.tac
odwraca kolejność tych wierszy. Jeśli an\n
zostanie usunięty ze środka pliku, zakończony wiersz zostanie dołączony do następnego wiersza, ale w przypadku ostatniego wiersza nie ma następnego wiersza do przyłączenia.Odpowiedzi:
GS2, 3 bajty
Te trzy bajty to kolejno linie podzielone, odwrócone i połączone.
źródło
Perl, 11 bajtów
Zachowuje się dokładnie jak
tac
. Ten kod wymaga-p
przełącznika, który policzyłem jako 1 bajt.Przebiegi testowe
Jak to działa
Jak wyjaśniono tutaj ,
-p
przełącznik zasadniczo otaczawhile (<>) { ... ; print }
program, więc kod źródłowy jest równoważnyDla każdego wiersza danych wejściowych wstawiamy bieżącą linię (
$_
) do$\
(początkowo niezdefiniowana), aktualizując ją o wynik.Po przetworzeniu wszystkich wierszy
print
wypisuje wartość zmiennej lokalnej$_
(niezdefiniowanej w tym zakresie), a następnie separator rekordów wyjściowych ($\
).źródło
-p
przełącznika powoduje zawinięcie kodu w pętlę, która zaczyna sięwhile(<>){
i kończy} continue { print }
, co pozwala na filtrowanie danych wejściowych poprzez modyfikację$_
.$\=$_.$\
wstawia każdą linię wejściową do terminatora rekordu wyjściowego, a przedwcześnie}{
kończywhile
blok dostarczany przez perl , więccontinue
blok nie jest już do niego dołączany. Tak więc wszystkie wiersze wejściowe są dodawane$\
w odwrotnej kolejności, a następnie na końcucontinue { print }
ostatecznie działa, wypisując „nic” ($_
będzie niezdefiniowane po zakończeniu wprowadzania), ale z terminatorem$\
.Pyth, 4 bajty
.z
to wejście oddzielone liniami jako lista,_
odwraca je ij
łączy znakiem, którym domyślnie jest\n
.źródło
FlogScript , 2 bajty
(Wypróbuj na anarchii golfa .)
)
Umożliwia--in-out-line-array
tryb, a reszta programu jest"
odwrócenie szereg linii.źródło
Siatkówka , 7 bajtów
Z jednym wyrażeniem regularnym Retina działa w trybie dopasowania. Zwykle drukuje to tylko liczbę dopasowań, ale
!
konfigurujemy go tak, aby zamiast tego wyświetlał rzeczywiste dopasowania (oddzielone liniami).Rzeczywiste wyrażenie regularne jest tylko
.*$
..*
dopasowuje dowolną linię (potencjalnie pustą), ponieważ.
może pasować do dowolnego znaku oprócz linii. Dotrę$
za chwilę.Jak sprawić, by wydrukował mecze w odwrotnej kolejności? Korzystając z trybu dopasowywania od prawej do lewej platformy .NET, aktywowanego za pomocą
r
. Oznacza to, że silnik wyrażeń regularnych uruchamia się na końcu łańcucha podczas wyszukiwania dopasowań i działa wstecz.Wreszcie,
m
sprawia, że$
dopasowanie jest końcem linii zamiast końca łańcucha. Dlaczego tego potrzebujemy? Problem polega na tym, że.*
generuje obce dopasowania. Rozważ podstawienie wyrażenia regularnegozastosowane do danych wejściowych
baaababaa
. Można by pomyśleć, że to przyniesiebaaaxbaxbaax
, ale tak naprawdę dajebaaaxxbaxxbaaxx
. Czemu? Ponieważ po dopasowaniuaaa
kursor silnika znajduje się międzya
ab
. Teraz nie może dopasować więceja
s, alea*
jest również zadowolony z pustego ciągu. Oznacza to, że po każdym pojedynczym meczu otrzymujesz kolejny pusty mecz.Nie chcemy tego tutaj, ponieważ wprowadziłoby to dodatkowe puste linie, dlatego odrzucamy te obce dopasowania (które są na początku linii ze względu na tryb od prawej do lewej), wymagając, aby dopasowania zawierały koniec linia.
źródło
Haskell, 34 bajty
[edytować]
Zapisano jeden bajt, zastępując
unlines
goconcat
.źródło
CJam, 7 bajtów
Czyta standardowe wejście, drukuje na standardowe wyjście.
Wyjaśnienie:
źródło
Pyth, 5 bajtów
To odwraca kolejność linii za pomocą prostego podejścia split-reverse-join, ale nie całkiem jak tac .
Wypróbuj online.
źródło
Befunge-93, 17 bajtów
Nic szczególnego; po prostu połóż wszystko na stosie, a następnie zdejmij.
źródło
Pure Bash (bez zewnętrznych narzędzi), 56
Jest to jedna z nielicznych odpowiedzi na dokładną
tac
emulację, o którą pytano w komentarzu Dennisa :źródło
Rubinowy, 16 bajtów
źródło
JavaScript (SpiderMonkey Shell), 38 bajtów
Dość proste
read()
czyta plikreadline()
odczytuje ciąg ze STDIN[...str]
podzieli str na tablicę znakówreverse()
odwróci tablicęjoin``
zwinie tablicę w ciągźródło
Python 2, 52 bajty
źródło
import sys;print sys.stdin.read()[::-1]
?C #,
179171 bajtówOdczytuje wiersze, umieszczając je na stosie, a następnie zapisuje je do tyłu. Użyłbym do tego Mathematiki, ale nie ma poczucia EOF.
źródło
sed, 9 bajtów
To nie jest pożądane, to słynny sed liniowy.
źródło
Perl, 16 bajtów
źródło
PowerShell, 41 bajtów
Przechowuje zawartość pliku linia po linii
a
, odwracaa
i ostatecznie drukuje.źródło
GolfScript, 7 bajtów
Test online tutaj .
źródło
Burleska , 6 bajtów
ln
dzieli linie,<-
odwraca,uN
łączy linie i formaty dla surowego wyjścia.źródło
Bash,
4843 znaków(Zainspirowany Cyfrowy Trauma „s bash odpowiedź . Upvotes dla idei powinien udać się do niego.)
Przykładowy przebieg:
źródło
mapfile -c1 -Cf
zamiastmapfile -c1 -Cf a
.-C
najpierw wypróbowałem coś tak trudnego .GNU Awk, 27 znaków
(Zainspirowany Ed Morton „s GNU awk odpowiedzi . CW, bo nie ma na celu przejąć jego rozwiązanie).
Zauważ, że zmieniając
RT
→RS
staje się to przenośny standardowy Awk, ale traci on zdolność do zachowania braku końcowej nowej linii.Przykładowy przebieg:
źródło
SNOBOL, 42 bajty
źródło
Gema, 25 znaków
Przykładowy przebieg:
źródło
Wapń ,
90 bajtów86 bajtówZobacz rozwinięty tutaj
źródło
for
składni. Zobacz próbkę tutajsed, 7 bajtów
To działa dla mnie (i jest to najkrótsze rozwiązanie gdzie indziej), ale tak naprawdę nie chcę wiedzieć, dlaczego. Dopiero co pomieszałem ze słynną 9-bajtową sztuczką, dopóki jej nie znalazłem. Zgaduję,
G
że pierwsza linia nic nie robi?źródło
G
dodaje nową linię i zawartość przestrzeni wstrzymania do przestrzeni wzorów. Podczas gdy dodawanie zawartości pustej przestrzeni przechowywania jest rzeczywiście nieszkodliwe, nowa linia jest nadal dołączana.)JavaScript (Node.js), 91 bajtów
źródło
console.log((require('fs').readFileSync(process.argv[2])+"").split(d="\n").reverse().join(d))
(92 bajty)? Twój obecny kod nie odwraca linii.Bash + wspólne narzędzia, 25
Oto
^G
dosłownaBEL
postać. Zakładam, że dane wejściowe można wydrukować tylko w ascii.Ten
tr
ansforms całą wejście do jednej linii, zastępując znaki nowej linii z taśm, następnierev
erses tę linię, następnietr
ansforms powrotem do multilinii, następnierev
erses każdą linię ponownie, aby uzyskać pożądany wynik.źródło
MATLAB, 44
Dzieli ciąg w nowych wierszach, odwraca wynikową tablicę, a następnie ponownie dołącza nowe znaki linii.
źródło
Julia, 65 bajtów
Pobiera to plik jako argument wiersza poleceń i wypisuje jego wiersze w odwrotnej kolejności. Końcowe znaki nowej linii są przenoszone na przód, w przeciwieństwie do
tac
, co jest zgodne z prawem.Nie golfowany:
źródło
Pip , 3 + 2 = 5 bajtów
Wykorzystuje flagi
r
in
; czyta ze standardowego.The
r
Flag odczytuje stdin i zapisuje go jako lista wierszyg
(który normalnie jest lista linii poleceń ar g ów). Następnie odwracamy tę listę i jest ona automatycznie drukowana. Don
listy przyczyny flag być wyjście z nowej linii jako separatora.źródło