Tạo biểu đồ


12

Viết chương trình ngắn nhất tạo ra biểu đồ (biểu diễn đồ họa của phân phối dữ liệu).

Quy tắc:

  • Phải tạo một biểu đồ dựa trên độ dài ký tự của các từ (bao gồm dấu chấm câu) vào chương trình. (Nếu một từ dài 4 chữ cái, thanh đại diện cho số 4 tăng thêm 1)
  • Phải hiển thị nhãn thanh tương quan với độ dài ký tự mà thanh đại diện.
  • Tất cả các nhân vật phải được chấp nhận.
  • Nếu các thanh phải được thu nhỏ, cần phải có một số cách được hiển thị trong biểu đồ.

Ví dụ:

$ ./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
Vui lòng viết một đặc tả thay vì đưa ra một ví dụ duy nhất, chỉ nhờ vào một ví dụ duy nhất, không thể biểu thị phạm vi của các kiểu đầu ra chấp nhận được và không đảm bảo bao gồm tất cả các trường hợp góc. Thật tốt khi có một vài trường hợp thử nghiệm, nhưng điều quan trọng hơn nữa là có một thông số kỹ thuật tốt.
Peter Taylor

@PeterTaylor Thêm ví dụ.
syb0rg

1
1. Đây được gắn thẻ đầu ra đồ họa , có nghĩa là nó vẽ trên màn hình hoặc tạo tệp hình ảnh, nhưng ví dụ của bạn là nghệ thuật . Là chấp nhận được? (Nếu không thì plannabus có thể không hạnh phúc). 2. Bạn xác định dấu câu là hình thành các ký tự có thể đếm được trong một từ, nhưng bạn không nói rõ các ký tự tách các từ, ký tự nào có thể và không xảy ra trong đầu vào và cách xử lý các ký tự có thể xảy ra nhưng không phải là chữ cái, dấu câu hoặc phân cách từ. 3. Có thể chấp nhận, bắt buộc hoặc cấm bán lại các thanh để phù hợp với kích thước hợp lý không?
Peter Taylor

@PeterTaylor Tôi không gắn thẻ ascii-art, vì nó thực sự không phải là "nghệ thuật". Giải pháp của Phannabus là tốt.
syb0rg

@PeterTaylor Tôi đã thêm vào một số quy tắc dựa trên những gì bạn mô tả. Cho đến nay, tất cả các giải pháp ở đây tuân thủ tất cả các quy tắc vẫn còn.
syb0rg

Câu trả lời:


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

.

Một ví dụ dài hơn

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

Điều gì xảy ra nếu có những từ có nhiều hơn 9 chữ cái?

Nó hoạt động cho các từ có độ dài bất kỳ
tmartin

5

R, 55 47 ký tự

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

May mắn thay R đi kèm với một chức năng vẽ histbiểu đồ cho biểu đồ, ở đây được cung cấp với một breaksđối số trong đó các khoảng nghỉ là 0,5, 1,5, ... cho đến khi tối đa (đầu vào) +0,5. sapply(scan(,""),nchar)lấy một đầu vào (dưới dạng stdin), phân tách nó theo khoảng trắng và đếm số lượng ký tự của mỗi phần tử.

Ví dụ:

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

nhập mô tả hình ảnh ở đây

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

nhập mô tả hình ảnh ở đây

Biên tập:

Một biến thể ở 71 ký tự với nhãn trục ở mỗi giá trị có thể:

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

nhập mô tả hình ảnh ở đây


3
Tôi thích khi một ngôn ngữ dài dòng bình thường dẫn đầu!

Điều này không tuân thủ các đặc điểm kỹ thuật, tuy nhiên ...
Doorknob

@Doorknob thông số kỹ thuật nào không tuân thủ?
plannapus

Các ví dụ thử nghiệm.
Doorknob

3
Chúng là những ví dụ, không phải thông số kỹ thuật ...
plannapus

5

Python - 83 ký tự

