ヒストグラム生成


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

1
1.これは、グラフィック出力とタグ付けされています。つまり、画面上での描画または画像ファイルの作成に関するものですが、例はascii-artです。どちらでもいいですか?(そうでなければ、plannabusは幸せではないかもしれません)。2.句読点を単語内のカウント可能な文字の形成として定義しますが、単語を区切る文字、入力で出現する文字と出現しない文字、および出現する可能性があるがアルファベットではない文字の処理方法は述べません。 、または単語の区切り。3.理にかなったサイズに収まるようにバーのスケールを変更することは許容、要求、または禁止されていますか?
ピーターテイラー

@PeterTaylorそれは本当に「芸術」ではないので、私はそれをascii-artにタグ付けしませんでした。Phannabusのソリューションは問題ありません。
syb0rg

@PeterTaylorあなたが説明したことに基づいていくつかのルールを追加しました。これまでのところ、ここでのすべてのソリューションは、すべてのルールをまだ順守しています。
syb0rg

回答:


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ます。ここでは、max(input)+0.5までブレークが0.5、1.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

enter image description here

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

enter image description here

編集:

可能な値ごとに軸ラベルが付いた71文字のバリエーション:

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

enter image description here


3
通常は冗長な言語がリードするのが大好きです!

ただし、これは仕様に準拠していません...
ドアノブ

@Doorknobはどの仕様に準拠していませんか?
plannapus

サンプルのテストケース。
ドアノブ

3
彼らは例、ない仕様...ある
plannapus

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
素敵な、あなたが使用する2番目の行(無アルゴリズムの変更)を再加工することによって4つの文字をオフに剃ることができますexecし、文字列連結:c=0;exec'c+=1;print"%3d|"%c+"#"*s.count(c);'*max(s)
ejrb

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

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

はい。ただし、1つの問題があることに気付きました。レゴストームトルーパーのソリューションとしての数値を正当化できないため、実際に回答を廃止することを考えています。
ロベルト

表示されたバーにラベルがある限り、答えは受け入れられます。
syb0rg

OK :)
ロベルト

これは、入力を引数からではなく入力から取得します。これは有効な@ 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
マナトワーク

職場でこのプログラムの例を見ることができますか?
syb0rg

@manatwork printfは私にはまったく発生しませんでしたが、何らかの理由で、配列で望んでいた効果が得られるとは思いませんでした。@ syb0rgが追加中
Dom Hastings

2
:いくつかのより多く、57バイトに、それを降りgolfed$d[y///c].='#'for@ARGV;printf"%2d|$d[$_]\n",$_ for+1..$#d
ゴス中国のperlの

1
最も単純なトリックを逃しました:\n文字を1つ余分に使用する代わりに、リテラルの改行を使用します。:私はこのような意味pastebin.com/496z2a0n
manatwork

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│##     │
└─┴───────┘

Tacit、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

1
@ syb0rg IMO質問はきちんと表現されており、例はそれ自体を物語っています。最後の1回にエラーがあるようですが... 8文字の単語を2つ(生成および生成)と9文字の単語を2つ(ヒストグラム、ヒストグラム)
Doorknob

涼しい。あなたは、変更される可能性がb ?(?#*b[1].size):''b&&?#*b[1].size
マナトワーク

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

@ syb0rg確かに、例を使って答えを更新しました。
ダンコドゥルビッチ

いいね!あなたに+1!
syb0rg

いいね あなたは、余分なスペースを削除し、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
  • ⊃⍴∘'▓'¨:その中の各値について、その数のリストを取得し、マトリックスとしてフォーマットします。
  • 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

ルビー、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|##

フォースの投稿を見てください。


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 14年

1

JavaScript(159 133)

確かに競争力はありませんが、これまでのところ唯一の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は、パズル愛好家やコードゴルファーをプログラミングするための質疑応答サイトです。これは、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++]||""))。(ハーモニーではさらに短く: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 .lengthそこの良い虐待。
quietmint

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

1つのフォークを使用して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

8番目、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|#

ゴルフされていないコード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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.