Tantangan:
Buat bagan ASCII dari kata-kata yang paling umum digunakan dalam teks yang diberikan.
Aturan:
- Hanya terima
a-z
danA-Z
(karakter alfabet) sebagai bagian dari kata. - Abaikan casing (
She
==she
untuk tujuan kami). - Abaikan kata-kata berikut (cukup arbiter, saya tahu):
the, and, of, to, a, i, it, in, or, is
Klarifikasi: mempertimbangkan
don't
: ini akan dianggap sebagai 2 'kata' yang berbeda dalam rentanga-z
danA-Z
: (don
dant
).Secara opsional (sudah terlambat untuk secara resmi mengubah spesifikasi sekarang), Anda dapat memilih untuk menghapus semua 'kata-kata' satu huruf (ini juga berpotensi memperpendek daftar abaikan).
Parse yang diberikan text
(baca file yang ditentukan melalui argumen baris perintah atau disalurkan; anggap us-ascii
) dan buat kami word frequency chart
dengan karakteristik berikut:
- Tampilkan grafik (juga lihat contoh di bawah) untuk 22 kata yang paling umum (dipesan dengan frekuensi menurun).
- Bilah
width
mewakili jumlah kemunculan (frekuensi) kata (secara proporsional). Tambahkan satu spasi dan cetak kata. - Pastikan bilah-bilah ini (plus spasi-kata-spasi) selalu cocok :
bar
+[space]
+word
+[space]
harus selalu <=80
karakter (pastikan Anda memperhitungkan kemungkinan bar dan panjang kata yang berbeda: misalnya: kata yang paling umum kedua mungkin jauh lebih lama daripada saat pertama tidak berbeda jauh dalam frekuensi). Maksimalkan lebar batang dalam batasan ini dan skala batang dengan tepat (sesuai dengan frekuensi yang diwakilinya).
Sebuah contoh:
Teks sebagai contoh dapat ditemukan di sini ( Petualangan Alice di Negeri Ajaib, oleh Lewis Carroll ).
Teks khusus ini akan menghasilkan bagan berikut:
_________________________________________________________________________ | _________________________________________________________________________ | | dia | _______________________________________________________________ | kamu | ____________________________________________________________ | kata | ____________________________________________________ | Alice | ______________________________________________ | dulu | __________________________________________ | bahwa | ___________________________________ | sebagai | _______________________________ | -nya | ____________________________ | dengan | ____________________________ | di | ___________________________ | s | ___________________________ | t | _________________________ | di | _________________________ | semua | ______________________ | ini | ______________________ | untuk | ______________________ | telah | _____________________ | tapi | ____________________ | menjadi | ____________________ | tidak | ___________________ | mereka | __________________ | begitu
Untuk informasi Anda: ini adalah frekuensi bagan di atas dibangun di atas:
[('dia', 553), ('kamu', 481), ('kata', 462), ('alice', 403), ('adalah', 358), ('itu ', 330), (' as ', 274), (' dia ', 248), (' dengan ', 227), (' at ', 227), (' s ', 219), (' t ' , 218), ('on', 204), ('all', 200), ('this', 181), ('for', 179), ('had', 178), (' tetapi ', 175), (' be ', 167), (' not ', 166), (' mereka ', 155), (' jadi ', 152)]
Contoh kedua (untuk memeriksa apakah Anda menerapkan spesifikasi lengkap):
Ganti setiap kemunculan you
dalam file Alice in Wonderland yang ditautkan dengan superlongstringstring
:
________________________________________________________________ | ________________________________________________________________ | dia | _______________________________________________________ | superlongstringstring | _____________________________________________________ | kata | ______________________________________________ | Alice | ________________________________________ | dulu | _____________________________________ | bahwa | ______________________________ | sebagai | ___________________________ | -nya | _________________________ | dengan | _________________________ | di | ________________________ | s | ________________________ | t | ______________________ | di | _____________________ | semua | ___________________ | ini | ___________________ | untuk | ___________________ | telah | __________________ | tapi | _________________ | menjadi | _________________ | tidak | ________________ | mereka | ________________ | begitu
Pemenang:
Solusi terpendek (berdasarkan jumlah karakter, per bahasa). Selamat bersenang-senang!
Sunting : Tabel merangkum hasil sejauh ini (2012-02-15) (awalnya ditambahkan oleh pengguna Nas Banov):
Bahasa Santai Ketat ========= ======= ====== GolfScript 130 143 Perl 185 Windows PowerShell 148 199 Mathematica 199 Ruby 185 205 Unix Toolchain 194 228 Python 183 243 Clojure 282 Scala 311 Haskell 333 Awk 336 R 298 Javascript 304 354 Groovy 321 Matlab 404 C # 422 Smalltalk 386 PHP 450 F # 452 TSQL 483 507
Angka-angka mewakili panjang solusi terpendek dalam bahasa tertentu. "Strict" mengacu pada solusi yang mengimplementasikan spec sepenuhnya (menggambar |____|
bar, menutup bar pertama di atas dengan sebuah ____
garis, menjelaskan kemungkinan kata-kata panjang dengan frekuensi tinggi dll). "Santai" berarti beberapa kebebasan diambil untuk dipersingkat menjadi solusi.
Hanya solusi yang lebih pendek dari 500 karakter yang disertakan. Daftar bahasa diurutkan berdasarkan lamanya solusi 'ketat'. 'Unix Toolchain' digunakan untuk menandai berbagai solusi yang menggunakan shell * nix tradisional plus campuran alat (seperti grep, tr, sortir, uniq, head, perl, awk).
sumber
s
- kata favorit saya dant
diwakili.Jawaban:
LabVIEW 51 node, 5 struktur, 10 diagram
Mengajar gajah untuk menari-nari tidak pernah indah. Saya akan, ah, melewatkan hitungan karakter.
Program mengalir dari kiri ke kanan:
sumber
Ruby 1.9, 185 karakter
(sangat didasarkan pada solusi Ruby lainnya)
Alih-alih menggunakan switch baris perintah seperti solusi lain, Anda bisa dengan mudah memberikan nama file sebagai argumen. (yaitu
ruby1.9 wordfrequency.rb Alice.txt
)Karena saya menggunakan karakter-literal di sini, solusi ini hanya berfungsi di Ruby 1.9.
Sunting: Mengganti titik koma dengan jeda baris untuk "keterbacaan". : P
Sunting 2: Shtééf menunjukkan saya lupa ruang tambahan - memperbaikinya.
Sunting 3: Menghapus ruang tambahan lagi;)
sumber
GolfScript,
177175173167164163144131130 karakterLambat - 3 menit untuk sampel teks (130)
Penjelasan:
"Benar" (semoga). (143)
Kurang lambat - setengah menit. (162)
Output terlihat dalam log revisi.
sumber
206
shell, grep, tr, grep, sortir, uniq, sort, head, perl
hm, baru dilihat di atas:sort -nr
->sort -n
dan kemudianhead
->tail
=> 208 :)update2: erm, tentu saja hal di atas konyol, karena akan dibalik kemudian. Jadi, 209.
update3: mengoptimalkan regexp pengecualian -> 206
untuk bersenang-senang, inilah versi perl-only (jauh lebih cepat):
sumber
Solusi transaksi berbasis kumpulan SQL (SQL Server 2005)
1063892873853827820783683647644630 karakterTerima kasih kepada Gabe untuk beberapa saran berguna untuk mengurangi jumlah karakter.
NB: Jeda baris ditambahkan untuk menghindari scrollbar hanya jeda baris terakhir yang diperlukan.
Versi yang Dapat Dibaca
Keluaran
Dan dengan benang panjang
sumber
0.000
ke adil0
, lalu menggunakan-C
alih-alih1.0/C
. Dan membuatFLOAT
menjadiREAL
akan menghemat stroke juga. Namun, hal terbesarnya adalah sepertinya Anda memiliki banyakAS
instance yang harus opsional.SELECT [ ] FROM (SELECT $0 O, ' '+REPLICATE('_', MAX(C)*@F)+' ' [ ] FROM # UNION SELECT $1/C, '|'+REPLICATE('_',C*@F)+'| '+W FROM #)X ORDER BY O
?Ruby
207213211210207203201200 karakterPeningkatan pada Anurag, menggabungkan saran dari rfusca. Juga menghapus argumen untuk mengurutkan dan beberapa pegolf kecil lainnya.
Jalankan sebagai:
Sunting: masukkan 'memasukkan' kembali, perlu ada di sana untuk menghindari kuotasi dalam output.
Edit2: File Berubah-> IO
Edit3: dihapus / i
Edit4: Tanda kurung dihapus sekitar (f * 1.0), menceritakan
Edit5: Gunakan penambahan string untuk baris pertama; berkembang
s
di tempat.Sunting6: Made m float, dihapus 1.0. EDIT: Tidak berfungsi, mengubah panjang. EDIT: Tidak lebih buruk dari sebelumnya
Edit7: Gunakan
STDIN.read
.sumber
Mathematica (
297284248244242199 karakter) Fungsional Murnidan Pengujian Hukum Zipf
Lihatlah Mamma ... tidak ada vars, tidak ada tangan, .. tidak ada kepala
Sunting 1> beberapa singkatan didefinisikan (284 karakter)
Beberapa penjelasan
Keluaran
alt teks http://i49.tinypic.com/2n8mrer.jpg
Mathematica tidak cocok untuk bermain golf, dan itu hanya karena nama fungsi yang panjang dan deskriptif. Fungsi seperti "RegularExpression []" atau "StringSplit []" hanya membuat saya terisak :(.
Pengujian Hukum Zipf
The Hukum Zipf memprediksi bahwa untuk teks bahasa alami, Log (Peringkat) vs Log (kejadian) Plot mengikuti linear hubungan.
Hukum digunakan dalam mengembangkan algoritma untuk kriptografi dan kompresi data. (Tapi BUKAN "Z" dalam algoritma LZW).
Dalam teks kami, kami dapat mengujinya dengan berikut ini
Hasilnya adalah (cukup baik linear)
alt teks http://i46.tinypic.com/33fcmdk.jpg
Edit 6> (242 Chars)
Refactoring the Regex (tidak ada fungsi Pilih lagi)
Menjatuhkan 1 kata char
Definisi yang lebih efisien untuk fungsi "f"
Edit 7 → 199 karakter
f
denganTranspose
danSlot
(#1
/#2
) argumen.f@x
alih-alihf[x]
jika memungkinkan)sumber
|i|
berlebihan di regex Anda karena Anda sudah punya.|
.C # -
510451436446434426422 karakter (diperkecil)Tidak sesingkat itu, tapi sekarang mungkin benar! Catatan, versi sebelumnya tidak menunjukkan baris pertama bilah, tidak mengatur skala bilah dengan benar, mengunduh file alih-alih mendapatkannya dari stdin, dan tidak menyertakan semua verbositas C # yang diperlukan. Anda dapat dengan mudah mencukur banyak guratan jika C # tidak membutuhkan terlalu banyak omong kosong. Mungkin Powershell bisa berbuat lebih baik.
422 karakter dengan lendivisor inline (yang membuatnya 22 kali lebih lambat) dalam bentuk di bawah ini (baris baru digunakan untuk spasi tertentu):
sumber
Perl,
237229209 karakter(Diperbarui lagi untuk mengalahkan versi Ruby dengan lebih banyak trik golf kotor, diganti
split/[^a-z/,lc
denganlc=~/[a-z]+/g
, dan menghilangkan cek untuk string kosong di tempat lain. Ini terinspirasi oleh versi Ruby, jadi kreditlah yang memberi kredit.)Perbarui: sekarang dengan Perl 5.10! Ganti
print
dengansay
, dan gunakan~~
untuk menghindari amap
. Ini harus dipanggil pada baris perintah sebagaiperl -E '<one-liner>' alice.txt
. Karena keseluruhan skrip ada dalam satu baris, menulisnya sebagai satu-baris tidak akan menimbulkan kesulitan :).Perhatikan bahwa versi ini menormalkan untuk kasus. Ini tidak memperpendek solusinya, karena melepas
,lc
(untuk casing yang lebih rendah) mengharuskan Anda untuk menambahA-Z
regex split, jadi ini adalah pencucian.Jika Anda berada di sistem di mana baris baru adalah satu karakter dan bukan dua, Anda dapat mempersingkat ini dengan dua karakter lain dengan menggunakan baris baru literal sebagai pengganti
\n
. Namun, saya belum menulis contoh di atas seperti itu, karena "lebih jelas" (ha!) Seperti itu.Berikut ini sebagian besar solusi perl yang benar, tetapi tidak cukup pendek:
Berikut ini adalah tentang sesingkat itu bisa tetap relatif dapat dibaca. (392 karakter).
sumber
foreach
dapat ditulis sebagaifor
s. Itu 8 karakter. Maka Anda memilikigrep{!($_~~@s)}map{lc=~/[a-z]+/g}<>
, yang saya percaya dapat ditulisgrep{!(/$_/i~~@s)}<>=~/[a-z]+/g
untuk turun lebih 4. Ganti" "
dengan$"
dan Anda turun 1 lagi ...sort{$c{$b}-$c{$a}}...
untuk menyimpan dua lagi. Anda juga bisa hanya meneruskan%c
alih-alihkeys %c
kesort
fungsi dan menyimpan empat lagi.Windows PowerShell, 199 karakter
(Pemutusan baris terakhir tidak perlu, tetapi termasuk di sini agar mudah dibaca.)
(Kode saat ini dan file pengujian saya tersedia di repositori SVN saya . Saya berharap kasus pengujian saya menangkap kesalahan yang paling umum (panjang bilah, masalah dengan pencocokan regex dan beberapa lainnya))
Asumsi:
Sejarah
Versi santai (137), karena itu dihitung secara terpisah sekarang, tampaknya:
Variasi panjang batang satu karakter dibandingkan dengan solusi lain adalah karena PowerShell menggunakan pembulatan alih-alih pemotongan ketika mengubah angka titik-mengambang menjadi bilangan bulat. Karena tugas yang diperlukan hanya panjang batang proporsional, ini harus baik-baik saja.
Dibandingkan dengan solusi lain, saya mengambil pendekatan yang sedikit berbeda dalam menentukan panjang bar terpanjang hanya dengan mencoba dan mengambil panjang tertinggi di mana tidak ada garis yang lebih panjang dari 80 karakter.
Versi yang lebih lama dijelaskan dapat ditemukan di sini .
sumber
-split("\b(?:the|and|of|to|a|i[tns]?|or)\b|[^a-z]")
? Ini bekerja untuk saya."|$('_'*($w*$_.count/$x[0].count))| $($_.name) "
(atau menghilangkan spasi terakhir, karena ini semacam otomatis). Dan Anda dapat menggunakan-split("(?:\b(?:the|and|of|to|a|i[tns]?|or)\b|[^a-z])+")
untuk menyimpan lebih banyak dengan tidak memasukkan blank (atau gunakan[-2..-23]
).Ruby, 215,
216,218,221,224,236,237karakterpembaruan 1: Hore ! Ini dasi dengan JS Bangs ' solusi . Tidak bisa memikirkan cara untuk mengurangi lagi :)
pembaruan 2: Memainkan trik golf yang kotor. Diubah
each
menjadimap
untuk menyimpan 1 karakter :)pembaruan 3: Diubah
File.read
keIO.read
+2.Array.group_by
tidak terlalu membuahkan hasil, berubah menjadireduce
+6. Pengecekan case case tidak diperlukan setelah casing lebih rendah dengandowncase
di regex +1. Menyortir dalam urutan menurun mudah dilakukan dengan meniadakan nilai +6. Total penghematan +15perbarui 4:
[0]
daripada.first
, +3. (@ Shtééf)pembaruan 5: Perluas variabel
l
di tempat, +1. Perluas variabels
di tempat, +2. (@ Shtééf)pembaruan 6: Gunakan penambahan string daripada interpolasi untuk baris pertama, +2. (@ Shtééf)
pembaruan 7: Saya mengalami banyak kehebohan untuk mendeteksi iterasi pertama di dalam loop, menggunakan variabel instan. Yang saya dapatkan adalah +1, meskipun mungkin ada potensi. Mempertahankan versi sebelumnya, karena saya percaya ini adalah ilmu hitam. (@ Shtééf)
Versi yang mudah dibaca
Menggunakan:
Keluaran:
sumber
scan
, meskipun, memberi saya ide yang lebih baik, jadi saya maju lagi :).Python 2.x, pendekatan latitudinarian =
227183 karakterMengizinkan kebebasan dalam implementasi, saya membuat rangkaian string yang berisi semua kata yang diminta untuk dikecualikan (
the, and, of, to, a, i, it, in, or, is
) - ditambah juga mengecualikan dua "kata" yang terkenals
dant
dari contoh - dan saya melemparkan secara gratis pengecualian untukan, for, he
. Saya mencoba semua rangkaian kata-kata itu terhadap kumpulan kata-kata dari Alice, King James 'Bible dan file Jargon untuk melihat apakah ada kata-kata yang akan dikecualikan oleh string. Dan itulah yang saya akhiri dengan dua string pengecualian:itheandtoforinis
danandithetoforinis
.PS. dipinjam dari solusi lain untuk mempersingkat kode.
Kata-kata kasar
Mengenai kata-kata yang diabaikan, orang akan berpikir itu akan diambil dari daftar kata-kata yang paling banyak digunakan dalam bahasa Inggris. Daftar itu tergantung pada corpus teks yang digunakan. Per salah satu daftar paling populer ( http://en.wikipedia.org/wiki/Most_common_words_in_English , http://www.english-for-students.com/Frequently-Used-Words.html , http: // www. sporcle.com/games/common_english_words.php ), 10 kata teratas adalah:
the be(am/are/is/was/were) to of and a in that have I
10 kata teratas dari teks Alice in Wonderland adalah
the and to a of it she i you said
10 kata teratas dari File Jargon (v4.4.7) adalah
the a of to and in is that or for
Jadi pertanyaannya adalah mengapa
or
dimasukkan dalam daftar pengabaian masalah, di mana itu ~ 30 dalam popularitas ketika katathat
(8 paling banyak digunakan) tidak. dll, dll. Oleh karena itu saya percaya daftar abaikan harus diberikan secara dinamis (atau bisa dihilangkan).Gagasan alternatif adalah melompati 10 kata teratas dari hasil - yang sebenarnya akan mempersingkat solusinya (elementer - harus hanya menampilkan entri ke-11 hingga ke-32).
Python 2.x, pendekatan tepat waktu =
277243 karakterBagan yang digambar dalam kode di atas disederhanakan (hanya menggunakan satu karakter untuk bilah). Jika seseorang ingin mereproduksi bagan dengan tepat dari deskripsi masalah (yang tidak diperlukan), kode ini akan melakukannya:
Saya mengambil masalah dengan pilihan 10 kata yang agak acak untuk dikecualikan
the, and, of, to, a, i, it, in, or, is
sehingga harus dilewatkan sebagai parameter baris perintah, seperti:python WordFrequencyChart.py the and of to a i it in or is <"Alice's Adventures in Wonderland.txt"
Ini adalah 213 karakter + 30 jika kita memperhitungkan daftar abaikan "asli" yang diteruskan pada baris perintah = 243
PS. Kode kedua juga melakukan "penyesuaian" untuk panjang semua kata teratas, sehingga tidak ada yang akan meluap dalam huruf besar.
sumber
\W
atau penggunaan\b
dalam regex karena itu kemungkinan besar tidak sesuai dengan spesifikasi, yang berarti mereka tidak akan terpecah pada angka atau_
dan mereka juga mungkin tidak menghapus kata berhenti dari string sepertithe_foo_or123bar
. Mereka mungkin tidak muncul dalam teks pengujian tetapi spesifikasinya cukup jelas dalam kasus itu.sys.argv
re.findall(r'\b(?!(?:the|and|.|of|to|i[tns]|or)\b)\w+',sys.stdin.read().lower())
Haskell -
366351344337333 karakter(Satu baris
main
tambahan ditambahkan agar mudah dibaca, dan tidak ada baris tambahan diperlukan pada akhir baris terakhir.)Cara kerjanya paling baik dilihat dengan membaca argumen di
interact
belakang:map f
alfabet huruf kecil, menggantikan yang lainnya dengan spasi.words
menghasilkan daftar kata, menjatuhkan spasi yang memisahkan.filter (
notElemwords "the and of to a i it in or is")
membuang semua entri dengan kata-kata terlarang.group . sort
mengurutkan kata-kata, dan mengelompokkan yang identik ke dalam daftar.map h
memetakan setiap daftar kata yang identik ke tupel formulir(-frequency, word)
.take 22 . sort
mengurutkan tupel dengan frekuensi menurun (entri tupel pertama), dan hanya menyimpan 22 tupel pertama.b
peta tupel ke bar (lihat di bawah).a
menambahkan baris pertama garis bawah, untuk melengkapi bilah paling atas.unlines
bergabung dengan semua baris ini bersama dengan baris baru.Agak sulit adalah mendapatkan panjang bar yang benar. Saya berasumsi bahwa hanya garis bawah yang dihitung terhadap panjang bilah, jadi
||
bilah dengan panjang nol. Fungsib
petac x
berakhirx
, di manax
daftar histogram. Seluruh daftar diteruskan kec
, sehingga setiap doac
dapat menghitung faktor skala untuk dirinya sendiri dengan meneleponu
. Dengan cara ini, saya menghindari menggunakan matematika atau rasional floating-point, yang fungsi konversi dan impornya akan memakan banyak karakter.Perhatikan trik menggunakan
-frequency
. Hal ini menghilangkan kebutuhan untukreverse
yangsort
sejak menyortir (naik)-frequency
akan tempat kata-kata dengan frekuensi terbesar pertama. Kemudian, dalam fungsiu
, dua-frequency
nilai dikalikan, yang akan membatalkan negasi keluar.sumber
div
, sebenarnya! Cobalah - hasilnya salah. Alasannya adalah bahwa melakukandiv
sebelum*
kehilangan presisi.JavaScript 1.8 (SpiderMonkey) - 354
Sayangnya,
for([k,v]in z)
dari versi Badak sepertinya tidak mau bekerja di SpiderMonkey, danreadFile()
sedikit lebih mudah daripada menggunakanreadline()
tetapi naik ke 1,8 memungkinkan kita untuk menggunakan fungsi penutupan untuk memotong beberapa baris lagi ....Menambahkan spasi putih untuk dibaca:
Pemakaian:
js golf.js < input.txt
Keluaran:
(versi dasar - tidak menangani lebar batang dengan benar)
JavaScript (Badak) -
405395387377368343304 karakterSaya pikir logika penyortiran saya tidak aktif, tapi .. saya duno.Brainfart diperbaiki.Diminimalkan (penyalahgunaan
\n
diartikan sebagai;
kadang - kadang):sumber
i[tns]?
bitnya. Sangat licik..replace(/[^\w ]/g, e).split(/\s+/).map(
dapat diganti dengan.replace(/\w+/g,
dan menggunakan fungsi yang sama seperti yang Anda.map
lakukan ... Juga tidak yakin apakah Badak mendukungfunction(a,b)b.c-a.c
alih-alih fungsi sortir Anda (spidermonkey tidak), tetapi itu akan bercukur{return }
...b.c-a.c
adalah jenis yang lebih baik daripadaa.c<b.c
... Mengedit versi Spidermonkey di bagian bawah dengan perubahan ini?:
dasar yang bagus untuk bekerja!Versi PHP CLI (450 karakter)
Solusi ini memperhitungkan persyaratan terakhir yang sebagian besar puritan telah dipilih untuk diabaikan. Itu menghabiskan 170 karakter!
Pemakaian:
php.exe <this.php> <file.txt>
Diperkecil:
Dapat dibaca manusia:
Keluaran:
Ketika ada kata yang panjang, bilah disesuaikan dengan benar:
sumber
Python 3.1 -
245229 karakterSaya kira menggunakan Counter agak curang :) Saya baru saja membacanya sekitar seminggu yang lalu, jadi ini adalah kesempatan sempurna untuk melihat cara kerjanya.
Mencetak:
Beberapa kode "dipinjam" dari solusi AKX.
sumber
open('!')
membaca dari stdin - yang versi / OS yang aktif? atau Anda harus memberi nama file '!'?perl,
205191189 karakter / 205 karakter (sepenuhnya diimplementasikan)Beberapa bagian terinspirasi oleh pengiriman perl / ruby sebelumnya, beberapa ide serupa tiba di independen, yang lain asli. Versi yang lebih pendek juga menggabungkan beberapa hal yang saya lihat / pelajari dari kiriman lainnya.
Asli:
Versi terbaru hingga191 karakter:Versi terbaru hingga 189 karakter:
Versi ini (205 karakter) menyumbang baris dengan kata-kata lebih panjang dari apa yang akan ditemukan nanti.
sumber
Perl:
203202201198195208208/231 charsAlternatif, implementasi penuh termasuk perilaku yang ditunjukkan (global bar-squishing) untuk kasus patologis di mana kata kedua populer dan cukup lama untuk digabung menjadi lebih dari 80 karakter ( implementasi ini 231 karakter ):
Spesifikasi tidak menyatakan di mana pun bahwa ini harus pergi ke STDOUT, jadi saya menggunakan perl perl () alih-alih mencetak - empat karakter disimpan di sana. Peta yang digunakan alih-alih foreach, tapi saya merasa masih ada penghematan lagi di split (gabung ()). Namun, turun ke 203 - mungkin tidur di atasnya. Setidaknya Perl sekarang di bawah "shell, grep, tr, grep, sort, uniq, sort, head, perl" hitungan char untuk saat ini;)
PS: Reddit mengatakan "Hai";)
Pembaruan: Dihapus join () yang mendukung penugasan dan konversi skalar implisit bergabung. Turun ke 202. Juga harap dicatat saya telah memanfaatkan aturan opsional "abaikan kata-kata 1" untuk mencukur 2 karakter, jadi ingatlah bahwa frekuensi akan mencerminkan hal ini.
Pembaruan 2: Menukar tugas dan bergabung secara implisit karena membunuh $ / untuk mendapatkan file dalam sekali teguk menggunakan <> di tempat pertama. Ukuran yang sama, tetapi nastier. Diganti jika (! $ Y) {} untuk $ y || {} &&, disimpan 1 karakter lagi => 201.
Pembaruan 3: Mengambil kendali lebih rendah dari awal (lc <>) dengan memindahkan lc keluar dari blok peta - Mengganti kedua regex ke tidak lagi menggunakan opsi / i, karena tidak lagi diperlukan. Tukar kondisional eksplisit x? Y: z dibangun untuk perlgolf tradisional || konstruksi kondisional implisit - /^...$/i?1:$x{$ } ++ untuk /^...$/||$x{$ } ++ Menyimpan tiga karakter! => 198, memecahkan 200 penghalang. Mungkin akan segera tidur ... mungkin.
Pembaruan 4: Kurang tidur membuat saya gila. Baik. Lebih gila. Mengira bahwa ini hanya perlu mengurai file teks bahagia normal, saya membuatnya menyerah jika hits nol. Menyimpan dua karakter. Diganti "length" dengan 1-char lebih pendek (dan lebih golf) y /// c - Anda dengar, GolfScript ?? Aku datang untukmu!!! menangis
Pembaruan 5: Sleep dep membuat saya lupa tentang batas 22row dan pembatasan baris berikutnya. Cadangkan hingga 208 dengan yang ditangani. Tidak terlalu buruk, 13 karakter untuk menanganinya bukan akhir dari dunia. Bermain-main dengan regex inline eval perl, tetapi mengalami kesulitan untuk membuatnya bekerja dan menghemat karakter ... lol. Diperbarui contoh untuk mencocokkan keluaran saat ini.
Pembaruan 6: Menghapus kawat gigi yang tidak dibutuhkan yang melindungi (...) untuk, karena permen sintaksis ++ memungkinkan mendorongnya ke atas untuk bahagia. Terima kasih atas masukan dari Chas. Owens (mengingatkan otak saya yang lelah), mendapat solusi kelas karakter di sana. Kembali ke 203.
Pembaruan 7: Menambahkan karya kedua, implementasi penuh spesifikasi (termasuk perilaku bar-squishing penuh untuk kata-kata sekunder, bukan pemotongan yang dilakukan kebanyakan orang, berdasarkan spesifikasi asli tanpa contoh kasus patologis)
Contoh:
Implementasi alternatif dalam contoh kasus patologis:
sumber
is|in|it|i
kei[snt]?
- dan kemudian tidak ada perbedaan dengan aturan opsional lagi. (Hm, saya tidak akan pernah berpikir untuk memberi tahu seorang pria Perl cara melakukan Regex: D) - satu-satunya masalah sekarang: Saya harus melihat bagaimana saya dapat mengurangi tiga byte dari solusi saya sendiri untuk menjadi lebih baik daripada Perl lagi: - |F #, 452 karakter
Strightforward: dapatkan urutan
a
pasangan jumlah kata, temukan pengganda jumlah kata per kolom yang terbaikk
, kemudian hasil cetak.Contoh (Saya memiliki jumlah freq berbeda dari Anda, tidak yakin mengapa):
sumber
float
.|>
?Python 2.6, 347 karakter
Keluaran:
sumber
bm=(76.-len(W[0][0]))/W[0][1]
karena Anda hanya menggunakan bm sekali (buat baris berikutnyaU=lambda n:"_"*int(n*(76.-len(W[0][0]))/W[0][1])
, kurangi 5 karakter. Juga: mengapa Anda menggunakan nama variabel 2 karakter dalam kode golf? ;-)* sh (+ curl), solusi parsial
Ini tidak lengkap, tapi untuk itu, inilah separuh kata yang menghitung frekuensi dari masalah dalam 192 byte:
sumber
Gawk - 336 (awalnya 507) karakter
(Setelah memperbaiki format output; Memperbaiki hal kontraksi; tweaking; tweaking lagi; menghapus langkah penyortiran yang sama sekali tidak perlu; tweak lagi; dan lagi (oops yang satu ini memecah format); tweak lagi; mengambil tantangan Matt Saya mati-matian men-tweak jadi lebih banyak; temukan tempat lain untuk menyimpan beberapa, tetapi berikan dua kembali untuk memperbaiki bug panjang batang)
Heh heh! Saya sesaat di depan tantangan penghitung solusi [Matt's JavaScript] [1] ! ;) dan [python AKX] [2].
Masalahnya tampaknya memanggil bahasa yang mengimplementasikan array asosiatif asli, jadi tentu saja saya telah memilih satu dengan satu set operator yang sangat buruk pada mereka. Secara khusus, Anda tidak dapat mengontrol urutan awk yang menawarkan unsur-unsur peta hash, jadi saya berulang kali memindai seluruh peta untuk menemukan item yang paling banyak saat ini, mencetaknya dan menghapusnya dari array.
Itu semua sangat tidak efisien, dengan semua golf yang saya buat sudah cukup mengerikan juga.
Diperkecil:
jeda baris hanya untuk kejelasan: mereka tidak perlu dan tidak boleh dihitung.
Keluaran:
Dapat dibaca; 633 karakter (aslinya 949):
sumber
LISP umum, 670 karakter
Saya seorang pemula LISP, dan ini merupakan upaya menggunakan tabel hash untuk menghitung (jadi mungkin bukan metode yang paling kompak).
dapat dijalankan misalnya dengan
cat alice.txt | clisp -C golf.lisp
.Dalam bentuk yang mudah dibaca adalah
sumber
C (828)
Tampaknya banyak seperti kode yang dikaburkan, dan menggunakan glib untuk string, daftar dan hash. Char menghitung dengan
wc -m
mengatakan 828 . Itu tidak mempertimbangkan kata-kata char tunggal. Untuk menghitung panjang maksimum bilah, itu mempertimbangkan kata yang paling panjang mungkin di antara semua, bukan hanya 22 yang pertama. Apakah ini penyimpangan dari spesifikasi?Itu tidak menangani kegagalan dan tidak melepaskan memori yang digunakan.
sumber
*v=*v*(77-lw)/m
akan memberikan 929. .. tapi saya pikir itu bisa baik-baik saja kecuali saya menemukan cara untuk melakukannya jauh lebih pendek)int c
ke dalammain
deklarasi danmain
secara implisitint
(seperti setiap argumen untyped, afaik):main(c){...}
. Anda mungkin juga bisa menulis0
sajaNULL
.-Wall
atau dengan-std=c99
bendera di ... tapi saya kira ini tidak ada gunanya untuk golf kode, kan?Without freeing memory stuff, it reaches 866 (removed some other unuseful space)
ke sesuatu yang lain untuk tidak berpikir orang-orang bahwa perbedaan dengan versi memori bebas adalah semua dalam hal itu: sekarang versi tanpa memori bebas memiliki banyak lebih banyak "perbaikan".Perl, 185 char
200 (sedikit rusak)199197195 195193187185 karakter. Dua baris terakhir terakhir signifikan. Sesuai dengan spesifikasi.Baris pertama memuat jumlah kata yang valid ke dalam
%X
.Baris kedua menghitung faktor penskalaan minimum sehingga semua baris output akan menjadi <= 80 karakter.
Baris ketiga (berisi dua karakter baris baru) menghasilkan output.
sumber
Java -
886865756744742744752742714680 karakterPembaruan sebelum 742 pertama : regex ditingkatkan, dihapus tipe parameter berlebihan, dihapus spasi berlebihan.
Perbarui 742> 744 karakter : perbaiki hack dengan panjang tetap Itu hanya tergantung pada kata pertama, bukan kata lain (belum). Menemukan beberapa tempat untuk mempersingkat kode (
dan
\\s
di regex digantikan olehArrayList
digantikan olehVector
). Saya sekarang mencari cara singkat untuk menghapus ketergantungan Commons IO dan membaca dari stdin.Perbarui 744> 752 karakter : Saya menghapus ketergantungan commons. Sekarang membaca dari stdin. Rekatkan teks di stdin dan tekan
Ctrl+Z
untuk mendapatkan hasil.Perbarui 752> 742 karakter : Saya menghapus
public
dan spasi, membuat classname 1 char bukan 2 dan sekarang mengabaikan kata satu huruf.Perbarui 742> 714 karakter : Diperbarui sesuai komentar Carl: dihapus tugas yang berlebihan (742> 730), digantikan
m.containsKey(k)
olehm.get(k)!=null
(730> 728), memperkenalkan substring garis (728> 714).Perbarui 714> 680 karakter : Diperbarui sesuai komentar Rotsor: peningkatan perhitungan ukuran bilah untuk menghapus pengecoran yang tidak perlu dan ditingkatkan
split()
untuk menghapus yang tidak perlureplaceAll()
.Versi yang lebih mudah dibaca:
Keluaran:
Sangat menyebalkan bahwa Java tidak memiliki
String#join()
dan penutupan (belum).Edit oleh Rotsor:
Saya telah membuat beberapa perubahan pada solusi Anda:
Kode yang dikondensasi adalah
688711684 karakter:Versi cepat (
720693 karakter)Versi yang lebih mudah dibaca:
Versi tanpa peningkatan perilaku adalah 615 karakter:
sumber
IOUtils
alih-alih mengimpornya? Sejauh yang saya bisa lihat Anda hanya menggunakannya sekali saja.b
String alih-alih StringBuffer. Saya tidak ingin memikirkan bagaimana performanya nanti (terutama karena Anda menambahkan satu karakter pada satu waktu).Scala 2.8, 311
314320330332336341375karaktertermasuk penyesuaian kata yang panjang. Ide dipinjam dari solusi lain.
Sekarang sebagai skrip (
a.scala
):Jalankan dengan
BTW, hasil edit dari 314 hingga 311 karakter sebenarnya hanya menghapus 1 karakter. Seseorang salah menghitung sebelumnya (Windows CRs?).
sumber
Clojure 282 ketat
Agak lebih terbaca:
sumber
Scala, 368 karakter
Pertama, versi yang dapat dibaca dalam 592 karakter:
Output konsol terlihat seperti ini:
Kami dapat melakukan beberapa pemangkasan yang agresif dan menurunkannya menjadi 415 karakter:
Sesi konsol terlihat seperti ini:
Saya yakin seorang ahli Scala bisa melakukan lebih baik.
Pembaruan: Dalam komentar, Thomas memberikan versi yang lebih pendek, yaitu 368 karakter:
Jelas, pada 375 karakter:
sumber
object A{def main(a:Array[String]){val t=(Map[String, Int]()/:(for(x<-io.Source.fromFile(a(0)).getLines;y<-"(?i)\\w+\\b(?<!\\bthe|and|of|to|a|i|it|in|or|is)".r findAllIn x) yield y.toLowerCase).toList)((c,x)=>c+(x->(c.getOrElse(x,0)+1))).toList.sortBy(_._2).reverse.take(22);val w=76-t.head._1.length;print(" "+"_"*w);t map (s=>"\n|"+"_"*(s._2*w/t.head._2)+"| "+s._1) foreach print}}
Java - 896 karakter
931 karakter1233 karakter yang dibuat tidak dapat dibacaKarakter 1977 "tidak terkompresi"Pembaruan: Saya telah secara agresif mengurangi jumlah karakter. Hapus kata satu huruf per spec yang diperbarui.
Saya sangat iri pada C # dan LINQ.
"Dapat dibaca":
Output dari Alice:
Output dari Don Quixote (juga dari Gutenberg):
sumber