Deskripsi singkat dan manis dari tantangan:
Didasarkan pada ETAOIN SHRDLU , tantangan Anda adalah menulis program atau fungsi terpendek dalam bahasa apa pun yang menghasilkan 26 huruf alfabet Inggris berdasarkan frekuensi mereka dalam input.
Spesifikasi sangat panjang, kering dan menyeluruh:
- Program / fungsi Anda akan menerima sebagai input string teks, yang akan berisi satu atau lebih huruf besar dan / atau huruf kecil dan mungkin juga mengandung tanda baca, angka, simbol, dan karakter non-alfabet lainnya.
- Program / fungsi harus hanya menampilkan 26 huruf UNDANG huruf alfabet Inggris, termasuk yang tidak muncul dalam input, dipesan dari yang paling sering ke yang paling tidak berdasarkan berapa kali mereka muncul di input.
- Sunting: Frekuensi dihitung case-insensitive, tetapi output harus dalam huruf besar.
- Jika dua atau lebih huruf memiliki frekuensi yang sama, mereka mungkin dalam urutan apa pun.
Tidak ada output lain, seperti spasi, diizinkan.- Sunting 7/1/2014: Berdasarkan umpan balik, saya mengubah aturan ini. Satu-satunya output lain yang diperbolehkan adalah spasi spasial memimpin dan / atau tambahan, seperti baris baru tambahan. Tidak ada output lain yang diizinkan.
- Perilaku tidak terdefinisi diizinkan untuk input yang tidak mengandung huruf apa pun.
Pemenang akan dipilih 7 hari dari sekarang, jadi ketikkan jari itu!
Input contoh:
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent vitae erat velit. Mauris gravida euismod libero ut tincidunt. Phasellus elit dui, consectetur et egestas in, aliquam vitae diam. Donec eget varius ante. Vestibulum cursus diam aliquet, egestas orci quis, placerat dolor. Proin vel nisi lectus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aliquam erat volutpat. Etiam libero tortor, ornare id dui eget, posuere dignissim libero. Pellentesque commodo consequat volutpat. Integer hendrerit sapien libero, vel viverra augue facilisis sit amet. Quisque consectetur eget nisl quis dignissim. Ut lacinia pretium quam a placerat.
Morbi sed interdum risus, nec pretium lectus. Morbi imperdiet est id accumsan molestie. Duis sed fermentum nisl. Nunc vitae augue mattis, dictum lectus vel, accumsan nisl. Sed ultricies adipiscing rhoncus. Vivamus eu lacus a enim venenatis eleifend. Praesent consectetur tortor non eleifend ultricies. Mauris et odio posuere, auctor erat at, fringilla est. Proin in vestibulum erat. Maecenas congue commodo ante vel varius. Sed tempus mi ut metus gravida, nec dictum libero dapibus. Morbi quis viverra elit. Ut pharetra neque eget lacus tincidunt dictum. Fusce scelerisque viverra tellus et pretium.
Fusce varius adipiscing odio. Nulla imperdiet faucibus sem, at rhoncus ipsum adipiscing vitae. Phasellus imperdiet congue lacus et mollis. Nullam egestas mauris magna, et mollis lectus varius ut. Sed sollicitudin adipiscing dolor, vel elementum elit laoreet molestie. Aliquam nec nulla vel sem ultrices ullamcorper. Nullam nec felis magna. Duis sodales orci non justo aliquam tempus. Integer mi diam, tempor sed vulputate et, varius et nunc. Vestibulum sodales ipsum id mi pharetra, ut convallis mi accumsan. Sed dictum volutpat vestibulum.
Quisque ac dolor sagittis, aliquam libero at, euismod enim. Nulla ullamcorper posuere nulla vitae varius. Nam at dolor non libero elementum pellentesque in in lorem. Fusce porttitor turpis in quam placerat varius. Donec lorem orci, condimentum eu sapien sit amet, aliquet commodo magna. Quisque sed lectus sit amet arcu euismod accumsan et non nunc. Phasellus placerat congue metus, feugiat posuere leo dictum quis. Sed ultricies feugiat eros dignissim bibendum.
Mauris scelerisque consectetur libero eget varius. Aenean neque nunc, ullamcorper vitae orci in, auctor ornare sapien. Nam lacinia molestie imperdiet. Nam vitae mattis nibh. Vestibulum consequat tellus ac nisi sagittis pulvinar. Nullam mollis ornare quam, et venenatis leo porttitor sit amet. Nulla urna neque, dignissim non orci ut, volutpat ultrices erat. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Pellentesque vestibulum tellus nec eros faucibus porta.
Contoh output:
EITUSALNROMCDPVGQBFHJKWXYZ
Catatan: ada hubungan 5 arah antara KWXYZ
input tersebut.
Edit:
Persaingan berakhir! Terima kasih untuk semua yang berpartisipasi. Dan sekarang untuk pemenang: jawaban Dennis CJam dan isthac Pyth masuk dengan 19 karakter. (Maaf, tapi saya tidak akan menerima salah satu jawaban karena saya pikir itu tidak adil bagi yang lain.) Sunting: Mengambil saran Dennis, saya akan menandai jawabannya sebagai diterima karena itu adalah yang pertama untuk mencapai 19 karakter. Disebutkan terhormat pergi ke jawaban Golfscript tempat ketiga Ilmari Karonen di 22 karakter serta jawaban 75-char Python undergroundmonorail yang mendapat upvotes paling banyak. Sekali lagi, terima kasih untuk semua yang berpartisipasi!
Jawaban:
CJam,
2119 byteCobalah online.
Contoh
(tidak ada baris baru)
Bagaimana itu bekerja
Semakin banyak kejadian berarti semakin banyak karakter dihilangkan, sehingga karakter yang paling sering muncul di awal array.
sumber
Python 2 atau 3 -
7775 byteSaya punya jawaban sebelum itu mendapat masukan dari STDIN, tetapi saya menyadari itu secara teknis tidak valid. Saya menggunakan
input()
yang hanya mendapat satu baris, tetapi input contoh pertanyaan menyiratkan bahwa ia harus menangani beberapa baris sekaligus. Untuk memenuhi spesifikasi, saya mengubah jawaban saya menjadi fungsi yang mengambil argumen string. Yang mengejutkan saya, itu dua byte lebih kecil! Ini tidak terjadi kepada saya bahwaprint(...)
daninput()
yang lebih lama darif=lambda s:
dans
.Ini juga membuat jawaban tersebut kompatibel dengan Python 2 dan Python 3. Awalnya hanya Python 3, karena digunakan
input()
(yang disebutraw_input()
dalam 2). Sekarang ini berfungsi, keduanya berfungsi baik.Dijelaskan
sumber
count
Bukan variabel atau apa pun, itu fungsi literal. Sekeren mungkin untuk dapat mengalikan nilai pengembalian fungsi-1
dengan menempelkannya-
di depan, itu bukan fitur yang dimiliki python.Bash, 65 byte
Contoh
Bagaimana itu bekerja
sumber
{A..Z}
. Semua lokal LC_COLLATE berfungsi, karena OpenBSD hanya memiliki LC_COLLATE = C.Pyth 1.0.2 , 19
20Coba di sini: http://ideone.com/fork/YlWpEJ
Pelajari lebih lanjut tentang Pyth di sini: http://esolangs.org/wiki/Pyth
Contoh:
Memberi:
Penjelasan:
=ZUw
: Konversikan input ke huruf besar dan simpan di Z.sV
: Cetak jumlah kebalikan darim;d
: Entri terakhir dariS
: Diurutkan berdasarkan entri pertama mereka, dalam urutan yang meningkatm[cZkk)
: Daftar [hitungan k dalam Z, k]UG
: Untuk k dalam huruf besar.Setara dengan Python:
Ini bukan entri, saya hanya berpikir orang mungkin ingin melihatnya. Dalam Pyth 1.0.4, program berikut adalah solusi dalam 10 karakter:
Penjelasan:
JUw
: Konversikan input ke huruf besar dan simpan di J.o
: (Cetak) Urutkan berdasar_cJN
: -1 * (hitungan N dalam J)UG
: Over N dalam huruf besar.Ini bukan solusi hukum karena beberapa perubahan dari Pyth 1.0.2 ke 1.0.4, termasuk penambahan
o
, urutkan berdasarkan, fungsi, dalam menanggapi masalah ini.sumber
Z
untuk merujuknya sekali lagi? Apakah menempatkan ekspresi sajaZ
di tempatnya menyebabkan input dibaca beberapa kali?Javascript ( ES6 )
119117Sunting: (-2) Menghapus kebutuhan untuk
toUpperCase
menggunakan RegEx case-insensitive dalamsplit
panggilan.Alternatif (panjang yang sama): Mengompensasi pengurutan dan karakter menjadi satu fungsi.
Sebagai fungsi:
105104Sunting: (-1) Menyingkat jenis dan penghitungan karakter ke dalam satu fungsi.
sumber
GolfScript, 22 karakter
Cobalah online.
Penjelasan:
:?
menetapkan string input ke simbol?
. (Saya menggunakan simbol tanda baca sehingga nomor berikut91
tidak diuraikan sebagai bagian dari nama simbol.)91,
membuat daftar angka dari 0 hingga 90 (kode ASCIIZ
).+
menambahkan daftar ini ke string input, sehingga mengubahnya dari array kode ASCII ke string (dan juga menghapus string input dari stack).-26>
mengambil 26 karakter terakhir dari string ini, menghasilkan string yang berisi huruf ASCII huruf besar dariA
hinggaZ
.{ }$
menerapkan blok kode untuk semua karakter dalam string input, dan mengurutkan karakter tersebut sesuai dengan hasilnya..
duplikat karakter dan32+
konversi salinan dari huruf besar ke huruf kecil. The]
mengumpulkan dua karakter tersebut ke dalam sebuah array,?\-
mengambil input string disimpan dalam?
dan menghapus semua kejadian dari karakter dalam array dari itu, dan,
jumlah panjang string yang tersisa, yang akan menjadi kunci semacam. Karakter akan diurutkan dalam urutan menaik dengan kunci ini, dan dengan demikian dalam urutan menurun berdasarkan jumlah kemunculan.sumber
91,+-26>
.22
, bukan25
:)Haskell, 110 byte
Contoh penggunaan:
sumber
(/=c)
dan menyingkirkan itu0-
?Ruby 2.0, 53 karakter
EDIT : Tetap berfungsi dengan benar dengan string multiline, terima kasih @ durron597!
Membuat fungsi yang disebut
f
yang dapat digunakan sebagai berikut:Mencetak ke STDOUT:
sumber
EITASUROLNCMPDVQGBHFKJWXYZ
sebagai contoh dalam pertanyaangets
mengembalikan garis pada suatu waktu. Itu dapat diperbaiki dengan mengubahgets
kegets$n
tetapi mengubahnya menjadi fungsi adalah 1 char lebih pendek.Perl,
5446 byteUPDATE: setelah optimasi lebih lanjut dapat diperas hingga 46 byte: (thx dennis for
-n
/{}
hack; perl Cina goth for<=>
->-
hack)Itu harus dijalankan dengan dijalankan dengan
perl -nE
Solusi asli (tidak perlu opsi Perl khusus):
Diverifikasi dalam Perl 5.8.3, 5.14.2
Jika Anda mendapat peringatan, pisahkan
eg
danfor
dengan spasi (karakter +1), jika Anda keberatancontoh penggunaan:
PENJELASAN: Pada masing-masing karakter (
.
) dari setiap baris input (for<>
), menerapkan substitusi "pola", yang sebenarnya dievaluasi sebagai ungkapan (e
benderas///
), yang increment sebuah upcased (uc
) karakter (.
/$&
lebih pendek dari lebih jelas(.)
/$1
) hitung dalam hash (tidak diinisialisasi) (%h
). Kemudian, hash frekuensi huruf digunakan dalam fungsi perbandingan semacam untuk mencetak alfabet huruf besar dengan urutan yang benar.sumber
perl -ne 's/./$h{uc$&}++/eg}{print sort{$h{$b}<=>$h{$a}}A..Z'
-n
danEND{}
, tetapi mereka selalu lebih lama .. jangan ragu untuk memperbarui jawabannya, jika Anda mau-n
lilitkan diwhile(<>){...}
sekitar kode. Saya menghindari mengedit kode pengguna lain. Terlalu mudah untuk membuat kesalahan, beberapa hal hanya berfungsi pada beberapa komputer, dll.}{
"injeksi", bukan hanya tentang-n
opsi yang terkenal . Orang mungkin tidak mengharapkan bahwa string kode sebenarnya secara teknis adalah dibungkus oleh sementara kode lingkaran tali sebelum eksekusi, tidak hanya hanya saja entah bagaimana bekerja seperti seperti apakah itu dibungkus ..$h{$b}<=>$h{$a}
dengan$h{$b}-$h{$a}
R, 123 byte
Kode ditingkatkan berkat saran dari @RichieCotton.
Keluaran:
sumber
C ++,
185183179177 bytesTidak diharapkan untuk menang, tentu saja (bisakah C ++ pernah menang?) Tetapi tetap merupakan latihan yang menyenangkan.
Penjelasan:
sumber
VBScript
181109Diperbarui untuk menggunakan algoritma yang sama sekali berbeda. Mengalahkan JavaScript!
Cantik:
Golf:
sumber
J
4135 BytesDemo:
Penjelasan:
Kuncinya adalah menambahkan array kiri, sehingga semua huruf tersedia, dan sudah dalam urutan. Konsekuensi lucu menggunakan kata benda sebagai tine ketiga ke fork adalah ia berfungsi sebagai kata kerja dan juga frase.
sumber
Groovy -
1301231151129892Sesuai saran @ cfrick (dua kali!):
Tes kecil (tanpa malu-malu dicuri dari @jpjacobs):
Dan tes yang diusulkan juga lulus
sumber
f={('A'..'Z').collectEntries{c->[c,it.toUpperCase().findAll(c).size()]}.sort{-it.value}.keySet().join()}
untuk 104it.grep(~/(?i)$c/)
bukannyait.toUpperCase().grep(c)
toUpperCase
mengganggu saya.SAS - 217 (saya pikir)
Input harus ditempatkan pada saluran setelah pernyataan cards4, atau pada kartu punch yang sesuai untuk sistem Anda. Saya pikir pendekatan ini menghemat beberapa karakter vs berusaha mengutip input.
Saya menyadari bahwa ini tidak memenuhi spesifikasi lengkap, karena hanya mengembalikan karakter yang muncul dalam string input. Saya mungkin perlu memikirkan kembali ini sedikit.
sumber
AppleScript, 278
aku tahu itu
"a" = "A"
benar di AppleScript. Saya bisa menggunakan ini dalam kode golf, tetapi skrip lainnya terlalu bertele-tele. Saya menggunakan AppleScript 1.8.3.Ini mendefinisikan suatu fungsi
f
. Jika Anda menambahkanf("a string")
di bagian bawah skrip dan menjalankannya di Editor Skrip, itu akan menunjukkan hasilnya.Diformat dan dikomentari:
sumber
VBScript
157156 byteEdit: ubah kotak pesan (p) ke kotak pesan hal
Lebih mudah dibaca:
Golf: (155 karakter + 1 carriage return)
Saya memilikinya di 171 sebelumnya dengan kode yang saya temukan lebih menarik, tetapi metode pengurutan nyamandrei lebih pendek dan memerlukan len (s), yang membuat "untuk" lebih pendek dari "sementara" untuk loop pertama. (menguap)
sumber
for t=0
seharusnya begitufor t=1
, kalau tidak, Anda selalu mencetak seluruh alfabet.J -
3835 charFungsi mengambil input di sebelah kanan sebagai string. Bukan pemenang, tapi menyenangkan untuk menulis.
Dijelaskan:
toupper
adalah kata kerja di perpustakaan standar yang mengangkat string. Itu kemudian menjadi argumen yang benar dari kata kerja, sedangkan argumen kiri adalah alfabet: ASCII codepoints 65-90.[
dan,e.~#])
memilih (#
) huruf-huruf di arg kanan (]
) yang merupakan elemen (e.~
) kiri, dan kemudian prepends (,
) arg kiri ([
). Intinya, kita hanya menyimpan karakter huruf besar, dan menambahkan satu salinan alfabet sampai akhir, untuk memastikan kita menangkap semuanya.#/.~@
lalu berikan frekuensi masing-masing karakter. Kebetulan ini diberikan dalam urutan abjad, jadi setelah itu kita bisa menurunkan (\:
) abjad (argumen kiri[
).Contoh malas cepat di bawah ini. Jangan ragu untuk mencobanya sendiri di tryj.tk .
sumber
T-SQL 178
Pada dasarnya, ini adalah solusi VBScript saya tetapi diimplementasikan dalam SQL.
Ini adalah penyalahgunaan hasil XML untuk menyatukan kolom. Dalam penggunaan praktis, ini dapat digabungkan ke tabel luar untuk ditiru
GROUP_CONCAT
fungsi di MySQL dan lainnya.Mendeklarasikan
@
variabel:Kode:
sumber
Perl, 78 byte
Hasil untuk contoh dalam pertanyaan:
Tidak Disatukan:
sumber
echo -e 'x\ny\n\nz\n'
output, yang seharusnya kembaliXYZABCDEFGHIJKLMNOPQRSTUVW
, tetapi menghasilkanXYABCDEFGHIJKLMNOPQRSTUVWZ
sebaliknya. Coba tebak .. :)PHP - 105 byte
Inilah hexdump, penyebab karakter khusus:
Dan versi yang sedikit kurang golf:
Contoh:
sumber
preg_filter()
bekerja?echo join(array_keys($f));
dapat menghemat satu byteC # dalam LINQPad - 203 Bytes
Saya mengambil pendekatan berbeda untuk jawaban Dam Logan. Saya memastikan terlebih dahulu bahwa setiap karakter dalam string input diurutkan berdasarkan penampilannya dan hanya ada satu kali dalam string output. Setelah itu saya menambahkan setiap karakter yang hilang dari alfabet ke string output.
Sayangnya itu tidak akan mengalahkan jawaban Logan Dam jika saya membuat di Visual Studio.
Versi yang lebih mudah dibaca:
sumber
C # (dan LINQ)
255226210 BytesMenggunakan saran Patrick Huizinga, sintaks kueri sekarang lebih pendek:
Penjelasan:
Sintaks metode kesetaraan (217):
Pos asli:
sumber
P
bukanProgram
danstring[]a
bukanstring[] args
danc=>...
bukan(c)=>...
.using
pernyataan, Anda juga bisa meletakkan kelas Anda di dalamSystem.Linq
namespace, dan menghapus keduanya menggunakan pernyataan. Kemudian Anda dapat menyimpan beberapa karakter dan itu masih akan berfungsi dengan baik.namespace
lebih lama dariusing
dan dua{}
s tambahan akan membuat saya lebih mahal.namespace System.Linq{}
jelas lebih pendek dariusing System;using System.Linq;
hanya dengan melihatnya. Idenya adalah untuk menghilangkan keduanyausing
sepenuhnya.C ++
701322232 byteVersi 701 byte pertama (penggunaan STL idiomatik)
Versi bersih yang diperluas:
Idenya adalah untuk menunjukkan program C ++ yang "tepat" tanpa peretasan. Abaikan boilerplate dan fakta bahwa ini hanya dikompilasi pada VC ++
Penjelasan:
Kami mengisi A hingga Z menjadi string dengan iota () , ini memastikan bahwa ketika kami menghitung kejadian, setiap karakter muncul bahkan jika itu tidak ada dalam input.
mengubah () menyalin karakter demi karakter dari input standar dan memasukkannya ke akhir s setelah memanggil toupper () pada masing-masing
Hitungan masing-masing karakter dikurangi dalam peta (dengan mempertahankan penghitungan negatif, kita dapat memiliki urutan menurun tanpa kode tambahan)
Entri peta hitungan disalin ke satu set pasangan, bertukar (char, count) ke (count, char). Karena set dipesan, kami mengurutkannya dengan mengurangi jumlah frekuensi
Akhirnya kami menyalin konten set ke standar keluar, menggunakan transformasi, dan menggunakan select2nd () untuk memilih hanya anggota kedua dari pasangan.
Kode ini cukup mudah dibaca. Solusi C ++ 11 akan terlihat jauh lebih cantik, karena kita dapat menggunakan lambdas
Versi C ++ 11 - tidak perlu lambdas, tetapi berbasis otomatis dan jangkauan untuk membuat semuanya sangat bersih (kalau dipikir-pikir itu dapat Anda lakukan sangat mirip dengan C ++ 98 biasa)
Versi yang diperluas:
Iterasi berikutnya (mengapa membaca dari stdin ketika kita memiliki argv):
Versi yang diperluas:
sumber
Jelly , 9 byte (tidak bersaing)
Penjelasan
Ini berbunyi "mengurutkan alfabet huruf besar dengan jumlah kemunculan dalam input yang ditulis dengan huruf besar, terbalik", yang merupakan terjemahan tantangan yang agak literal: P
Cobalah online!
Tantangan ini dikaitkan dengan Jelly HyperTraining tempat kami menyelesaikan tantangan. Saya memposting ini karena saya adalah orang pertama yang mencapai 10 byte.
-1 byte berkat Erik the Outgolfer (guru JHT)
sumber
ØAŒuċ¥@ÞU
C ++ 377
Menerapkan qsort menggunakan jumlah huruf dalam array n untuk mengurutkan alfabet dalam array A. Jalankan melalui baris perintah:
golf.exe < in.txt
sumber
C, 117 (119) byte
95
dengan223
, dengan biaya 1 byte tambahan.char c;
ke justc;
and++c
toc=c+1%255
.sumber
PowerShell - 139 karakter
Pertama, saya bukan ahli PowerShell. Cukup yakin ada yang lebih pendek dari ini. Tetapi senang dengan itu dan memutuskan untuk berbagi.
Bagaimana itu bekerja:
sumber
Ceylon , 98 byte
sumber
APL,
2620 karakter⎕a[⍒+/⎕a∘.=('\w'⎕r'\u0')⍞]
⎕a[⍒+/⎕a∘.=1(819⌶)⍞]
Terima kasih kepada Adam.
sumber
('\w'⎕r'\u0')
→1(819⌶)