直方图生成


12

编写最短的程序以生成直方图(数据分布的图形表示)。

规则:

  • 必须根据输入到程序中的单词的字符长度(包括标点符号)生成直方图。(如果一个单词的长度为4个字母,则代表数字4的条形将增加1)
  • 必须显示与标签代表的字符长度相关的标签。
  • 必须接受所有字符。
  • 如果必须缩放条形图,则必须在直方图中显示某种方式。

例子:

$ ./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
请写一个规范而不是给出一个单独的示例,该示例仅由于是一个示例而不能表示可接受的输出样式的范围,并且不能保证涵盖所有极端情况。拥有一些测试用例是很好的,但是拥有良好的规格甚至更重要。
彼得·泰勒

@PeterTaylor给出了更多示例。
syb0rg 2013年

1
1.这是标记为graphics-output的标记,这意味着它是关于在屏幕上绘图或创建图像文件,但是您的示例是ascii-art。可以接受吗?(否则,plannabus可能会不开心)。2.您将标点符号定义为在一个单词中形成可计数的字符,但是您没有说明哪些字符将单词分隔开,哪些字符可能会或可能不会出现在输入中,以及如何处理可能出现但不是字母的字符,或单词分隔符。3.重新调整条形以适合合理的尺寸是否可以接受,要求或禁止?
彼得·泰勒

@PeterTaylor我没有将其标记为ascii-art,因为它确实不是“艺术”。Phannabus的解决方案很好。
syb0rg 2013年

@PeterTaylor我根据您的描述添加了一些规则。到目前为止,这里的所有解决方案仍然遵守所有规则。
syb0rg 2013年

Answers:


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

一个更长的例子

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个会怎样?

它适用于任何长度的单词
tmartin

5

R,55 47个字符

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

幸运的是R带有一个hist直方图的绘图函数,这里提供了一个breaks参数,其中间隔为0.5、1.5,...,直到max(input)+0.5。sapply(scan(,""),nchar)接受一个输入(如stdin),将其与空格分隔并计算每个元素的字符数。

例子:

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

在此处输入图片说明

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

在此处输入图片说明

编辑:

71个字符的变体,每个可能的值都有一个轴标签:

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

在此处输入图片说明


3
我喜欢以通常的冗长语言为主导!

但是,这不符合规范...
门把手

@Doorknob不符合哪个规范?
plannapus 2013年

示例测试用例。
门把手

3
它们只是示例而不是规范...
plannapus 2013年

5

Python-83个字符

似乎我们可以从任何地方获取输入,因此这可以在执行期间而不是从命令行获取输入,并使用Ejrb的建议将其缩短8。

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

Python-91个字符

这将用引号引起来。

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

输入:

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

输出:

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

2
不错,您可以通过改写第二行(无需更改算法)来使用exec和字符串串联来减少4个字符:c=0;exec'c+=1;print"%3d|"%c+"#"*s.count(c);'*max(s)
ejrb 2013年

4

Haskell-126个字符

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

这将从而stdin不是命令行输入:

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

对我来说看上去很好!+1
syb0rg 2013年

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

输出:(
第一行是输入字符串)

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的Python解决方案(也比我的短)来证明数字的合理性,但这是我第一次参加高尔夫比赛,所以我不妨将其留在这里:)


您可以在此程序中编辑生成的直方图的示例吗?
syb0rg 2013年

是的,但我只是注意到它有一个问题:它不能证明数字是Lego Stormtroopr的解决方案,因此我实际上是在考虑取消答案。
罗伯托

只要有代表条的标签,答案就可以接受。
syb0rg 2013年

好的,那就完成了!:)
Roberto

这从输入而不是从参数获取输入。这是有效的@ syb0rg吗?

3

Perl,56岁

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

添加了@manatwork的重写和文字换行符建议,非常感谢!添加了@chinese_perl_goth的更新。

用法:另存为hist.pl并运行 perl hist.pl This is a test

输出示例:

