Histogram oluşturma


12

Histogram (veri dağılımının grafiksel gösterimi) oluşturan en kısa programı yazın .

Kurallar:

  • Programa girilen kelimelerin karakter uzunluğuna (noktalama işareti dahil) dayalı bir histogram oluşturulmalıdır. (Bir kelime 4 harf uzunluğundaysa, 4 sayısını temsil eden çubuk 1 artar)
  • Çubukların temsil ettiği karakter uzunluğuyla ilişkili çubuk etiketleri görüntülenmelidir.
  • Tüm karakterler kabul edilmelidir.
  • Çubukların ölçeklendirilmesi gerekiyorsa, histogramda gösterilen bir yol olması gerekir.

Örnekler:

$ ./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
Lütfen yalnızca tek bir örnek olması nedeniyle kabul edilebilir çıktı stilleri aralığını ifade edemeyen ve tüm köşe vakalarını kapsamayı garanti etmeyen tek bir örnek vermek yerine bir şartname yazınız. Birkaç test vakasına sahip olmak iyidir, ancak iyi bir spesifikasyona sahip olmak daha da önemlidir.
Peter Taylor

@PeterTaylor Daha fazla örnek verilmiştir.
syb0rg

1
1. Bu grafik çıktı olarak etiketlenir , yani ekranda çizim yapmak veya bir görüntü dosyası oluşturmakla ilgilidir, ancak örnekleriniz ascii-art'tır . Ya kabul edilebilir mi? (Değilse plannabus mutlu olmayabilir). 2. Noktalama işaretini bir sözcükte sayılabilir karakterler oluşturmak olarak tanımlarsınız, ancak hangi karakterlerin sözcükleri ayırdığını, girişte hangi karakterlerin oluşabileceğini ve oluşmayabileceğini ve oluşabilecek ancak alfabetik olmayan karakterlerin nasıl işleneceğini belirtmezsiniz. veya kelime ayırıcılar. 3. Barların makul bir boyuta sığması için yeniden ölçeklendirilmesi kabul edilebilir, gerekli veya yasaklanmış mı?
Peter Taylor

@PeterTaylor Ascii-art olarak etiketlemedim, çünkü gerçekten "sanat" değil. Phannabus'un çözümü gayet iyi.
syb0rg

@PeterTaylor Açıkladığınız şeye bağlı olarak bazı kurallar ekledim. Şimdiye kadar, buradaki tüm çözümler hala tüm kurallara uymaktadır.
syb0rg

Yanıtlar:


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| ##

.

Daha uzun bir örnek

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| #

9'dan fazla harf içeren kelimeler varsa ne olur?

Herhangi bir uzunluktaki kelimeler için çalışır
tmartin

5

R, 55 47 karakter

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

Neyse ki R, histhistogramlar için bir çizim fonksiyonu ile birlikte gelir , burada breaksmolaların maksimum (giriş) +0,5'e kadar 0,5, 1,5, ... olduğu bir argümanla sağlanır . sapply(scan(,""),nchar)bir girdi alır (stdin olarak), boşluklardan sonra ayırır ve her öğenin karakter sayısını sayar.

Örnekler:

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

resim açıklamasını buraya girin

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

resim açıklamasını buraya girin

Düzenle:

Her olası değerde bir eksen etiketine sahip 71 karakterlik bir varyasyon :

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

resim açıklamasını buraya girin


3
Normalde ayrıntılı bir dil öne çıktığında seviyorum!

Ancak bu şartnameye
uymuyor

@Doorknob hangi spesifikasyona uymuyor?
plannapus

Örnek test senaryoları.
Kapı tokmağı

3
Bunlar özellikler değil, örneklerdir ...
plannapus

5

Python - 83 karakter

Herhangi bir yerden girdi alabileceğimiz anlaşılıyor, bu yüzden komut satırından ziyade yürütme sırasında girdi alıyor ve Ejrb'nin önerisini 8 kısaltmak için kullanıyor.

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

Python - 91 karakter

Bu tırnak işaretleri ile düşecek.

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

Giriş:

> 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.

Çıktı:

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

2
güzel, kullanmak execve dize birleştirme için ikinci satır (algoritma değişikliği yok) yeniden c=0;exec'c+=1;print"%3d|"%c+"#"*s.count(c);'*max(s)
çalışarak

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

Bu stdin, komutu komut satırından değil , girişten alır :

& 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|#

Bana iyi görünüyor! +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))

Çıktı:
(ilk satır giriş dizesidir)

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 | ##

Lego Stormtroopr'un Python çözümü (benimkinden daha kısa) olarak sayıları haklı çıkarmıyor, ama bir golf yarışmasında ilk girişim bu yüzden sanırım burada bırakabilirim :)


Bu program tarafından oluşturulan bir histogram örneğinde düzenleme yapabilir misiniz?
syb0rg

Evet, ama sadece bir problemi olduğunu fark ettim: Numaraları Lego Stormtroopr'un çözümü olarak haklı çıkarmıyor, bu yüzden aslında cevabı emekliye ayırmayı düşünüyorum.
Roberto

Temsil edilen çubuklar için etiketler olduğu sürece cevap kabul edilebilir.
syb0rg

Tamam, tamam o zaman! :)
Roberto

Bu, girdiyi bağımsız değişkenlerden değil girdiden alır. Bu restoranda öğle yemeği var mı?

3

Perl, 56

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

