Generasi histogram


12

Tulis program terpendek yang menghasilkan histogram (representasi grafis dari distribusi data).

Aturan:

  • Harus menghasilkan histogram berdasarkan panjang karakter kata-kata (termasuk tanda baca) ke dalam program. (Jika sebuah kata panjangnya 4 huruf, bilah yang mewakili angka 4 bertambah 1)
  • Harus menampilkan label bar yang berkorelasi dengan panjang karakter yang diwakili bar.
  • Semua karakter harus diterima.
  • Jika bilah harus diskalakan, perlu ada cara yang ditunjukkan dalam histogram.

Contoh:

$ ./histogram This is a hole in one!
1 |#
2 |##
3 |
4 |###

$./histogram Extensive word length should not be very problematic.
1 |
2 |#
3 |#
4 |##
5 |
6 |##
7 |
8 |
9 |#
10|
11|
12|#

./histogram Very long strings of words should be just as easy to generate a histogram just as short strings of words are easy to generate a histogram for.
1 |##
2 |#######
3 |#
4 |#######
5 |###
6 |#
7 |##
8 |##
9 |##

4
Tolong tulis spesifikasi daripada memberikan contoh tunggal yang, semata-mata karena menjadi contoh tunggal, tidak dapat mengungkapkan kisaran gaya keluaran yang dapat diterima, dan yang tidak menjamin untuk mencakup semua kasing sudut. Ada baiknya memiliki beberapa kasus uji, tetapi yang lebih penting adalah memiliki spec yang baik.
Peter Taylor

@PeterTaylor Lebih banyak contoh yang diberikan.
syb0rg

1
1. Ini ditandai grafis-output , yang berarti ini tentang menggambar di layar atau membuat file gambar, tetapi contoh Anda ascii-art . Apakah bisa diterima? (Jika tidak maka plannabus mungkin tidak senang). 2. Anda mendefinisikan tanda baca sebagai membentuk karakter yang dapat dihitung dalam suatu kata, tetapi Anda tidak menyatakan karakter mana yang memisahkan kata, karakter mana yang mungkin dan mungkin tidak muncul dalam input, dan bagaimana menangani karakter yang mungkin terjadi tetapi yang tidak alfabet, tanda baca , atau pemisah kata. 3. Apakah dapat diterima, diharuskan, atau dilarang untuk memasang kembali palang agar sesuai dengan ukuran yang masuk akal?
Peter Taylor

@PeterTaylor Saya tidak menandainya ascii-art, karena itu sebenarnya bukan "seni". Solusi Phannabus baik-baik saja.
syb0rg

@PeterTaylor Saya telah menambahkan beberapa aturan berdasarkan apa yang Anda jelaskan. Sejauh ini, semua solusi di sini masih mematuhi semua aturan.
syb0rg

Jawaban:


3

K, 35

