Diberikan kalimat input yang terdiri dari satu kata atau lebih [a-z]+
dan nol atau lebih spasi , menghasilkan histogram ASCII-art (grafik batang) dari distribusi huruf dari kalimat input.
Histogram harus ditata secara horizontal, yaitu dengan tombol huruf di bagian bawah dalam urutan abjad dari kiri ke kanan, dengan sumbu Y berlabel 1-
dan setiap 5 unit. Sumbu Y harus merupakan kelipatan terkecil dari lima yang setidaknya setinggi bilah tertinggi, dan harus sejajar kanan. Sumbu X dilabeli dengan huruf input, tanpa ada celah di antara keduanya. Misalnya, input a bb dd
harus memiliki label abd
dan tidak ab d
, melewatkan c
. Bilah sendiri dapat dibuat dari karakter ASCII yang konsisten - Saya akan menggunakan X
di sini dalam contoh saya.
test example
5-
X
X X
1-XXXXXXXX
aelmpstx
Karena ada tiga e
, dua t
, dan satu almsx
.
Lebih banyak contoh:
the quick brown fox jumped over the lazy dogs
5-
X X
X X
XX X X X XX
1-XXXXXXXXXXXXXXXXXXXXXXXXXX
abcdefghijklmnopqrstuvwxyz
now is the time for all good men to come to the aid of their country
10-
X
X
X X
X X X
5- X X X
X X X X
X XX XXXX X
XXXXX XXXXXXX X
1-XXXXXXXXXXXXXXXXXX
acdefghilmnorstuwy
a bb ccc dddddddddddd
15-
X
X
10- X
X
X
X
X
5- X
X
XX
XXX
1-XXXX
abcd
a bb ccccc
5- X
X
X
XX
1-XXX
abc
I / O dan Aturan
- Input dapat diambil dalam format apa pun yang masuk akal dan dengan metode apa pun yang praktis . Ini juga berarti Anda dapat mengambil input dalam huruf besar semua, jika itu lebih masuk akal untuk kode Anda.
- Leading / trailing newlines atau spasi putih lainnya adalah opsional, asalkan karakternya berbaris dengan tepat.
- Program lengkap atau fungsi dapat diterima. Jika suatu fungsi, Anda dapat mengembalikan output daripada mencetaknya.
- Output bisa ke konsol, dikembalikan sebagai daftar string, dikembalikan sebagai string tunggal, dll.
- Celah standar dilarang.
- Ini adalah kode-golf sehingga semua aturan golf biasa berlaku, dan kode terpendek (dalam byte) menang.
Jawaban:
Stax , 37 byte
Jalankan dan debug itu
sumber
R ,
239230 byteCobalah online!
table
melakukan pengangkatan berat di sini, menyatukan karakter, menyortirnya, dan mengembalikan jumlah mereka.Segala sesuatu yang lain hanya memastikan offset yang tepat untuk dicetak, yang merupakan karya "nyata" dari tantangan ascii-art.
Terima kasih kepada @dylnan karena menunjukkan bug.
Terima kasih kepada @rturnbull untuk
scan
pendekatannya, menjatuhkan 2 byte.sumber
gnu sed -r,
516490278249 + 1 byteCobalah online!
Saya yakin ini dapat ditingkatkan
, tetapi untuk saat ini, ini harus bagus mengingat dibuat di sed, di mana Anda tidak memiliki aritmatika atau penyortiran asli.Jadi saya berbohong, ini tidak cukup baik, jadi saya meningkatkan (menulis ulang) dengan 212 byte, dengan tip mengenai algoritma pengurutan dari sapi dukun , yang memberi saya ide untuk membuat konversi unary ke desimal lebih pendek juga.Deskripsi pekerjaan dalam:
Ini mengurutkan input dan memisahkan grup dengan spasi. Ini bekerja dengan terlebih dahulu menambahkan alfabet huruf besar ditambah ruang yang dipisahkan oleh titik dua hingga akhir. Kemudian memindahkan setiap karakter di depan titik dua ke karakter yang cocok di belakang titik dua menggunakan substitusi case-insensitive dalam satu lingkaran. Huruf besar kemudian diganti dengan spasi dan string disalin ke ruang penyimpanan.
Loop ini berfungsi dengan mengurangi setiap ukuran grup karakter satu per satu, menambahkan garis asli yang diurutkan dan menambah penghitung unary setelah titik dua yang tersisa dari pengurutan. Itu loop sampai garis kosong dengan jumlah 5 * n + 1 tercapai (karena baris terakhir akhirnya menghasilkan spasi putih). Ruang pola terlihat seperti ini setelah loop:
Kemudian formatnya sebagai berikut:
Dan akhirnya, konverter unary ke desimal tetap:
Ini pada dasarnya menambahkan string di mana pengetahuan konversi. Anda dapat menafsirkannya sebagai: spasi: -> 1 dan 0-> 1-> 2-> 3-> 4-> 5-> 6-> 7-> 8-> 9-> I0. Ekspresi substitusi
s/(.)I(.*\1(I?.))|;.*/\3\2/
bekerja mirip dengan yang menyortir, mengganti karakter di depan saya [(.)I
] dengan karakter yang di sebelah yang dari depan saya di string konversi [(.*\1(I?.))
] dan jika tidak ada saya pergi, itu menghilangkan string yang ditambahkan [|;.*
]. Substitusi [/\nI/s/^/ /Mg
] menambahkan padding jika diperlukan.Terima kasih kepada Sapi dukun untuk mengurangi ukuran oleh 26 byte dan untuk algoritma penyortiran yang lebih pendek.
sumber
\w
(mencocokkan karakter kata) di sejumlah tempat untuk menyimpan beberapa byte. Juga:b ... tb
bisa dengan mudah menjadis/\B\w/X/g
. Anda dapat menghapus baris yang mengikutinyas/:/:,/g
,, dengan memodifikasi substitusi sebelumnya. Anda dapat melihat goo.gl/JvD7Rs (disingkat tautan TIO ke program sed) untuk melihat apa yang saya maksud.zyx...cba
ke input.Dyalog APL ,
1099796959388 byteCobalah online!
Membutuhkan
⎕IO←0
Cara terlalu banyak byte diselamatkan berkat Adam dan Sapi dukun !
sumber
⍵[⍋⍵]~' '
(mengurutkan dan menghapus spasi sebelum melewati⌸
)'X'/⍨≢
→∊⍕¨×
⍵>0
→×⍵
2⌷⍴
→≢⍉
dua kali05AB1E ,
5847 byteCobalah online!
-11 byte terima kasih kepada @Emigna
sumber
Python 2 , 192 byte
Cobalah online!
Penjelasan
Baris 2 menghitung nilai histogram dengan cara yang cukup mudah, membuang
' '
.Baris 3 menggunakan trik komputasi
ceil(x/5)
sebagai-(-x/5)
: kita membulatkan frekuensi maksimal hingga kelipatan 5 berikutnya menggunakan rumus-x/5*-5
. Inih
.Baris 4 adalah loop yang dihitung dari
h
bawah hingga0
inklusif, mencetak setiap baris:Jika
y%5==2>>y
kami mencetak label. Inilah saatnyay
∈ {1, 5, 10, 15, 20,…}(Rumus ini mungkin bisa lebih pendek. Kami hanya memerlukan sesuatu yang 1 atau Benar untuk {1, 5, 10, ...}, dan 0 atau Salah atau bahkan bilangan bulat negatif untuk semua nilai lainnya dari
y
.)Kami membenarkan label (atau ruang kosong) menjadi
len(`-h`)
spasi: ini adalah penghematan satu byte yang rapilen(`h`)+1
!Kemudian, kita mencetak
X
spasi dan spasi untuk baris ini (jikay
≥ 1) atau huruf (jikay
= 0), berjalan melalui pasangan nilai kuncid
dalam urutan menaik.sumber
'%d-'%y*(y%5==2>>y)
. Apakah Anda keberatan jika saya menggunakannya dalam jawaban saya?-~-(y%5*~-y)
berfungsi juga tetapi sayangnya itu satu byte lebih lama.Arang , 62 byte
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:
Buat daftar 27 daftar.
Dorong setiap karakter input ke daftar yang sesuai dengan posisinya dalam alfabet huruf kecil. Karakter non-huruf kecil didorong ke daftar ke-27.
Buang elemen ke-27 dari daftar.
Ambillah panjang semua elemen daftar.
Cetak huruf kecil sesuai dengan elemen daftar bukan nol.
Cetak elemen daftar yang bukan nol ke atas. Karena ini adalah array bilangan bulat, setiap bilangan bulat dicetak sebagai (sekarang vertikal), masing-masing dalam kolom terpisah.
Hitung jumlah tanda centang pada sumbu Y dan lewati.
Hitung posisi tanda centang berikutnya.
Lompat ke tanda centang berikutnya.
Cetak tanda centang terbalik dan kembali ke depan, secara efektif meluruskannya.
sumber
Jelly , 48 byte
Apa ladang ranjau yang harus dilalui!
Program lengkap yang mencetak hasilnya (sebagai tautan monadik akan menghasilkan daftar berisi karakter dan bilangan bulat dari
[0,9]
)Cobalah online! Atau lihat test-suite
Bagaimana?
sumber
APL (Dyalog Classic) , 56 byte
Cobalah online!
sumber
Ruby ,
250248234188173157153 byteCobalah online!
Terimakasih untuk:
-x/5*-5
|[]
sumber
Java (JDK 10) , 296 byte
Cobalah online!
Kredit
sumber
--m%5==0
bisa jadi--m%5<1
, karena Anda juga punya&m>0
cek. Danm<=d[a]?"x":" "
bisa jadim>d[a]?" ":"x"
.(--m%5<1|m==1)&m>0
ke--m%5<1|m==1&&m>0
Pyth, 65 byte
Coba di sini
Penjelasan
sumber
JavaScript (Node.js) ,
262256 byte* Terima kasih kepada @Shaggy karena mengurangi 2 byte
Cobalah online!
sumber
1.
Ambil input sebagai array karakter individual,2.
Gantix!=" "
denganx>" "
.3.
Gantim=0
dengani=m=0
danmap((x,i)=>
denganmap(x=>
.Python 2 ,
249224219215205197187188182176 byteCobalah online!
Mengembalikan daftar daftar karakter yang mewakili garis.
map(list,yticks)
di sana.y==1
diganti olehy<2
.'%d-'%y*(y%5==2>>y)
alih-alih(`y`+'-')*(not y%5or y<2)
.Sedikit tidak berbulu:
sumber
C # (.NET Core) ,
344340338 + 18 byteTermasuk 18 byte untuk
using System.Linq;
Disimpan 6 byte berkat @KevinCruijssen.
Cobalah online!
sumber
j< m;
yang dapat dihapus. Danint i=0,j
dapat ditempatkan seperti,i=0,j
setelah int lainnya untuk total -4 byte. Anda harus memasukkan 18 byte untukusing System.Linq;
...for(;i<t;){string p=i>0&i%5<1|i==1?i+"-":"",q=p.PadLeft(o);for(j=o;j<m;){...}a[i++]=q;}
kefor(string p,q;i<t;)for(p=i>0&i%5<1|i==1?i+"-":"",q=p.PadLeft(j=o);j<m;a[i++]=q){...}
. Cobalah online.Bash + coreutils,
332324323318312302298296293291 byteCobalah online!
Beranotasi:
Terima kasih kepada @IanM_Matrix karena telah menghemat 3 byte.
sumber
cat b
dapat<b
menyimpan 3 karakterC, 201 byte
Input diambil dari baris perintah (argumen pertama). Menggunakan tanda seru alih-alih X untuk mengurangi ukuran kode lebih lanjut. Penghitung di sebelah kiri selalu tiga karakter.
Diuji dengan GCC dan dentang.
sumber
for(p=b[1];*p;p++)
kemungkinan besar bisafor(p=b[1]-1;*++p;)
,main(int a,char **b)
mungkin bisa golfm(a,b)char**b;
.a!=1
akan menjadi boolean,a%5&&a!=1?
harus setara dengana%5&a!=1?
ataua%5&&~-a
.Excel VBA, 316 byte
Fungsi jendela langsung VBE Anonim yang mengambil input dari sel
[A1]
dan output ke jendela langsung VBE.Versi Tidak Serigala
sumber
Perl 5
-n
,198168 byteCobalah online!
sumber
Python 3 , 177 byte
Cobalah online!
Ini mungkin bukan pendekatan byte-efisien di Python, tapi saya benar-benar ingin menyelesaikan ini dengan lambda "true one-liner".
Mengeluarkan daftar daftar karakter. Menyalahgunakan banyak baris dan spasi baru seperti halnya orang lain. Ini sebenarnya dapat dikurangi menjadi 174 byte jika dapat diterima untuk membungkus hasilnya di daftar lain, sehingga kami dapat mentransfer
[0]
pengindeksan terakhir ke footer.sumber
JavaScript (ES8), 200 byte
Mengambil input sebagai array karakter. Mengembalikan string.
Cobalah online!
Berkomentar
sumber