@ Manatwork'ün yeniden yazma ve gerçek satırsonu önerisi eklendi, çok teşekkürler! @ Chinese_perl_goth adlı kullanıcının güncellemeleri eklendi.

Kullanım: hist.pl olarak kaydedin ve çalıştırın perl hist.pl This is a test

Örnek çıktı:

$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
Neden kullanmıyorsunuz printf? Biçimlendirme ile ilgili bazı karakterleri yedekleyebilirsiniz. Ve karma gelen diziye değiştirerek biraz daha: $d[y///c]++for@ARGV;shift@d;printf"%2d|%s\n",++$i,"#"x$_ for@d.
manatwork

Bu programın bir örneğini iş yerinde görebilir miyim?
syb0rg

@manatwork printfbana hiç olmadı ve nedense bir dizi ile istediğim efekti elde edebileceğimi düşünmedim, inanılmaz! @ syb0rg şimdi ekleniyor
Dom Hastings

2
biraz daha golf, 57 bayt aşağı indi:$d[y///c].='#'for@ARGV;printf"%2d|$d[$_]\n",$_ for+1..$#d
Çin perl goth

1
Sadece en basit numarayı kaçırdık: \n1 karakter daha eklemek yerine gerçek bir satırsonu kullanın . Şunu demek istiyorum: pastebin.com/496z2a0n
manatwork

3

J, 48 47 46 45 43 karakter

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

Kullanımı:

   (;#&'#')/"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.>./)#@>@;:: Çevrimiçi deneyin!
Jonah

2

Yakut, 98 85

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

Çok golf değil. Daha sonra golf olacak.

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|#

Güzel çalışıyor (++ voteCount). Soruyu daha iyi söylemek için yapabileceğim bir şey var mı?
syb0rg

1
@ syb0rg IMO soru iyi ifade, örnekler kendileri için konuşur. Son
zamanınızın

Güzel. Sen değiştirebilir b ?(?#*b[1].size):''ile b&&?#*b[1].size.
manatwork

2

Powershell, 97 93

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

Misal:

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

Bu programın çalıştığını gösteren bir örnek görebilir miyim?
syb0rg

@ syb0rg Elbette, cevabı bir örnekle güncelledim.
Danko Durbić

İyi görünüyor! Sana +1!
syb0rg

Güzel. Fazladan boşlukları kaldırabilir ve 6 bayt tasarruf edebilirsiniz$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←⍞

Değerin 0 olduğu satırları atlayabilirsem daha kısa olabilirdi.

Açıklama:

  • ⎕ML←3: taşıma düzeyini 3 olarak ayarlayın (bu, (bölüm) daha kullanışlı hale getirir ).
  • I⊂⍨' '≠I←⍞: okuma girişi, boşluklara bölünmüş
  • M←↑∘⍴¨: her öğenin ilk boyutunun boyutunu (kelime uzunlukları) alın ve M
  • K←⍳⌈/M: 1'den en yüksek değere kadar olan rakamları alın M,K
  • +⌿K∘.=M: içindeki her değer için M, kaç kez içerildiğine bakın K.
  • ⊃⍴∘'▓'¨: bu değerdeki her değer için o kadar çok s'nin listesini alın ve bunu bir matris olarak biçimlendirin.
  • K,: Ketiketleri vererek her değeri matristeki her satıra yerleştirir.

Çıktı:

      ⎕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]

Bağımsızlık Bildirgesi'nin metnini tek bir dize olarak girdiğimde (elbette kes ve yapıştır ile), üretilen çıktı:

bağımsızlık Bildirgesi


2

Dördüncü, 201

Bu eğlenceliydi ama Ruby sunumum daha rekabetçi. ;-)

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

Örnek çalışma:

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

Maksimum kelime uzunluğu 99'dur.


2

Yakut, 79

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

Örnek çalışma:

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

Gülmek için lütfen Dördüncü gönderime bakın.


2

Yakut 1.8.7, 74

Diğer yakut çözeltilerinden biraz farklı bir yaklaşım:

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

çıktı:

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

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

Başlangıçta bu sunumu görmedim, üzgünüm! +1
syb0rg

1

JavaScript ( 159133 )

Kesinlikle rekabetçi değil, ama şimdiye kadar tek JavaScript çözümü. @Manatwork kullanmanın ipucu için teşekkürler 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++]||""))

Giriş

Kod Golf bulmaca meraklıları ve kod golfçüler programlama için bir soru ve cevap sitesidir. Soru-cevap sitelerinin Stack Exchange ağının bir parçası olarak sizin tarafınızdan oluşturulmuş ve işletilmektedir. Sizin yardımınızla birlikte, programlama bulmacaları ve çözümlerinin bir kütüphanesini oluşturmak için birlikte çalışıyoruz.

Çıktı

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

1
Aslında, bu gerçekten JavaScript'in mükemmel olduğu bir alan değildir. Ama ile replace()yerine split()+ forve Arrayyerine Object+ ayrı uzunluk değişkeni birkaç karakterlerle azaltılabilir: 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++]||"")). (Ve daha da 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 .lengthOrada güzel taciz .
quietmint

1

Saf bash 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

Örneklem:

./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|##

Bir çatal kullanarak 8 karakter kazanın 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 \  \#

Aynı sonucu verin:

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 (sunucumda :)

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";

Kullanımı:

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 bayt

kod

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

kullanım

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

Çıktı

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

Açık kod ( SED Yığın Etki Diyagramıdır)

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.