Có vẻ như chúng ta có thể lấy đầu vào từ bất cứ đâu, vì vậy, điều này nhận đầu vào trong khi thực hiện, thay vì từ dòng lệnh và sử dụng đề xuất của Ejrb để rút ngắn nó xuống 8.

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

Con trăn - 91 ký tự

Điều này sẽ rơi qua với dấu ngoặc kép.

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

Đầu vào:

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

Đầu ra:

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

2
thật tuyệt, bạn có thể cạo 4 ký tự bằng cách làm lại dòng thứ hai (không thay đổi thuật toán) để sử dụng execvà nối chuỗi:c=0;exec'c+=1;print"%3d|"%c+"#"*s.count(c);'*max(s)
ejrb

4

Haskell - 126 ký tự

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

Cái này lấy đầu vào từ stdin, không phải dòng lệnh:

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

Co vẻ tôt vơi tôi! +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))

Đầu ra:
(dòng đầu tiên là chuỗi đầu vào)

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

Nó không chứng minh các con số là giải pháp Python của Lego Stormtroopr (cũng ngắn hơn giải pháp của tôi), nhưng đây là lần đầu tiên tôi tham gia một cuộc thi golf, vì vậy tôi cũng có thể để nó ở đây tôi đoán :)


Bạn có thể chỉnh sửa trong một ví dụ về biểu đồ được tạo bởi chương trình này không?
syb0rg

Có, nhưng tôi chỉ nhận thấy nó có một vấn đề: nó không biện minh cho các con số là giải pháp của Lego Stormtroopr, vì vậy tôi thực sự nghĩ về việc rút lại câu trả lời.
Roberto

Miễn là có nhãn cho các thanh đại diện, câu trả lời là chấp nhận được.
syb0rg

Ok, xong rồi! :)
Roberto

Điều này có đầu vào từ đầu vào, không phải từ các đối số. Đây có phải là hợp lệ @ syb0rg?

3

Perl, 56

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

Đã thêm @ manatwork's viết lại và đề xuất dòng chữ mới, cảm ơn bạn rất nhiều! Đã thêm các cập nhật của @ china_perl_goth.

Cách sử dụng: lưu dưới dạng hist.pl và chạy perl hist.pl This is a test

Ví dụ đầu ra:

