Kode harus mengambil input teks (tidak wajib bisa berupa file apa pun, stdin, string untuk JavaScript, dll):
This is a text and a number: 31.
Output harus berisi kata-kata dengan jumlah kemunculannya, diurutkan berdasarkan jumlah kemunculan dalam urutan menurun:
a:2
and:1
is:1
number:1
This:1
text:1
31:1
Perhatikan bahwa 31 adalah kata, jadi kata adalah apa saja alfa-numerik, angka tidak bertindak sebagai pemisah sehingga misalnya 0xAF
memenuhi syarat sebagai kata. Pemisah akan berupa apa saja yang bukan alfanumerik termasuk .
(titik) dan -
(tanda hubung) dengan demikian i.e.
atau pick-me-up
akan menghasilkan 2 masing-masing 3 kata. Harus peka huruf besar-kecil, This
dan this
akan menjadi dua kata yang berbeda, '
juga akan menjadi pemisah sehingga wouldn
dan t
akan menjadi 2 kata yang berbeda wouldn't
.
Tulis kode terpendek dalam bahasa pilihan Anda.
Sejauh ini jawaban benar terpendek:
This
sama denganthis
dantHIs
)?wouldn't
2 kata (wouldn
dant
)?This
danthis
memang akan dua kata yang berbeda, samawouldn
dant
.i.e.
adalah sebuah kata tetapi jika kita membiarkan titik semua titik di akhir frase akan diambil, sama dengan kutipan atau kutipan tunggal, dll.Jawaban:
grep dan coreutils
4442Uji:
Hasil dalam:
Memperbarui
sumber
head
ujung.grep -io \[A-Z0-9]*|sort|uniq -c|sort -nr
Java 8: 289
Yang cukup bagus, karena java adalah bahasa yang sangat tidak golf.
Tidak Disatukan:
Jalankan dari baris perintah:
sumber
"[^\\W_]"
String.split(String regex)
metode ini mengambil pola yang cocok dengan pembatas untuk dipecah. Jadi, misalnya,"aababba".split("b")
akan menghasilkan array{"aa", "a", "", "a"}
. Regex saya[^\\w\\d]
berarti 'karakter dalam karakter kata atau kelas karakter digit'.[^\\W_]
sebaliknya 'karakter yang bukan garis bawah juga tidak ada di kelas non-karakter-karakter' dan akan cocok dengan karakter kata apa pun kecuali garis bawah.\w
termasuk\d
, begitu\d
juga berlebihan.\w
termasuk garis bawah, yang harus dianggap sebagai pemisah sesuai dengan pertanyaan. Jadi regex yang benar untuk pemisahan harus"[\\W_]+"
.APL (57)
misalnya
Penjelasan:
⎕D,⎕A,⎕UCS 96+⍳26
: angka, huruf besar, huruf kecil(I←⍞)∊
: baca input, simpan diI
, lihat mana yang alfanumerikZ←I⊂⍨
: dibagiI
dalam kelompok karakter alfanumerik, simpan diZ
+⌿∘.≡⍨Z
: untuk setiap elemen dalamZ
, lihat seberapa sering itu terjadiZ,⍪
: cocokkan setiap elemen secaraZ
berpasangan dengan berapa kali itu terjadiG←⊃∪↓
: pilih hanya pasangan unik, simpan diG
⍒,1↓⍉G
: dapatkan indeks yang diurutkan untuk kemunculannyaG[
...;]
: menyusun ulang garisG
dengan indeks yang diberikansumber
⎕s
( help.dyalog.com/latest/Content/Language/System%20Functions/… ) dan operator kunci baru ( help.dyalog.com/latest/Content/Language/Primitive%20Operators/… ):g⌷⍨⊂⍒2⌷⍉g←{⍺,≢⍵}⌸('\w+'⎕s'\0')⍞
C #:
153c144c142c111C115c118c114c113c(via LINQPad dalam mode "C # Statement", tidak termasuk string input)
Versi 1: 142c
Tidak Disatukan:
Hasil:
Versi 2: 114c
(
[\w]
termasuk_
, yang salah!;[A-z]
termasuk[ \ ] ^ _ `
; menyelesaikan[^_\W]+
)Tidak Disatukan:
Hasil: (seperti Versi 1)
sumber
@"[^_\W]"
R, 58 char
Pemakaian:
sumber
sort(table(gsub("[[:punct:]]","",scan(,""))),d=T)
. Sayangnya kedua solusi tidak berfungsi dengan benarwouldn't
.perl6: 49 karakter
Sisir input untuk pencocokan barang
\w+
, masukkan daftar kata yang dihasilkan di aBag
, minta pasangan mereka dan urutkan berdasarkan nilai negatif. (The*
adalah bintang Apapun , ini bukan perkalian di sini)keluaran:
sumber
.words
alih-alih.comb(/\w+/)
:).words
tidak menghapus:
atau.
dari input yang diperlukan :(_
seharusnya tidak dimasukkan dalam kata di bawah pernyataan masalah.Python
10197Sekarang berfungsi dengan baris baru:
sumber
PHP - 84 byte
Input diterima sebagai argumen baris perintah, misalnya:
Output untuk string sampel:
sumber
$argv[1]
_
tidak harus dimasukkan dalam kata.PowerShell (40)
$ s adalah variabel yang berisi string input.
sumber
[\W]
tidak cukup baik - ini cocok dengan ruang dalam pengujian saya. Dan itu tidak diperintahkan oleh hitungan menurun ...$s -split"[\W]"|group -ca|where{$_.Name -ne ""}|sort{-$_.Count}
membuat Anda lebih dekat (dengan biaya, tentu saja)$s -split"\W+"|group -ca |sort count -des
-split"\W+"
mencocokkan string kosong antara yang terakhir.
dan yang terakhir dari string; juga\W+
pertandingan_
yang secara teknis tidak diizinkanPerl 69
Rekomendasi tambahan dari @primo dan @protist
sumber
ge
danfor
. Selain itu,<=>
operator dapat diganti oleh-
.-
bukannya<=>
jenius, tidak yakin itu ada di tips golf untuk Perl thread. Saya akan memperbarui ini nanti, terima kasih!\w
sertakan juga angka (perl -e 'print for"a 1 2 3 4 b"=~/\w/g'
cetakana1234b
), tetapi mekanisme Anda untuk mengulangi kata-kata menyimpan karakter lain jadi saya akan memperbarui. Terima kasih!Powershell:
5755536257(tidak termasuk string input)
pengembalian:
(dengan alat peraga ke @ microbian untuk grup -ca)
sumber
EcmaScript 6
Versi 1 (108 karakter)
Versi 2 (102 karakter)
Versi 3 (105 karakter)
Versi 4 (94 karakter)
Versi 5 (tanpa peringatan; 87 karakter)
Versi 6 (100 karakter)
Keluaran:
sumber
_[a]
dan_[b]
ke_.a
dan_.b
. Juga berubah/\w+/g,_={}
untuk_=/\w+/g
akan menghasilkan hasil yang sama._[a]
menjadi_.a
karena mencoba untuk mengakses properti"a"
dari_
, tidak propertia
.Object.keys
menjadi global dalam ES6? Jawaban Anda tampaknya menganggap ini, tapi saya tidak ingat melihatnya sesuai jadwal untuk ES6.Groovy
7782mengubah regex dari
[^\w]+
menjadi[^\d\p{L}]+
untuk menyelesaikan masalah dengan garis bawahtanpa baris pertama, 82 karakter
keluaran:
sumber
nu_ber
bukan alfanumerik. Ini akan menjadi 2 katanu_ber
bukannumber
?GNU awk + coreutils:
7169Meskipun
gawk asort
bekerja pada array asosiatif, itu tampaknya tidak mempertahankan nilai indeks, mengharuskan eksternalsort
GNU awk 4.x:
10093Solusi gawk yang sedikit lebih besar tetapi murni menggunakan
PROCINFO
untuk mengatur urutan sortir default untuk array asosiatif (tampaknya membutuhkan gawk yang relatif baru -> 4.x?)sumber
_
tidak harus dimasukkan dalam kata.Javascript -
132126 karakter!(Kode JS terpendek)
Memperbaiki regex dan beberapa pengeditan.
Tidak disatukan
Tua -
156143141140132 karakterMemberi percobaan golf yang pertama. Umpan balik dihargai.
sumber
EcmaScript 6,
11510087 (tanpa peringatan & peringatan)Terima kasih kepada @eithedog:
Dengan cepat dan waspada (100):
Jalankan di Firefox.
sumber
var
. Anda juga dapat pindah kea={}
dalamprompt
-prompt(a={})
. Anda juga dapat dropObject.
dan gantiw=>a[w]=a[w]+1||1
kew=>a[w]=-~a[w]
a
dari prompt ke regexp akan menyimpan dua karakter lagi._
tidak harus dimasukkan dalam kata.Ruby
588265Uji coba:
Sunting 58-> 80: Oke, saya tidak ada. Saya lupa mengurutkan kata berdasarkan kejadian. Selain itu,
Array#uniq
bukan enumerator, tetapi menggunakan blok yang diberikan untuk membandingkan elemen, jadi meneruskannyaputs
tidak menyaring duplikat (bukan berarti ia harus melakukannya).sumber
split(/\W+/)
bukannyascan
(belum diuji)?\W
mengecualikan_
sehingga harus diperbaiki, tetapi masih menyimpan 2 karakter (kemudian saya menambahkan 20 untuk memperbaiki penyortiran yang telah saya abaikan).reverse
(a=gets.split(/[_\W]+/)).uniq.map{|w|[w,a.count(w)]}.sort_by(&:last).reverse.map{|x|p x}
reverse
terlalu verbose;) Btw, itu tidak adil mengubah pertanyaan.F # - 169
Diturunkan:
Output ketika dipanggil dari fsi:
Perbarui: Beberapa penjelasan seperti yang diminta dalam komentar.
Menggunakan fungsi yang ditetapkan untuk menghasilkan array karakter non-alfanumerik di input untuk diteruskan ke String.Split, lalu menggunakan fungsi urutan untuk menyaring string kosong, menghasilkan jumlah kata, dan mencetak hasilnya.
Beberapa trik bermain golf: Menambahkan string kosong ke argumen fungsi s untuk memaksa inferensi tipe argumen sebagai string daripada secara eksplisit menyatakan jenisnya. Menggunakan Seq.where daripada Seq.filter untuk menyimpan beberapa karakter (mereka adalah sinonim). Memadukan pipa maju dan aplikasi fungsi biasa dalam upaya meminimalkan karakter. Menggunakan sintaksis currying dan (op) untuk menangani <> ~ - dan <|| operator sebagai fungsi biasa untuk menghindari menyatakan lambdas untuk memfilter string kosong, urutkan berdasarkan jumlah yang menurun dan mencetak tupel.
sumber
Python - 95 (sekarang 87 berkat @primo)
Input sampel:
Output sampel:
Saran perbaikan apa pun akan dihargai
sumber
\w
cocok[a-zA-Z0-9_]
. Seluruh regex Anda dapat digantikan olehr'\w+'
. Juga,x
variabel tidak diperlukan, cukup gunakanraw_input()
sebagai parameter keduafindall
.print
pernyataan (yaituprint map(...
), kalau tidak itu bukan program yang lengkap.JavaScript
160144 (Diedit: untuk memenuhi persyaratan)Tidak dijinakkan:
Log setiap kata ke konsol dalam urutan, melewati string berikut:
s="This is sam}}ple text 31to test the effectiveness of this code, you can clearly see that this is working-as-intended, but you didn't doubt it did you?.";
Output:
Saya tidak punya hati untuk digunakan
alert()
.sumber
you
harus menjadi yang pertama._
tidak harus dimasukkan dalam kata.++o[a]||1
=>-~o[a]
k [71 karakter]
Karakter lain apa pun kecuali karakter alfanumerik akan dianggap sebagai pembatas.
contoh
contoh
sumber
Javascript (135)
Tidak dijinakkan:
Ulangi setiap kemungkinan jumlah kecocokan dalam urutan menurun, dan keluarkan kata-kata dengan jumlah kemunculan itu. Hanya untuk menjadi mengerikan.
Catatan: Peringatan akan mengurangi panjangnya. Seharusnya alfanumerik berbicara
[^\W_]
sumber
Haskell (153 = 104 kode + 49 impor)
Cukup mudah, fungsi yang sepenuhnya tersusun ... bahkan tidak perlu ada argumen! Ini golf pertama saya, jadi mudah saja, mungkin? :)
Keluaran:
sumber
q (50)
sunting: diperbaiki secara tidak sengaja ascii cocok 58-64 dan 91-96
sumber
q
tetapi apakah[0-z]
ASCII berbasis regex ? Jika ya, bukankah itu juga termasuk karakter ASCII 58-64? Karena itu: ; < = > ? @
.[A-z]
, yang cocok dengan ASCII 91-96, yaitu `[\] ^[^_\W]+
untuk saya, yang harus "mengecualikan karakter non-kata dan garis bawah" , jika sintaks Anda mendukung\W
kelas ...Pure Bash (tidak ada program eksternal), 164
Ini lebih lama daripada yang saya harapkan, tetapi saya ingin melihat apakah penghitungan dan penyortiran yang diperlukan (ke arah yang benar) dapat dilakukan secara murni dengan
bash
array (asosiatif dan non-asosiatif):Simpan sebagai file skrip
chmod +x
,, dan jalankan:sumber
AWK
Apakah pekerjaan tanpa ekstensi gawkish:
Jika mencetak "count: word" sebagai gantinya, itu akan menjadi sedikit lebih pendek tapi saya ingin meniru contoh output yang diberikan ...
sumber
Tcl , 99 byte
Cobalah online!
sumber
Python 2.X (108 - Karakter)
Python 3.X (106 - Karakter)
sumber
Separators will be anything that is not alpha-numeric
- Anda hanya terpecah di spasi putih.Haskell - 137
sumber
Python 3 - 76
Persyaratan pemisahan pada karakter non-alfanumerik sayangnya menambah kode sebanyak 19 karakter. Output dari berikut ini ditampilkan dengan benar. Jika Anda tidak yakin, tambahkan
.most_common()
setelah.Counter(...)
.In / Output
Diberikan input dari
This is a text and a number: 31.
Anda mendapatkan output berikut:Saya mencobanya dengan nilai-nilai lain seperti
untuk memastikan, output-order tidak bergantung pada nilai / hash kunci. Contoh ini menghasilkan:
Tapi seperti yang saya katakan,
print(i('collections').Counter(i('re').findall('\w+',input())).most_common())
akan mengembalikan hasilnya sebagai daftar tupel yang dipesan secara pasti .Python 3 - 57 (jika spasi cukup untuk pemisahan: P)
sumber
_
tidak harus dimasukkan dalam kata.