Tantangan ini mirip dengan yang lama ini , tetapi dengan beberapa bagian spesifikasi yang tidak jelas dipalu dan persyaratan I / O yang kurang ketat.
Diberikan input dari string yang hanya terdiri dari ASCII dan baris baru yang dapat dicetak, menampilkan berbagai metriknya (byte, kata, jumlah baris).
Metrik yang harus Anda keluarkan adalah sebagai berikut:
Hitungan Byte. Karena string input tetap berada dalam ASCII, ini juga merupakan jumlah karakter.
Jumlah kata. Ini adalah
wc
definisi dari "kata:" setiap urutan bukan spasi. Misalnya,abc,def"ghi"
adalah satu "kata."Jumlah baris. Ini cukup jelas. Input akan selalu berisi baris baru tambahan, yang berarti jumlah baris sama dengan "jumlah baris baru." Tidak akan ada lebih dari satu baris baru.
Output harus benar-benar mereplikasi wc
output default (kecuali untuk nama file):
llama@llama:~$ cat /dev/urandom | tr -cd 'A-Za-z \n' | head -90 > example.txt
llama@llama:~$ wc example.txt
90 165 5501 example.txt
Perhatikan bahwa jumlah baris lebih dulu, kemudian jumlah kata, dan akhirnya jumlah byte. Selanjutnya, setiap hitungan harus dibiarkan berlapis dengan spasi sedemikian sehingga semuanya memiliki lebar yang sama. Dalam contoh di atas, 5501
adalah angka "terpanjang" dengan 4 digit, jadi 165
diisi dengan satu spasi dan 90
dengan dua. Akhirnya, semua angka harus digabungkan menjadi satu string dengan spasi di antara setiap angka.
Karena ini adalah kode-golf , kode terpendek dalam byte akan menang.
(Oh, dan omong-omong ... Anda tidak dapat menggunakan wc
perintah dalam jawaban Anda. Seandainya itu belum jelas.)
Kasing uji ( \n
mewakili baris baru; Anda juga dapat juga memerlukan baris tambahan tambahan):
"a b c d\n" -> "1 4 8"
"a b c d e f\n" -> " 1 6 12"
" a b c d e f \n" -> " 1 6 16"
"a\nb\nc\nd\n" -> "4 4 8"
"a\n\n\nb\nc\nd\n" -> " 6 4 10"
"abc123{}[]()...\n" -> " 1 1 16
"\n" -> "1 0 1"
" \n" -> "1 0 4"
"\n\n\n\n\n" -> "5 0 5"
"\n\n\na\nb\n" -> "5 2 7"
Jawaban:
Perl, 49 byte
Menambahkan +3 untuk
-an0
Masukan pada STDIN atau 1 nama file atau lebih sebagai argumen. Jalankan sebagai
perl -an0 wc.pl
wc.pl
:Penjelasan:
sumber
Python 2,
10077 byteSolusi ini adalah fungsi Python yang menerima string multi-line dan mencetak jumlah yang diperlukan untuk stdout. Perhatikan bahwa saya menggunakan string format untuk membangun string format (yang mengharuskan
%%
untuk keluar dari placeholder format pertama).Sunting: Disimpan 23 byte karena optimisasi cetak oleh Dennis.
Sebelum minifier, tampilannya seperti ini:
sumber
Pyth, 21 byte
Suite uji
Pyth memiliki beberapa built-in yang sangat bagus di sini. Kita mulai dengan membuat daftar (
[
) baris baru dalam string (@bQ
), kata-kata dalam string (cQ)
) dan string itu sendiri (Q
). Kemudian, kita pad (.[
) panjang setiap string (ld
) dengan spasi (;
dalam konteks ini) hingga panjang jumlah karakter (l`lQ
). Akhirnya, bergabunglah dengan spasi (jd
).sumber
POSIX awk,
79756765 bytesEdit: disimpan 4 bytes sejak POSIX memungkinkan telanjang
length
, diselamatkan 7 byte dengan mendiskontokan bagian doa, dan menyelamatkan dua byte berkat ujung Doorknob untuk menambahkand %
ked
.Ini awalnya untuk GNU awk, tapi yang terbaik yang bisa saya katakan, ini hanya menggunakan fungsionalitas awk POSIX.
Lebih baik diformat:
sumber
d
kelength(c)"d %"
seharusnya memungkinkan Anda untuk mengubahprintf
ke"%"d d"d\n"
, yang menghemat dua byte.Serius , 39 byte
Cobalah online!
Penjelasan (baris baru diganti dengan
\n
):sumber
AppleScript, 253 byte
Ini mengasumsikan bahwa pembatas item teks AppleScript diatur ke spasi (jika saya perlu menghitung hal-hal untuk memaksa asumsi itu, saya akan menambahkannya).
sumber
CJam,
3126 byteCobalah online!
Bagaimana itu bekerja
sumber
Julia,
11281 byteIni adalah fungsi yang menerima string dan mengembalikan string.
Kami menyimpan yang berikut sebagai argumen fungsi:
n = endof
fungsi, yang mendapatkan indeks terakhir dari koleksi yang dapat diindeks (dalam hal ini adalah panjang string)l = "$(n(s))
, panjang input dikonversi ke string menggunakan interpolasig
yang menerima ekspresi reguler dan mengembalikan panjang - 1 dari input split pada regex itu, dibiarkan empuk dengan spasi untuk mencocokkan panjangl
.Kami mendapatkan jumlah baris menggunakan
g(r"\n")
dan jumlah kata menggunakang(r"\S+")
, kemudian kami bergabung dengan mereka bersama denganl
dibatasi oleh spasi.Disimpan 31 byte berkat Dennis!
sumber
MATL, 38 byte
Anda dapat mencobanya secara online! Ini seharusnya tidak terlalu lama ...
Penjelasan, untuk perhitungan,
Bagian terakhir melakukan pemformatan output
sumber
!3Z"vX:!
denganZ{Zc
(cellstr
diikuti olehstrjoin
)JavaScript (ES6), 115 byte
Tidak memerlukan input apa pun. Memformat itu menyakitkan. Jika ada batas atas jumlah padding saya bisa menguranginya
(' '.repeat(99)+n)
menjadi sesuatu yang lebih pendek mis` ${n}`
.sumber
/[^]/g
dengan/./g
untuk menyimpan dua bytePowerShell, 140 byte
(baris baru tersisa untuk kejelasan: D)
Baris pertama mengambil input
$a
, dan kemudian bagian selanjutnya adalah semua pernyataan. Kami menetapkan$c
sama dengan beberapa-string.length
. Ini akan membentuk padding yang kami butuhkan. Di dalam string adalah blok kode langsung$(...)
, sehingga kode itu akan dieksekusi sebelum dievaluasi ke dalam string.Di blok kode, kami mengirim tiga item melalui
|sort
perintah, dan kemudian mengambil yang terbesar(...)[-1]
. Di sinilah kami memastikan untuk mendapatkan kolom dengan lebar yang benar. Tiga item adalah$l
jumlah baris, di mana kita berada-split
di baris baru, jumlah$w
kata, di mana kita berada-split
di spasi, dan$b
panjangnya.Baris kedua adalah output kami menggunakan
-f
operator (yang merupakan singkatan semu untukString.Format()
). Ini cara lain untuk memasukkan variabel yang diperluas ke string. Di sini, kami mengatakan bahwa kami ingin semua output diisi ke kiri sehingga setiap kolom$c
lebar. Padding dilakukan melalui spasi. The0
,1
dan2
bersesuaian dengan$l
,$w
, dan$b
yang argumen untuk operator Format, sehingga jumlah baris, jumlah kata, dan jumlah byte yang empuk dan output tepat.Perhatikan bahwa ini mengharuskan string untuk memiliki baris baru yang sudah diperluas (mis. Melakukan a
Get-Content
pada file teks atau sesuatu, dan kemudian memipangkan atau menyimpannya ke suatu variabel, kemudian memanggil kode ini pada input itu), atau menggunakan PowerShell- karakter melarikan diri bergaya dengan backticks (artinya`n
bukannya\n
).Contoh
sumber
Jelly , 14 byte
Cobalah online!
-1 terima kasih kepada Dennis .
sumber
Ruby, 108 byte
sumber
Perl,
716261 bytetermasuk +1 untuk
-n
Berkomentar:
sumber
y///c
sebagai panjang yang lebih pendek$_
.split$"
dalam konteks skalar memberikan jumlah kata dalam$_
. Dengan menggunakan variabel tanda baca seperti$;
bukannya$W
Anda dapat menempatkand
setelah interpolasi dalam format string. Kemudian Anda bisa dropd
di$W
dan drop kurung. Dan-p
tidak ada yang berhasil-n
, biarkanprintf
pencetakannya (tambahkan baris baru secukupnya)$a=foo;$b=bar$a
biasanya dapat ditulis sebagai$b=bar($a=foo)
, menghemat satu byte. Berlaku di sini untuk$;
dan$b
. Anda tidak peduli jika$;
dihitung ulang setiap saatLua,
7466 byteGolf:
Tidak Disatukan:
Menerima input melalui argumen baris perintah.
Kami mengganti nama argumen pertama (
arg[1]
) untuk menyimpan byte.string.gsub
mengembalikan jumlah penggantian serta string yang dimodifikasi, jadi kami menggunakannya untuk menghitung terlebih dahulu'\n'
(baris baru), kemudian'%S+'
(contoh dari satu atau lebih karakter non-spasi, sebanyak mungkin, yaitu kata-kata). Kita dapat menggunakan apapun yang kita inginkan untuk string pengganti, jadi kita menggunakan string kosong (''
) untuk menyimpan byte. Kemudian kita gunakan sajastring.len
untuk mencari panjang string, yaitu jumlah byte. Lalu, akhirnya, kami cetak semuanya.sumber
Retina, 65
Cobalah secara Online!
Tahap pertama adalah program wc yang sebenarnya, sisanya untuk padding. The
a
placeholder hal yang mungkin tidak perlu, dan beberapa kelompok mungkin dapat disederhanakan sedikit.sumber
Haskell, 140 byte
Versi ungolfed ada di bawah ini, dengan nama variabel dan fungsi diperluas:
Ini adalah fungsi yang menerima string dan mengembalikan string. Itu hanya menggunakan
Prelude
fungsiwords
(resp.lines
) Untuk mendapatkan jumlah kata (resp. Lines) mengingat bahwa mereka tampaknya menggunakan definisi yang sama sepertiwc
, kemudian mendapatkan nilai terpanjang (sebagai string) di antara jumlah dan menggunakan format printf mengambil lebar di antara argumennya untuk pemformatan.sumber
C,
180178 bytesumber
05AB1E ,
2423 bytej
saat ini disadap, jadi bisa jadi 21 byte tanpa§
danJ
..Cobalah secara online atau verifikasi semua kasus uji .
Penjelasan:
sumber
Pip
-s
, 25 byteMengambil string multiline sebagai argumen baris perintah. Cobalah online!
Terima kasih atas jawaban CJam Dennis yang membuat saya sadar bahwa angka terpanjang adalah jumlah karakter.
Penjelasan
Inilah solusi 29-byte dengan flag
-rs
yang mengambil input dari stdin:Cobalah online!
sumber
Powershell,
123115 byteSkrip uji:
Keluaran:
Penjelasan:
$args|% t*y
membagi string arument menjadi karakterswitch -r($args|% t*y)
mengevaluasi semua kasus yang cocok'\s'
kasus untuk spasi putih'\S'
kasus untuk non-spasi putih'(?s).'
case untuk char apa saja (termasuk baris baru)'\n'
case untuk baris newline (baris baru mewakili dirinya sendiri)$c="$b".Length
menghitung panjang nomor byte. $ b selalu maks ($ l, $ w, $ b) menurut desain"{0,$c} {1,$c} $b"-f$l,+$w
format angka dengan panjang yang sama. Variabel $ w dikonversi ke int. Perlu untuk string tanpa kata-kata. Variabel lain memformat 'sebagaimana adanya' karena 'Input akan selalu berisi baris baru' dan $ l dan $ b tidak boleh 0.sumber