$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
Tại sao không sử dụng printf? Bạn có thể tha cho một số ký tự về định dạng. Và một số chi tiết bằng cách thay đổi từ hàm băm sang mảng : $d[y///c]++for@ARGV;shift@d;printf"%2d|%s\n",++$i,"#"x$_ for@d.
manatwork 11/12/13

Tôi có thể xem một ví dụ về chương trình này tại nơi làm việc không?
syb0rg

@manatwork printfhoàn toàn không xảy ra với tôi và vì một số lý do tôi không nghĩ mình có thể đạt được hiệu quả như mong muốn với một mảng, thật tuyệt vời! @ syb0rg thêm ngay bây giờ
Dom Hastings

2
chơi gôn nhiều hơn, giảm xuống còn 57 byte:$d[y///c].='#'for@ARGV;printf"%2d|$d[$_]\n",$_ for+1..$#d
tiếng Trung Quốc goth

1
Chúng tôi đã bỏ lỡ một mẹo đơn giản nhất: sử dụng một dòng mới theo nghĩa đen thay vì \nđể thêm 1 ký tự. Ý tôi là như thế này: pastebin.com/496z2a0n
manatwork 13/12/13

3

J, 48 47 46 45 43 ký tự

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

Sử dụng:

   (;#&'#')/"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.>./)#@>@;:: Hãy thử trực tuyến!
Giô-na

2

Hồng ngọc, 98 85

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

Không chơi gôn nhiều. Sẽ chơi golf sau.

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

Hoạt động độc đáo (++ voteCount). Bất cứ điều gì tôi có thể làm để từ câu hỏi tốt hơn?
syb0rg

1
@ syb0rg IMO câu hỏi được diễn đạt tốt, các ví dụ nói cho chính họ. Mặc dù lần cuối cùng của bạn dường như có lỗi ... Tôi đếm 2 từ 8 chữ cái (tạo và tạo) và 2 từ 9 chữ cái (biểu đồ, biểu đồ)
Doorknob

Mát mẻ. Bạn có thể thay đổi b ?(?#*b[1].size):''với b&&?#*b[1].size.
manatwork 11/12/13

2

Powershell, 97 93

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

Thí dụ:

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

Tôi có thể xem một ví dụ về chương trình này đang chạy không?
syb0rg

@ syb0rg Chắc chắn, tôi đã cập nhật câu trả lời bằng một ví dụ.
Danko Durbić

Có vẻ tốt! +1 cho bạn!
syb0rg

Đẹp. Bạn có thể xóa thêm dung lượng và lưu 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←⍞

Có thể ngắn hơn nếu tôi có thể bỏ qua các dòng có giá trị bằng 0.

Giải trình:

  • ⎕ML←3: đặt mức di chuyển thành 3 (điều này làm cho (phân vùng) hữu ích hơn).
  • I⊂⍨' '≠I←⍞: đọc đầu vào, phân chia trên dấu cách
  • M←↑∘⍴¨: lấy kích thước của kích thước đầu tiên của mỗi mục (độ dài từ) và lưu trữ trong M
  • K←⍳⌈/M: lấy các số từ 1 đến giá trị cao nhất trong M, lưu trữ trongK
  • +⌿K∘.=M: cho mỗi giá trị trong M, xem nó được chứa bao nhiêu lần K.
  • ⊃⍴∘'▓'¨: với mỗi giá trị trong đó, hãy lấy một danh sách gồm nhiều s và định dạng nó dưới dạng ma trận.
  • K,: thêm từng giá trị vào Ktừng hàng trong ma trận, đưa ra các nhãn.

Đầu ra:

      ⎕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

Toán học 97

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

Khi tôi nhập văn bản của Tuyên ngôn Độc lập dưới dạng một chuỗi (thông qua cắt và dán), đầu ra được tạo là:

Tuyên ngôn độc lập


2

Năm 2018

Điều này thật thú vị nhưng bài nộp Ruby của tôi cạnh tranh hơn. ;-)

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

Chạy mẫu:

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

Độ dài từ tối đa là 99.


2

Ruby, 79

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

Chạy ví dụ:

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

Xin vui lòng xem đệ trình Forth của tôi cho một tiếng cười.


2

Hồng ngọc 1.8.7, 74

Một chút khác biệt so với các giải pháp ruby ​​khác:

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

đầu ra:

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

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

Tôi đã không nhìn thấy đệ trình này ban đầu, xin lỗi! +1
syb0rg

1

JavaScript ( 159 133)

Chắc chắn không cạnh tranh, nhưng cho đến nay là giải pháp JavaScript duy nhất. Cảm ơn @manatwork cho mẹo sử dụng 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++]||""))

Đầu vào

Code Golf là một trang web câu hỏi và trả lời cho những người đam mê lập trình câu đố và người chơi mã. Nó được xây dựng và điều hành bởi bạn như một phần của mạng Stack Exchange của các trang web Hỏi & Đáp. Với sự giúp đỡ của bạn, chúng tôi làm việc cùng nhau để xây dựng một thư viện các câu đố lập trình và giải pháp của họ.

Đầu ra

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

1
Thật vậy, đây không thực sự là một lĩnh vực mà JavaScript vượt trội. Nhưng với replace()thay vì split()+ forArraythay vì Object+ biến độ dài riêng biệt có thể được giảm với một vài ký tự : 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++]||"")). (Và thậm chí ngắn hơn trong 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 15/12/13

@manatwork Lạm dụng đẹp .lengthđấy.
quietmint

1

Bash tinh khiết 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

Mẫu vật:

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

Lưu 8 ký tự bằng cách sử dụng một ngã ba đế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 \  \#

Cho kết quả tương tự:

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 )

kết xuất (trên máy chủ của tôi :)

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

Sử dụng:

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

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

Sử dụng

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

Đầu ra

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

Mã không được mã hóa ( SED là Sơ đồ hiệu ứng ngăn xếp)

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.