{(1+!|/g)#`$(#:'=g:#:'" "\:x)#'"#"}

.

k){(1+!|/g)#`$(#:'=g:#:'" "\:x)#'"#"}"Very long strings of words should be just as easy to generate a histogram just as short strings of words are easy to generate a histogram for."
1| ##
2| #######
3| #
4| #######
5| ###
6| #
7| ##
8| ##
9| ##

.

Contoh yang lebih panjang

k){(1+!|/g)#`$(#:'=g:#:'" "\:x)#'"#"}"Please write a specification rather than giving a single example which, solely by virtue of being a single example, cannot express the range of acceptable output styles, and which doesnt guarantee to cover all corner cases. Its good to have a few test cases, but its even more important to have a good spec."
1 | #####
2 | ######
3 | #######
4 | ########
5 | ######
6 | ##############
7 | ###
8 | #
9 | ##
10| #
11|
12|
13| #

Apa yang terjadi jika ada kata dengan lebih dari 9 huruf?

Ini berfungsi untuk kata-kata dengan panjang apa pun
tmartin

5

R, 55 47 karakter

hist(a<-sapply(scan(,""),nchar),br=.5+0:max(a))

Untungnya R dilengkapi dengan fungsi plot histuntuk histogram, di sini dilengkapi dengan breaksargumen di mana istirahat adalah 0,5, 1,5, ... sampai maks (input) +0,5. sapply(scan(,""),nchar)mengambil input (sebagai stdin), pisahkan dengan mengikuti spasi dan hitung jumlah karakter dari setiap elemen.

Contoh:

hist(a<-sapply(scan(,""),nchar),br=.5+0:max(a))
1: Extensive word length should not be very problematic.
9: 
Read 8 items

masukkan deskripsi gambar di sini

hist(a<-sapply(scan(,""),nchar),br=.5+0:max(a))
1: Very long strings of words should be just as easy to generate a histogram just as short strings of words are easy to generate a histogram for.
28: 
Read 27 items

masukkan deskripsi gambar di sini

Edit:

Variasi pada 71 karakter dengan label sumbu pada setiap nilai yang mungkin:

hist(a<-sapply(scan(,""),nchar),br=.5+0:max(a),ax=F);axis(1,at=1:max(a))

masukkan deskripsi gambar di sini


3
Saya suka ketika bahasa yang biasanya verbose memimpin!

Ini tidak sesuai dengan spesifikasi, namun ...
Gagang Pintu

@ Doorknob spesifikasi mana yang tidak sesuai?
plannapus

Contoh testcases.
Gagang Pintu

3
Mereka adalah contoh, bukan spesifikasi ...
plannapus

5

Python - 83 karakter

Tampaknya kita dapat mengambil input dari mana saja, jadi ini membutuhkan input selama eksekusi, bukan dari baris perintah, dan menggunakan saran Ejrb untuk mempersingkatnya dengan 8.

s=map(len,raw_input().split())
c=0;exec'c+=1;print"%3d|"%c+"#"*s.count(c);'*max(s)

Python - 91 karakter

Ini akan jatuh dengan kutipan.

import sys;s=map(len,sys.argv[1:])
for i in range(1,max(s)+1):print"%3d|"%i+'#'*s.count(i)

Memasukkan:

> python hist.py Please write a specification rather than giving a single example which, solely by virtue of being a single example, cannot express the range of acceptable output styles, and which doesnt guarantee to cover all corner cases. Its good to have a few test cases, but its even more important to have a good spec.

Keluaran:

  1|#####
  2|######
  3|#####
  4|##########
  5|######
  6|#############
  7|####
  8|#
  9|##
 10|#
 11|
 12|
 13|#

2
bagus, Anda dapat mengurangi 4 karakter dengan mengerjakan ulang baris kedua Anda (tidak ada perubahan algoritma) untuk menggunakan execdan merangkai string:c=0;exec'c+=1;print"%3d|"%c+"#"*s.count(c);'*max(s)
ejrb

4

Haskell - 126 karakter

p[d]=[' ',d];p n=n
h l=[1..maximum l]>>= \i->p(show i)++'|':(l>>=($"#").drop.abs.(i-))++"\n"
main=interact$h.map length.words

Ini mengambil input dari stdin, bukan baris perintah:

& head -500 /usr/share/dict/words | runhaskell 15791-Histogram.hs 
 1|##
 2|##
 3|######
 4|###############
 5|################################################
 6|###############################################################
 7|###################################################################
 8|###########################################################################
 9|#############################################################
10|##########################################################
11|#########################################################
12|#########################
13|#######
14|###
15|#####
16|###
17|#
18|
19|#
20|#

Terlihat bagus untukku! +1
syb0rg

3

Python 3.3 (93)

a=[len(i) for i in input().split()]
for i in range(1,max(a)+1):
 print(i,'|',"#"*a.count(i))

Output:
(baris pertama adalah string input)

Very long strings of words should be just as easy to generate a histogram just as short strings of words are easy to generate a histogram for.
1 | ##
2 | #######
3 | #
4 | #######
5 | ###
6 | #
7 | ##
8 | ##
9 | ##

Itu tidak membenarkan angka sebagai solusi Python Lego Stormtroopr (yang juga lebih pendek dari milik saya), tapi ini entri pertama saya dalam kontes golf, jadi saya mungkin juga meninggalkannya di sini saya kira :)


Bisakah Anda mengedit dalam contoh histogram yang dihasilkan oleh program ini?
syb0rg

Ya, tapi saya perhatikan ada satu masalah: itu tidak membenarkan angka sebagai solusi Lego Stormtroopr, jadi saya benar-benar berpikir untuk menghentikan jawaban.
Roberto

Selama ada label untuk bilah terwakili, jawabannya dapat diterima.
syb0rg

Oke, lakukan sekarang! :)
Roberto

Ini mengambil input dari input, bukan dari argumen. Apakah ini @ syb0rg valid?

3

Perl, 56

