Antara pertanyaan kucing dan melihat pertanyaan ini di U&L tentang sed
sihir, bagaimana dengan penerapannya tac
?
Objektif
Menerapkan program yang akan membalikkan dan mencetak garis dalam file.
Memasukkan
File, disediakan sebagai nama atau melalui input standar
Keluaran
Garis, dibalik, ke standar keluar.
Mencetak gol
Byte kode sumber.
tac
agak aneh ketika datang untuk mengikuti linefeeds. Ini mengubaha\nb\n
(trailing linefeed) menjadib\na\n
dana\nb
(tidak ada trafeed linefeed) menjadiba\n
. Apakah ini bagaimana seharusnya kode kita berperilaku?tac
hanya masalah waktu ...\n
.tac
membalik urutan baris ini. Jika suatu\n
dihapus dari tengah file, baris yang diakhiri bergabung ke baris berikutnya, tetapi dalam kasus baris terakhir, tidak ada baris berikutnya untuk bergabung.Jawaban:
GS2, 3 byte
Tiga byte adalah, secara berurutan, membagi garis, mundur, dan bergabung dengan garis.
sumber
Perl, 11 byte
Berperilaku persis seperti
tac
. Kode ini membutuhkan-p
sakelar, yang telah saya hitung sebagai 1 byte.Tes berjalan
Bagaimana itu bekerja
Seperti dijelaskan di sini ,
-p
switch pada dasarnya membungkuswhile (<>) { ... ; print }
program, sehingga kode sumbernya setara denganUntuk setiap baris input, kami menambahkan baris saat ini (
$_
) ke$\
(awalnya tidak terdefinisi), memperbarui yang terakhir dengan hasilnya.Setelah semua baris diproses,
print
cetak nilai variabel lokal$_
(tidak ditentukan dalam lingkup ini), diikuti oleh pemisah catatan keluaran ($\
).sumber
-p
sakelar membungkus kode Anda dalam satu lingkaran yang dimulaiwhile(<>){
dan berakhir} continue { print }
, yang memungkinkan pemfilteran input hanya dengan memodifikasi$_
.$\=$_.$\
menambahkan setiap baris input ke terminal catatan keluaran, dan}{
ujung-ujungwhile
blok perl-dipasok secara prematur, sehinggacontinue
blok tidak lagi melekat padanya. Jadi semua baris input ditambahkan ke$\
dalam urutan terbalik, kemudian padacontinue { print }
akhirnya berjalan, mencetak "tidak ada" ($_
akan undef setelah akhir input), tetapi dengan terminator dari$\
.Pyth, 4 byte
.z
adalah input yang dipisahkan oleh garis sebagai daftar,_
membalikkannya danj
menggabungkannya dengan karakter, yang secara default adalah\n
.sumber
FlogScript , 2 byte
(Cobalah golf anarki .)
The
)
memungkinkan--in-out-line-array
modus, dan sisanya dari program ini adalah"
, membalikkan array baris.sumber
Retina , 7 byte
Dengan satu regex, Retina berjalan dalam mode Match. Ini biasanya hanya mencetak jumlah kecocokan, tetapi dengan
!
kami mengkonfigurasinya untuk mencetak kecocokan yang sebenarnya sebagai gantinya (dipisahkan oleh baris baris).Regex sebenarnya hanyalah
.*$
..*
cocok dengan baris apa saja (berpotensi kosong), karena.
dapat cocok dengan karakter apa pun kecuali umpan baris. Saya akan ke$
dalam sebentar lagi.Bagaimana kita membuatnya mencetak pertandingan secara terbalik? Dengan memanfaatkan mode pencocokan kanan-ke-kiri .NET, diaktifkan dengan
r
. Ini berarti mesin regex mulai di akhir string ketika mencari yang cocok dan bekerja mundur.Akhirnya,
m
buatlah yang$
cocok dengan akhir baris, bukan akhir dari string. Mengapa kita membutuhkan itu? Masalahnya adalah.*
menghasilkan kecocokan yang asing. Pertimbangkan substitusi regexditerapkan pada input
baaababaa
. Anda akan berpikir ini akan menghasilkanbaaaxbaxbaax
, tetapi sebenarnya memberi Andabaaaxxbaxxbaaxx
. Mengapa? Karena setelah mencocokkanaaa
kursor mesin adalah antaraa
danb
. Sekarang tidak dapat lagi cocok dengana
s, tetapia*
juga puas dengan string kosong. Ini berarti, setelah setiap pertandingan Anda mendapatkan pertandingan kosong yang lain.Kami tidak ingin itu ada di sini, karena itu akan memperkenalkan baris kosong tambahan, jadi kami membuang kecocokan yang asing (yang berada di awal garis, karena mode kanan-ke-kiri) dengan mengharuskan kecocokan mencakup akhir garis.
sumber
Haskell, 34 byte
[sunting]
Disimpan satu byte dengan mengganti
unlines
denganconcat
.sumber
CJam, 7 byte
Membaca stdin, mencetak ke stdout.
Penjelasan:
sumber
Pyth, 5 byte
Ini membalik urutan garis dengan pendekatan split-reverse-join sederhana, tetapi tidak seperti tac .
Cobalah online.
sumber
Befunge-93, 17 byte
Tidak ada yang mewah di sini; cukup letakkan semuanya di tumpukan, lalu lepas.
sumber
Bash Murni (tidak ada utilitas eksternal), 56
Ini adalah salah satu dari sedikit jawaban untuk melakukan
tac
persaingan yang tepat , seperti yang ditanyakan dalam komentar Dennis :sumber
Ruby, 16 byte
sumber
JavaScript (SpiderMonkey Shell), 38 byte
Cukup mudah
read()
membaca filereadline()
membaca string dari STDIN[...str]
akan membagi str menjadi array karakterreverse()
akan membalikkan arrayjoin``
akan collpase array menjadi stringsumber
Python 2, 52 byte
sumber
import sys;print sys.stdin.read()[::-1]
?C #,
179171 byteMembaca baris, menempatkannya di tumpukan, dan kemudian menulisnya mundur. Saya akan menggunakan Mathematica untuk ini, tetapi tidak memiliki arti EOF.
sumber
sed, 9 byte
Tidak ingin upvote, ini adalah sed-liner terkenal.
sumber
Perl, 16 byte
sumber
Powershell, 41 byte
Menyimpan konten file baris demi baris
a
, membalikkana
dan akhirnya mencetaknya.sumber
GolfScript, 7 byte
Tes online di sini .
sumber
Burlesque , 6 byte
ln
memisahkan garis,<-
membalikkan,uN
menggabungkan garis dan format untuk keluaran mentah.sumber
Bash,
4843 karakter(Terinspirasi oleh Digital Trauma 's Bash jawaban . Upvotes untuk ide harus pergi ke dia.)
Contoh dijalankan:
sumber
mapfile -c1 -Cf
bukanmapfile -c1 -Cf a
.-C
dulu.GNU Awk, 27 karakter
(Terinspirasi oleh Ed Morton 's GNU AWK jawaban . CW karena saya tidak dimaksudkan untuk membajak solusinya.)
Perhatikan bahwa dengan mengubah
RT
→RS
ini menjadi Awk standar portabel tetapi kehilangan kemampuan untuk mempertahankan ketiadaan baris baru final.Contoh dijalankan:
sumber
SNOBOL, 42 byte
sumber
Gema, 25 karakter
Contoh dijalankan:
sumber
Hassium ,
90 Bytes86 BytesLihat diperluas di sini
sumber
for
sintaks. Lihat sampel di sinised, 7 byte
Ini bekerja untuk saya (dan ini solusi terpendek di tempat lain), tetapi saya tidak benar-benar ingin mencari tahu mengapa. Saya hanya bermain-main dengan trik 9-byte yang terkenal sampai saya menemukan ini. Saya kira
G
baris pertama tidak melakukan apa-apa?sumber
G
menambahkan baris baru dan konten ruang pegang ke ruang pola. Sementara menambahkan konten ruang pegang kosong memang tidak berbahaya, baris baru masih ditambahkan.)JavaScript (Node.js), 91 Bytes
sumber
console.log((require('fs').readFileSync(process.argv[2])+"").split(d="\n").reverse().join(d))
(92 byte)? Kode Anda saat ini tidak membalikkan garis.Bash + utilitas umum, 25
Ini
^G
adalah literalBEL
karakter . Saya berasumsi inputnya hanya ascii yang bisa dicetak.Ini
tr
ansforms seluruh input ke satu baris dengan mengganti baris baru dengan BELs, kemudianrev
erses baris itu, kemudiantr
ansforms kembali ke multiline, kemudianrev
erses setiap baris lagi, untuk mendapatkan output yang diinginkan.sumber
MATLAB, 44
Pisahkan string di baris baru, membalik array yang dihasilkan, kemudian bergabung kembali dengan karakter baris baru.
sumber
Julia, 65 byte
Ini mengambil file sebagai argumen baris perintah dan mencetak barisnya dalam urutan terbalik. Baris baru yang tertinggal dipindahkan ke depan, tidak seperti
tac
, yang sah.Tidak Disatukan:
sumber
Pip , 3 + 2 = 5 byte
Menggunakan
r
dann
bendera; dibaca dari stdin.The
r
bendera membaca stdin dan menyimpannya sebagai daftar baris dalamg
(yang biasanya daftar baris perintah ar g s). Kami kemudian membalik daftar itu, dan itu dicetak secara otomatis. Then
daftar penyebab bendera untuk menjadi output dengan baris baru sebagai pemisah.sumber