$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
为什么不使用printf?您可以在格式化时保留一些字符。通过将哈希值更改为数组还有更多内容:$d[y///c]++for@ARGV;shift@d;printf"%2d|%s\n",++$i,"#"x$_ for@d
manatwork 2013年

我可以在工作中看到该程序的示例吗?
syb0rg 2013年

@manatwork printf对我根本没有发生,由于某种原因,我认为我无法通过阵列获得想要的效果,太神奇了!@ syb0rg现在添加
Dom Hastings

2
打更多的球,将其减少到57个字节:$d[y///c].='#'for@ARGV;printf"%2d|$d[$_]\n",$_ for+1..$#d
中国perl哥特

1
我们错过了最简单的技巧:使用文字换行符而不是\n多余的1个字符。我的意思是这样:pastebin.com/496z2a0n
manatwork 2013年

3

J,48 47 46 45 43个字符

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

用法:

   (;#&'#')/"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│##     │
└─┴───────┘

默契,38岁[:((](;#&'#')"0[:+/=/)1+[:i.>./)#@>@;:在线尝试!
乔纳

2

红宝石,98 85

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

不打高尔夫球。以后再打高尔夫球。

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

效果很好(++ voteCount)。我可以做些什么来更好地表达这个问题?
syb0rg 2013年

1
@ syb0rg IMO这个问题的措辞很好,这些例子说明了一切。虽然您的上一次似乎有错误...我数了2个8个字母的单词(生成和生成)和2个9个字母的单词(直方图,直方图)
Doorknob

凉。你可以改变b ?(?#*b[1].size):''使用b&&?#*b[1].size
manatwork 2013年

2

Powershell,97 93

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

例:

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

我可以看到该程序正在运行的示例吗?
syb0rg 2013年

@ syb0rg当然,我已经用示例更新了答案。
DankoDurbić2013年

看起来不错!+1给你!
syb0rg 2013年

真好 您可以删除多余的空间并节省6个字节$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←⍞

如果我可以省略值为0的行,则可能会更短。

说明:

  • ⎕ML←3:将迁移级别设置为3(这使(分区)更有用)。
  • I⊂⍨' '≠I←⍞:读取输入,在空格处分割
  • M←↑∘⍴¨:获取每个项目的第一个维度的大小(字长),并存储在 M
  • K←⍳⌈/M:获取从1到最大值的数字M,存储在K
  • +⌿K∘.=M:对于中的每个值M,看看它包含多少次K
  • ⊃⍴∘'▓'¨:对于其中的每个值,获取一个包含这么多s 的列表,并将其格式化为矩阵。
  • K,:将每个值放在K矩阵的每一行之前,并给出标签。

输出:

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

当我将独立宣言的文本作为单个字符串输入时(当然是通过剪切和粘贴),生成的输出为:

宣布独立


2

福斯201

这很有趣,但是我的Ruby提交更具竞争力。;-)

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

样品运行:

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

字长上限为99。


2

Ruby,79岁

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

示例运行:

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

请看我提交的Forth文章以大笑。


2

Ruby 1.8.7、74

与其他红宝石解决方案略有不同:

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

输出:

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

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

最初我没有看到此提交内容,对不起!+1
syb0rg 2014年

1

JavaScript(159133

绝对没有竞争力,但是到目前为止是唯一的JavaScript解决方案。感谢@manatwork提供有关使用的提示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++]||""))

输入值

Code Golf是为益智游戏爱好者和Code Golf编程的问答网站。它是由您构建和运行的,是Q&A站点的Stack Exchange网络的一部分。在您的帮助下,我们将共同努力建立一个编程难题及其解决方案库。

输出量

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

1
确实,这并不是JavaScript擅长的领域。但是,随着replace()代替split()+ forArray代替Object+单独的可变长度可以用几个字符被减少: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++]||""))。(甚至在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 2013年

@manatwork很好的虐待.length那里。
quietmint 2013年

1

纯扑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

样品:

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

使用一个叉子保存8个字符到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 \  \#

给出相同的结果:

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 )

渲染(在我的主机上:)

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

用法:

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

8th,162字节

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

用法

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

输出量

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

Ungolfed代码SED是堆栈效果图)

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.