$d[y///c].='#'for@ARGV;printf"%2d|$d[$_]
",$_ for+1..$#d

Menambahkan saran penulisan ulang dan saran baris baru dari @ manatwork, terima kasih banyak! Menambahkan pembaruan @ chinese_perl_goth.

Penggunaan: simpan sebagai hist.pl dan jalankan perl hist.pl This is a test

Contoh output:

$perl ~/hist.pl This is a test of the histogram function and how it will count the number of words of specific lengths. This sentence contains a long word 'complexity'.
 1|##
 2|#####
 3|####
 4|######
 5|##
 6|#
 7|
 8|#####
 9|#
10|
11|#

1
Kenapa tidak digunakan printf? Anda dapat menggunakan beberapa karakter pada pemformatan. Dan lagi dengan mengubah dari hash array: $d[y///c]++for@ARGV;shift@d;printf"%2d|%s\n",++$i,"#"x$_ for@d.
manatwork

Bisakah saya melihat contoh program ini di tempat kerja?
syb0rg

@manatwork sama printfsekali tidak terpikir oleh saya dan untuk beberapa alasan saya tidak berpikir saya bisa mendapatkan efek yang saya inginkan dengan sebuah array, luar biasa! @ syb0rg menambahkan sekarang
Dom Hastings

2
bermain golf lagi, turun ke 57 byte:$d[y///c].='#'for@ARGV;printf"%2d|$d[$_]\n",$_ for+1..$#d
perl Cina goth

1
Kami melewatkan hanya trik paling sederhana: gunakan baris baru literal alih-alih menyimpan \n1 karakter lagi. Maksud saya seperti ini: pastebin.com/496z2a0n
manatwork

3

J, 48 47 46 45 43 karakter

(;#&'#')/"1|:((],[:+/=/)1+[:i.>./)$;._1' ',

Pemakaian:

   (;#&'#')/"1|:((],[:+/=/)1+[:i.>./)$;._1' ','Very long strings of words should be just as easy to generate a histogram just as short strings of words are easy to generate a histogram for.'
┌─┬───────┐
│1│##     │
├─┼───────┤
│2│#######│  
├─┼───────┤
│3│#      │
├─┼───────┤
│4│#######│
├─┼───────┤
│5│###    │
├─┼───────┤
│6│#      │
├─┼───────┤
│7│##     │
├─┼───────┤
│8│##     │
├─┼───────┤
│9│##     │
└─┴───────┘

Tacit, 38 [:((](;#&'#')"0[:+/=/)1+[:i.>./)#@>@;:: Cobalah online!
Jonah

2

Ruby, 98 85

a=$*.group_by &:size
1.upto(a.max[0]){|i|b=a.assoc i
puts"%-2i|#{b&&?#*b[1].size}"%i}

Tidak banyak bermain golf. Akan golf lebih banyak nanti.

c:\a\ruby>hist This is a test for the histogram thingy. yaaaaaaaaaaaay
1 |#
2 |#
3 |##
4 |##
5 |
6 |
7 |#
8 |
9 |#
10|
11|
12|
13|
14|#

Bekerja dengan baik (++ voteCount). Adakah yang bisa saya lakukan untuk menjawab pertanyaan dengan lebih baik?
syb0rg

1
@ syb0rg IMO pertanyaannya adalah kata-kata baik-baik saja, contoh berbicara sendiri. Meskipun yang terakhir Anda kelihatannya memiliki kesalahan ... Saya menghitung 2 kata 8 huruf (menghasilkan dan menghasilkan) dan 2 kata 9 huruf (histogram, histogram)
Gagang Pintu

Keren. Anda bisa berubah b ?(?#*b[1].size):''dengan b&&?#*b[1].size.
manatwork

2

Powershell, 97 93

$a=@{};$args-split ' '|%{$a[$_.length]++};1..($a.Keys|sort)[-1]|%{"{0,-2} |"-f $_+"#"*$a[$_]}

Contoh:

PS Z:\> .\hist.ps1 This is an example of this program running
1  |
2  |###
3  |
4  |##
5  |
6  |
7  |###

Bisakah saya melihat contoh program ini berjalan?
syb0rg

@ syb0rg Tentu, saya telah memperbarui jawabannya dengan sebuah contoh.
Danko Durbić

Kelihatan bagus! Memberi +1 kepada Anda!
syb0rg

Bagus. Anda dapat menghapus spasi ekstra dan menghemat 6 byte$a=@{};-split$args|%{$a[$_.length]++};1..($a.Keys|sort)[-1]|%{"{0,-2}|"-f$_+"#"*$a[$_]}
mazzy

2

APL (42)

⎕ML←3⋄K,⊃⍴∘'▓'¨+⌿M∘.=K←⍳⌈/M←↑∘⍴¨I⊂⍨' '≠I←⍞

Bisa lebih pendek jika saya bisa menghilangkan garis di mana nilainya 0.

Penjelasan:

  • ⎕ML←3: atur level migrasi ke 3 (ini membuat (partisi) lebih bermanfaat).
  • I⊂⍨' '≠I←⍞: baca input, pisah pada spasi
  • M←↑∘⍴¨: dapatkan ukuran dimensi pertama dari setiap item (panjang kata), dan simpan di M
  • K←⍳⌈/M: dapatkan angka dari 1 hingga nilai tertinggi di M, simpan diK
  • +⌿K∘.=M: untuk setiap nilai dalam M, lihat berapa kali terkandung di dalamnya K.
  • ⊃⍴∘'▓'¨: untuk setiap nilai di dalamnya , dapatkan daftar yang banyak s, dan format sebagai matriks.
  • K,: tambahkan setiap nilai Kke setiap baris dalam matriks, berikan label.

Keluaran:

      ⎕ML←3⋄K,⊃⍴∘'▓'¨+⌿M∘.=K←⍳⌈/M←↑∘⍴¨I⊂⍨' '≠I←⍞
This is a hole in one!
1 ▓  
2 ▓▓ 
3    
4 ▓▓▓
      ⎕ML←3⋄K,⊃⍴∘'▓'¨+⌿M∘.=K←⍳⌈/M←↑∘⍴¨I⊂⍨' '≠I←⍞
Very long strings of words should be just as easy to generate a histogram just as short strings of words are easy to generate a histogram for.
1 ▓▓     
2 ▓▓▓▓▓▓▓
3 ▓      
4 ▓▓▓▓▓▓▓
5 ▓▓▓    
6 ▓      
7 ▓▓     
8 ▓▓     
9 ▓▓     

2

Mathematica 97

Histogram["" <> # & /@ StringCases[StringSplit[InputString[]], WordCharacter] /. 
a_String :> StringLength@a]

Ketika saya memasukkan teks Deklarasi Kemerdekaan sebagai string tunggal (melalui cut and paste, tentu saja), output yang dihasilkan adalah:

Deklarasi Kemerdekaan


2

Keempat, 201

Ini menyenangkan tetapi pengiriman Ruby saya lebih kompetitif. ;-)

variable w 99 cells allot w 99 cells erase : h begin
1 w next-arg ?dup while swap drop dup w @ > if dup w
! then cells + +! repeat w @ 1+ 1 ?do i . 124 emit i
cells w + @ 0 ?do 35 emit loop cr loop ; h

Contoh dijalankan:

$ gforth histo.fth Forth words make for tough golfing!
1 |
2 |
3 |#
4 |#
5 |###
6 |
7 |
8 |#

Panjang kata maks adalah 99.


2

Ruby, 79

(1..(w=$*.group_by &:size).max[0]).map{|i|puts"%2i|#{?#*w.fetch(i,[]).size}"%i}

Contoh dijalankan:

$ ruby hist.rb Histograms, histograms, every where, nor any drop to drink.
 1|
 2|#
 3|##
 4|#
 5|#
 6|##
 7|
 8|
 9|
10|
11|##

Silakan lihat kiriman Keempat saya untuk tertawa.


2

Ruby 1.8.7, 74

Pilihan yang sedikit berbeda dari solusi ruby ​​lainnya:

i=0;$*.map{|v|v.size}.sort.map{|v|$><<(i+1..v).map{|n|"
%2i:"%i=n}+['#']}

keluaran:

ruby hist.rb `head -400 /usr/share/dict/words`

 1:#
 2:###
 3:######
 4:#############################
 5:#####################################################
 6:############################################################
 7:########################################################################
 8:######################################################
 9:############################################################
10:########################
11:###########################
12:######
13:#####

Awalnya saya tidak melihat kiriman ini, maaf! +1
syb0rg

1

JavaScript ( 159 133)

Jelas tidak kompetitif, tetapi sejauh ini satu-satunya solusi JavaScript. Terima kasih kepada @manatwork untuk tip penggunaannya String.replace.

prompt(o=[]).replace(/\S+/g,function(p){o[l=p.length]=(o[l]||'')+'#'});for(i=1;i<o.length;)console.log(i+(i>9?"|":" |")+(o[i++]||""))

Memasukkan

Code Golf adalah situs tanya jawab untuk penggemar teka-teki pemrograman dan pegolf kode. Ini dibangun dan dijalankan oleh Anda sebagai bagian dari jaringan Stack Exchange situs Q&A. Dengan bantuan Anda, kami bekerja sama untuk membangun perpustakaan teka-teki pemrograman dan solusinya.

Keluaran

1 |##
2 |#######
3 |#########
4 |########
5 |######
6 |###
7 |####
8 |####
9 |
10|#
11|###

1
Memang, ini bukan bidang di mana JavaScript unggul. Tapi dengan replace()bukannya split()+ fordan Arraybukannya Objectpanjang variabel yang terpisah + dapat dikurangi dengan beberapa karakter: prompt(o=[]).replace(/\S+/g,function(p){o[l=p.length]=(o[l]||"")+"#"});for(i=1;i<o.length;)console.log(i+(i>9?"|":" |")+(o[i++]||"")). (Dan bahkan lebih pendek di Harmony:. prompt(o=[]).replace(/\S+/g,p=>o[l=p.length]=(o[l]||"")+"#");for(i=1;i<o.length;)console.log(i+(i>9?"|":" |")+(o[i++]||"")))
manatwork

@manatwork Penyalahgunaan bagus di .lengthsana.
quietmint

1

Bash murni 120

d="$@"
d=${d//[ -z]/#}
for a;do((b[${#a}]++));done
e="${!b[@]}"
for((i=1;i<=${e##* };i++));do
echo $i\|${d:0:b[i]}
done

Sampel:

./histogram.sh Very long strings of words should be just as easy to generate a histogram just as short strings of words are easy to generate a histogram for.
1|##
2|#######
3|#
4|#######
5|###
6|#
7|##
8|##
9|##

Simpan 8 karakter dengan menggunakan satu garpu ke tr: 112

for a;do((b[${#a}]++));done
e="${!b[@]}"
for((i=1;i<=${e##* };i++));do
printf "%d|%${b[i]}s\n" $i
done|tr \  \#

Berikan hasil yang sama:

bash -c 'for a;do((b[${#a}]++));done;e="${!b[@]}";for((i=1;i<=${e##* };i++));
do printf "%d|%${b[i]}s\n" $i;done|tr \  \#' -- $( sed 's/<[^>]*>//g;
s/<[^>]*$//;s/^[^<]*>//' < /usr/share/scribus/loremipsum/english.xml )

render (di host saya :)

1|############################################################
2|#################################################################################################################################################################################################################
3|####################################################################################################################################################################################################################################################
4|####################################################################################################################################################################################################
5|####################################################################################################################################################################
6|#######################################################################################
7|##########################################################################################
8|###################################################
9|###############################
10|####################
11|#########
12|############
13|#####
14|####
15|##
16|
17|
18|
19|
20|
21|
22|
23|
24|
25|
26|
27|
28|
29|
30|
31|
32|
33|
34|#

1

PHP, 162

<?php error_reporting(0);$b=0;while($argv[$b])$c[strlen($argv[++$b])]++;for($t=1;$t<=max(array_keys($c));$t++)echo $t.'|'.($c[$t]?str_repeat('#',$c[$t]):'')."\n";

Pemakaian:

php histogram.php Very long strings of words should be just as easy to generate a histogram just as short strings of words are easy to generate a histogram for.
1|##
2|#######
3|#
4|#######
5|###
6|#
7|##
8|##
9|##

1

8 , 162 byte

Kode

a:new ( args s:len nip tuck a:@ ( 0 ) execnull rot swap n:1+ a:! ) 0 argc n:1- loop 
a:len n:1- ( dup . "|" . a:@ ( 0 ) execnull "#" swap s:* . cr ) 1 rot loop bye

Pemakaian

$ 8th histogram.8th Nel mezzo del cammin di nostra vita mi ritrovai per una selva oscura

Keluaran

1|
2|##
3|####
4|#
5|##
6|###
7|
8|#

Kode tidak digabungkan ( SED adalah Stack Effect Diagram)

a:new               \ create an empty array 
( 
    args s:len      \ length of each argument
                    \ SED: array argument lengthOfArgument
    nip             \ SED: array lengthOfArgument
    tuck            \ SED: lengthOfArgument array lengthOfArgument
    a:@             \ get item array at "lengthOfArgument" position
    ( 0 ) execnull  \ if null put 0 on TOS
                    \ SED: lengthOfArgument array itemOfArray
    rot             \ SED: array itemOfArray lengthOfArgument    
    swap            \ SED: array lengthOfArgument itemOfArray
    n:1+            \ increment counter for the matching length
    a:!             \ store updated counter into array 
) 0 argc n:1- loop  \ loop through each argument
\ print histogram
a:len n:1- ( dup . "|" . a:@ ( 0 ) execnull "#" swap s:* . cr ) 1 rot loop 
bye                 \ exit program
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.