Hiển thị số lần xuất hiện cho mỗi ký tự trong chuỗi đầu vào


21

Mã sẽ lấy một chuỗi làm đầu vào từ bàn phím:

The definition of insanity is quoting the same phrase again and again and not expect despair.

Đầu ra phải như thế này (không được sắp xếp theo bất kỳ thứ tự cụ thể nào):

  :  15
. :  1
T :  1
a :  10
c :  1
e :  8
d :  4
g :  3
f :  2
i :  10
h :  3
m :  1
o :  4
n :  10
q :  1
p :  3
s :  5
r :  2
u :  1
t :  6
y :  1
x :  1

Tất cả các ký tự ASCII đếm unicode không phải là một yêu cầu, dấu cách, dấu ngoặc kép, v.v. và đầu vào phải đến từ bàn phím / không phải hằng, thuộc tính, đầu ra nên được in bằng dòng mới sau mỗi ký tự như trong ví dụ trên, không nên trả về dưới dạng chuỗi hoặc đổ như hashmap / từ điển vv, do đó x : 1x: 1là ok, nhưng {'x':1,...x:1không.

Q: Chức năng hoặc chương trình hoàn chỉnh lấy stdin và viết stdout?
Trả lời: Mã cần phải là một chương trình lấy đầu vào bằng cách sử dụng tiêu chuẩn và hiển thị kết quả thông qua tiêu chuẩn.

Bảng điểm:

Tổng thể ngắn nhất : 5 byte

Tổng thể ngắn nhất : 7 byte


3
Tất cả các ký tự ascii là đầu vào? Hoặc chỉ có thể in? Hoặc lên đến unicode? Sẽ có dòng mới?
Justin

2
Tôi có thể tạo một chức năng, hoặc là toàn bộ chương trình cần thiết? Tôi có thể xuất tất cả các ký tự ascii và in 0dưới dạng số lần xuất hiện không?
Justin

16
Là định dạng đầu ra nghiêm ngặt, hoặc nó đủ để giữ ý nghĩa?
John Dvorak

Chỉnh sửa của bạn không giải quyết câu hỏi của tôi.
Justin

5
Bạn đã không nói nếu đầu ra cần phải được sắp xếp theo thứ tự abc. Bạn đã không nói nếu dấu phân cách cần phải " : "(lưu ý hai khoảng trắng sau dấu :) hoặc nếu các dấu tách khác (ngắn hơn) là tốt. Bạn đã không giải quyết vấn đề unicode / mã hóa.
CodeInChaos

Câu trả lời:


2

APL (Dyalog Unicode) , 5 byte SBCS

Toàn thân chương trình. Nhắc nhở một chuỗi từ STDIN và in bảng phân tách dòng mới sang STDOUT. Cột ngoài cùng bên trái là các ký tự đầu vào và các số được căn phải với số lớn nhất được phân tách khỏi ký tự của nó bằng một khoảng trắng.

,∘≢⌸⍞

Hãy thử trực tuyến!

 lời nhắc nhập văn bản từ STDIN

 bảng tạo ra một chìa khóa bao gồm
, các yếu tố độc đáo theo
 bởi
 các kiểm đếm của các chỉ số lần xuất hiện của nó (tức là bao nhiêu lần nó xảy ra)


Có vẻ như :không may là bắt buộc trong đầu ra (bạn không thể xóa câu trả lời này).
Erik the Outgolfer 29/03/18

@EriktheOutgolfer Làm thế nào để bạn suy luận điều đó? Rõ ràng OP thấy câu trả lời này chấp nhận được, phù hợp với một nhận xét cũ .
Adám

Một lý do khác cho thông số kỹ thuật nằm trong chính câu hỏi ...
Erik the Outgolfer 29/03/18

15

PHP - 68 (hoặc 39) byte

<?foreach(count_chars(fgets(STDIN),1)as$k=>$v)echo chr($k)." : $v
";

Đầu ra cho văn bản ví dụ:

  : 15
. : 1
T : 1
a : 10
c : 1
d : 4
e : 8
f : 2
g : 3
h : 3
i : 10
m : 1
n : 10
o : 4
p : 3
q : 1
r : 2
s : 5
t : 6
u : 1
x : 1
y : 1

Nếu đầu ra chính xác là không bắt buộc, điều này sẽ hoạt động với 39 byte :

<?print_r(count_chars(fgets(STDIN),1));

Đầu ra mẫu:

Array
(
    [32] => 15
    [46] => 1
    [84] => 1
    [97] => 10
    [99] => 1
    [100] => 4
    [101] => 8
    [102] => 2
    [103] => 3
    [104] => 3
    [105] => 10
    [109] => 1
    [110] => 10
    [111] => 4
    [112] => 3
    [113] => 1
    [114] => 2
    [115] => 5
    [116] => 6
    [117] => 1
    [120] => 1
    [121] => 1
)

trong đó mỗi chỉ số bằng số chỉ giá trị thứ tự của ký tự mà nó đại diện.

Tôi nghi ngờ rất mạnh mẽ rằng việc sử dụng một hàm dựng sẵn thực hiện chính xác những gì các trạng thái vấn đề sẽ sớm không được phép.


$argv[1]thay vì fgets(STDIN)tiết kiệm 4 byte.
Tít

14

k ( 8 7)

#:'=0:0

Thí dụ

k)#:'=:0:0
The definition of insanity is quoting the same phrase again and again and not expect despair.
T| 1
h| 3
e| 8
 | 15
d| 4
f| 2
i| 10
n| 10
t| 6
o| 4
s| 5
a| 10
y| 1
q| 1
u| 1
g| 3
m| 1
p| 3
r| 2
x| 1
c| 1
.| 1

chỉnh sửa: Xuống bảy, H / T Aaron Davies

Giải trình

Lấy một chuỗi từ bàn phím:

k)0:0
text
"text"

Nhóm các phần tử riêng biệt và trả về một bản đồ chứa khóa dưới dạng các ký tự và giá trị riêng biệt là các chỉ số nơi các phần tử riêng biệt xuất hiện.

k)=0:0
text
t| 0 3
e| ,1
x| ,2

Bây giờ đếm giá trị của từng mục trong bản đồ.

k)#:'=0:0
text
t| 2
e| 1
x| 1

Khá khó tin.
Pureferret

cái :trong =:là thừa; k)#:'=0:0hoạt động tốt (7 ký tự). (phần thưởng cho việc biết về 0:0, tôi không có ý tưởng!)
Aaron Davies

Một lời giải thích chi tiết sẽ rất tuyệt :)
Timwi

qbản dịch dễ hiểu hơn -count each group read0 0
hoài nghi

13

Các tiện ích lõi GNU - 29 22 20 ký tự (53 có định dạng)

Cải thiện của Wumpus (20 ký tự):

fold -1|sort|uniq -c

Cải tiến của Firefly (22 ký tự):

grep -o .|sort|uniq -c

bản gốc của joeytwiddle (29 ký tự):

sed 's+.+\0\n+g'|sort|uniq -c

Ban đầu tôi sedchỉ đơn giản là thêm một dòng mới sau mỗi ký tự. Firefly đã cải thiện điều đó với grep -o ., vì -ohiển thị mọi mẫu phù hợp trên dòng riêng của nó. Wumpus đã chỉ ra một cải tiến hơn nữa bằng cách sử dụng fold -1thay thế. Công việc tốt đẹp!

uniq thực hiện công việc thực tế, mặc dù nó chỉ áp dụng cho các danh sách được sắp xếp.

Lưu ý rằng định dạng đầu ra không khớp chính xác với ví dụ trong câu hỏi. Điều đó đòi hỏi một lần chạy cuối cùngsed để trao đổi các đối số. (Chờ câu trả lời cho câu hỏi của Jan Dvorak để xem điều này có bắt buộc không ...)

Định dạng lại với sed là "chỉ" 33 ký tự khác! ( Tổng cộng 53 )

|sed 's/ *\(.*\) \(.\)/\2 :  \1/'

Awk gần như có thể thực hiện công việc trong khi chỉ thêm 25 ký tự, nhưng nó ẩn không gian đầu tiên. Ngớ ngẩn quá!

|awk '{print $2" :  "$1}'

Tôi tự hỏi nếu cải tiến có thể được thực hiện trong giai đoạn định dạng lại ...


2
Đối với sed, bạn có thể sử dụng &cho "toàn bộ trận đấu" thay vì \0, tuy nhiên grep -o .hơi ngắn hơn. Điều đáng nói là đầu ra của uniq -chơi khác so với đầu ra trong câu hỏi.
FireFly

Cảm ơn bạn Cập nhật. Tôi không nên quên grep -o; nó là một trong những hữu ích
joeytwiddle

2
fold -1thực hiện tương tự nhưgrep -o .

Tuyệt vời :) Học các thủ thuật mới!
joeytwiddle

1
ptx -S.thực hiện cùng một mẹo .
Pureferret

7

Ruby 1.9.3: 53 ký tự

(Dựa trên nhận xét của @ shiva và @ daneiro.)

gets.split("").uniq.map{|x|puts x+" : #{$_.count x}"}

Chạy mẫu:

bash-4.1$ ruby -e 'a=gets;a.split("").uniq.map{|x|puts"#{x} : #{a.count x}"}' <<< 'Hello world'
H : 1
e : 1
l : 3
o : 2
  : 1
w : 1
r : 1
d : 1

 : 1

Ruby: 44 ký tự

Không tôn trọng định dạng đầu ra:

s=Hash.new 0;gets.chars{|c|s[c]+=1};pp s

Chạy mẫu:

bash-4.1$ ruby -rpp -e 's=Hash.new 0;gets.chars{|c|s[c]+=1};pp s' <<< 'Hello, world!'
{"H"=>1,
 "e"=>1,
 "l"=>3,
 "o"=>2,
 ","=>1,
 " "=>1,
 "w"=>1,
 "r"=>1,
 "d"=>1,
 "!"=>1,
 "\n"=>1}

1
63 ký tựa=gets.strip;a.split('').uniq.each{|x|puts"#{x} : #{a.count(x)}"}
Siva

Tại sao strip()? Câu hỏi cho biết, tất cả các nhân vật đều đếm được
manatwork

Chà, sẽ trở lại \nngay cả khi bạn không có ý định
Siva

Không. Chỉ trả lại \nnếu nó đã thực sự được thông qua. Vượt qua nó là một tác dụng phụ của việc sử dụng chuỗi ở đây. pastebin.com / gCrgk9m1
manatwork

1
Sử dụng $_và bỏ mương avẫn là âm thanh mặc dù. Và c+"...thay vì"#{c}...
daniero

7

Python 3: 76 ký tự

76

import collections as c
for x,y in c.Counter(input()).items():print(x,':',y)

44

(in cùng một ký tự nhiều lần, xem câu trả lời của Wasi cho phiên bản hợp lệ)

a=input()
for x in a:print(x,':',a.count(x))

Phiên bản 45 char in các ký tự nhiều lần.
ugoren

Phải ... Cảm ơn vì đã chú ý!
evuez

@evuez Tôi vừa sửa phiên bản 45 char của bạn. Nhưng, bạn đã xóa nó vì vậy tôi đã gửi nó một lần nữa. Hãy nhìn xem
Wasi

6

Perl 6: 21 ký tự

.say for get.comb.Bag
(REPL)
> .say cho get.comb.Bag
Định nghĩa điên rồ là trích dẫn cùng một cụm từ nhiều lần và không mong đợi sự tuyệt vọng.
"T" => 1
"h" => 3
"e" => 8
"" => 15
"d" => 4
"f" => 2
"Tôi" => 10
"n" => 10
"t" => 6
"o" => 4
"s" => 5
"a" => 10
"y" => 1
"q" => 1
"u" => 1
"g" => 3
"m" => 1
"p" => 3
"r" => 2
"x" => 1
"c" => 1
"." => 1

5

APL (15)

M,⍪+⌿Z∘.=M←∪Z←⍞

Nếu bạn thực sự cần :, đó là 19 (nhưng có những người khác không bao gồm nó):

M,':',⍪+⌿Z∘.=M←∪Z←⍞

Đầu ra:

      M,⍪+⌿Z∘.=M←∪Z←⍞
The definition of insanity is quoting the same phrase again and again and not expect despair. 
T  1
h  3
e  8
  16
d  4
f  2
i 10
n 10
t  6
o  4
s  5
a 10
y  1
q  1
u  1
g  3
m  1
p  3
r  2
x  1
c  1
.  1

Câu hỏi bán nghiêm trọng - những gì nó giống như duy trì mã APL cũ?
Michael Stern

@MichaelStern: Không có ý tưởng, tôi chưa bao giờ phải làm điều đó. Nhưng tôi đoán nó không tệ hơn việc duy trì mã kế thừa khác. APL thực sự khá dễ đọc khi bạn đã quen với nó.
bến tàu

5

R, 30 ký tự

table(strsplit(readline(),""))

Ví dụ sử dụng:

> table(strsplit(readline(),""))
The definition of insanity is quoting the same phrase again and again and not expect despair.

    .  a  c  d  e  f  g  h  i  m  n  o  p  q  r  s  t  T  u  x  y 
15  1 10  1  4  8  2  3  3 10  1 10  4  3  1  2  5  6  1  1  1  1 

Ý tưởng tốt! Nhưng câu hỏi cho biết mã phải in kết quả. Mã của bạn chỉ trả về kết quả. Tôi cho rằng bạn cần cat.
Sven Hohenstein

@SvenHohenstein cũng không được chỉ định khi tôi trả lời (tôi đã trả lời trước khi sửa đổi 4 câu hỏi) ... nhưng thực tế là catsẽ chỉ trả về các giá trị không phải là tên giá trị (tức là các ký tự). Vì vậy, nó sẽ cần một giải pháp phức tạp hơn.
plannapus

5

Perl 5, 54 ký tự

map{$h{$_}++}split//,<>;print"$_ : $h{$_}\n"for keys%h

1
Giải pháp rất hay, dễ đọc. Điều đó sẽ cần phải được sort keys%h, mặc dù.
primo

1
Này @protist, có vẻ tốt! Tôi đồng ý với @primo! Tuy nhiên, bạn có thể lưu hai ký tự bằng cách sử dụng $_=<>;s/./$h{$_}++/eg;hoặc map{$h{$_}++}<>=~/./g;thay vìmap{$h{$_}++}split//,<>;
Dom Hastings

1
@DomHastings hoặc $h{$_}++for<>=~/./g, mà tôi nghĩ có thể là tối ưu. Dòng chữ mới thay vì \nlà tốt.
primo

Ah tốt đẹp, thậm chí tốt hơn! Có, tôi đã quên đề cập đến dòng mới theo nghĩa đen, đó trở thành -1 byte yêu thích mới của tôi!
Dom Hastings

5

JavaScript

  1. 66 53 byte:

    prompt(a={}).replace(/./g,function(c){a[c]=-~a[c]}),a
    
  2. 69 56 byte:

    b=prompt(a={});for(i=b.length;i--;){a[b[i]]=-~a[b[i]]};a
    
  3. 78 65 byte:

    prompt().split('').reduce(function(a,b){return a[b]=-~a[b],a},{})
    

NB: Trong tất cả các trường hợp, số byte bị xóa tham chiếu đến console.log()cuộc gọi thêm , điều này là vô nghĩa nếu chạy trong bàn điều khiển. Cảm ơn rất nhiều đến @imma vì đã bắt được -~a[b]prompt(a={}). Điều này chắc chắn tiết kiệm thêm một số byte.


1
ánh xạ thay vì vòng lặp cũng giúp một chút (a [b [i]] || 0) +1 có thể được giảm xuống - ~ a [b [i]] & console.log có thể có thể đi, chỉ cần trả về giá trị cuối cùng, đưa ra dấu nhắc (a = {}). split (""). map (function (c) {a [c] = - ~ a [c]}); a
imma

1
bạn có thể thay đổi forthành for in- kiểm tra trong tab trống tạo ra kết quả tương tự. Ngoài ra, cuối cùng ;là không cần thiết, như sau:b=prompt(a={});for(i in b){a[b[i]]=-~a[b[i]]}a
eithed

1
hay :-) dán b = ... vào for & swop cho {} 'cho a; cho 2 byte khác tắt: for (i in b = prompt (a = {})) a [b [i]] = - ~ a [b [i]]; a
imma

mặc dù họ có thể muốn đầu ra văn bản chính xác: - / sẽ đặt nó / tôi sao lưu bằng 36 (đến 79) byte: for (i in b = prompt (a = {})) a [b [i]] = - ~ a [b [i]]; for (n in a) console.log (n + ":" + a [n])
imma

1
@VisioN chỉ khi các nguyên thủy bị quá tải - for inthực sự cung cấp cho bạn các chức năng trong SO, nhưng không phải trong tab trống;)
đưa ra

5

Python 2, chính xác (58)

s=raw_input()
for l in set(s):print l+" : "+str(s.count(l))

Đầu ra:

python count.py
The definition of insanity is quoting the same phrase again and again and not expect despair.
  : 15
. : 1
T : 1
a : 10
c : 1
e : 8
d : 4
g : 3
f : 2
i : 10
h : 3
m : 1
o : 4
n : 10
q : 1
p : 3
s : 5
r : 2
u : 1
t : 6
y : 1
x : 1

Python 2, kiểu cheetah (41)

s=input()
print {l:s.count(l) for l in s}

Đầu ra:

python count.py
"The definition of insanity is quoting the same phrase again and again and not expect despair."
{' ': 15, '.': 1, 'T': 1, 'a': 10, 'c': 1, 'e': 8, 'd': 4, 'g': 3, 'f': 2, 'i': 10, 'h': 3, 'm': 1, 'o': 4, 'n': 10, 'q': 1, 'p': 3, 's': 5, 'r': 2, 'u': 1, 't': 6, 'y': 1, 'x': 1}

Quên xóa dấu ngoặc sau khi in ở cái thứ hai, điều đó làm cho nó 41
ToonAlfrink

Bạn có thể giảm xuống còn 52 ký tự với phiên bản đầu tiên của bạn : for l in set(s):print l,":",s.count(l). Đối với cái thứ hai, loại bỏ các khoảng trống không cần thiết làm cho bạn giành được 2 ký tự:print{l:s.count(l)for l in s}
evuez

5

Toán học, 61 byte

Map[{#[[1]], Length@#} &, Gather@Characters[Input[]]] // TableForm

Sau đó nó bật lên hộp thoại này,

đầu vào

và đối với câu mẫu, tạo ra như đầu ra

đầu ra


4

trăn 3, 49

Ăn cắp ý tưởng từ evuez

t=input()
for i in set(t):print(i,':',t.count(i))

đầu vào:

The definition of insanity is quoting the same phrase again and again and not expect despair.

đầu ra:

  :  15
. :  1
T :  1
a :  10
c :  1
e :  8
d :  4
g :  3
f :  2
i :  10
h :  3
m :  1
o :  4
n :  10
q :  1
p :  3
s :  5
r :  2
u :  1
t :  6
y :  1
x :  1

cải thiện tốt đẹp! Tại sao bạn không xóa sắp xếp ()?
evuez

1
đúng! dù sao đi nữa, nếu bạn không sử dụng cách hiểu danh sách, thì đó là 1 char ít hơn:for i in sorted(set(t)):print(i,':',t.count(i))
evuez

@evuez Cảm ơn, tôi đã phải thêm nó dưới dạng một nhận xét trong mã của bạn. Nếu bạn thích, bạn có thể thêm nó một lần nữa vào giải pháp của mình (tôi sẽ vui vẻ xóa cái này): D
Wasi

Sẽ không công bằng, tôi đã không nghĩ về set()! ;)
evuez

4

JavaScript (69 68 ký tự):

Dự kiến ssẽ giữ chuỗi.

_={};for(x in s)_[a=s[x]]=-~_[a];for(x in _)console.log(x+': '+_[x])

Điều này tuân theo các quy tắc mới một cách hoàn hảo.

Lưu ý: Điều này giả định một môi trường sạch, không có thuộc tính tùy chỉnh trên bất kỳ nguyên mẫu đối tượng tiêu chuẩn nào.

Chỉnh sửa: 1 ký tự ít hơn!

Bảng điều khiển đầu ra:

T: 1
h: 3
e: 8
 : 15
d: 4
f: 2
i: 10
n: 10
t: 6
o: 4
s: 5
a: 10
y: 1
q: 1
u: 1
g: 3
m: 1
p: 3
r: 2
x: 1
c: 1
.: 1

Câu trả lời cũ (44 ký tự):

r={};[].map.call(s,function(e){r[e]=-~r[e]})

Điều này là hợp lệ trước khi các quy tắc thay đổi.

r chứa đầu ra.


3

Haskell, 93

import Data.List
main=getLine>>=mapM(\s->putStrLn$[head s]++" : "++show(length s)).group.sort


3

C # (178 220 ký tự)

Dựa trên nhận xét của @ Spongeman, tôi đã thay đổi một chút:

using C=System.Console;using System.Linq;class P{static void Main()
{C.WriteLine(string.Join("\n",C.ReadLine().GroupBy(x=>x)
.OrderBy(x=>x.Key).Select(g=>g.Key+":"+g.Count())));}}

Line breaks added for readability, my first feeble attempt at code golf! :)

class P {static void Main(){var d=new Dictionary<char,int>();
Console.ReadLine().ToList().ForEach(x=>{ if(d.ContainsKey(x))
{d[x]++;}else{d.Add(x,1);}});Console.WriteLine(string
.Join("\n",d.Keys.Select(x=>x+":" +d[x])));}}

không biên dịch. cái này không: 178 ký tự. sử dụng System.Linq; sử dụng C = System.Console; class F {static void Main () {C.WriteLine (string.Join ("\ n", C.ReadLine (). GroupBy (c => c) .Select ( g => g.Key + ":" + g.Count ()). OrderBy (s => s)));}}
Spongman

168: sử dụng C = System.Console; sử dụng System.Linq; class F {static void Main () {foreach (var g in C.ReadLine (). GroupBy (c => c) .OrderBy (g => g.Key )) C.WriteLine (g.Key + ":" + g.Count ());}}
Spongman

việc sắp xếp rõ ràng là không cần thiết, 150: sử dụng C = System.Console; sử dụng System.Linq; class F {static void Main () {foreach (var g in C.ReadLine (). GroupBy (c => c)) C.WriteLine (g.Key + ":" + g.Count ());}}
Spongman

Ồ Nhanh hay trùng? Bạn trả lời chỉ một giây sau khi tôi cập nhật câu trả lời của mình: D Chỉ cần lưu ý rằng việc sắp xếp không được đề cập rõ ràng!
gideon

3
148: namespace System{using Linq;class F{static void Main(){foreach(var g in Console.ReadLine().GroupBy(c=>c))Console.WriteLine(g.Key+" : "+g.Count());}}
Timwi

3

Sclipting , 19 ký tự

梴要⓶銻꾠⓷❸虛變梴❶⓺減負겠⓸⓸終丟

Đầu ra

T:1
h:3
e:8
 :15
d:4
f:2
i:10
n:10
t:6
o:4
s:5
a:10
y:1
q:1
u:1
g:3
m:1
p:3
r:2
x:1
c:1
.:1

Nếu bạn muốn không gian xung quanh :, thay đổi để 긃똠, làm cho nó 20 ký tự.

Giải trình

Get length of input string.
梴
Stack is now [ input, length ]
While {
要
    Get first character of string and push ":"
    ⓶銻꾠
    Stack is now [ length, input, firstchar, ":" ]
    Replace all occurrences of that character with empty string
    ⓷❸虛變
    Stack is now [ length, firstchar, ":", reducedinput ]
    Get the length of that, calculate difference to previous length, push "\n"
    梴❶⓺減負겠
    Stack is now [ firstchar, ":", reducedinput, newlength, diff, "\n" ]
    Move the input string and length back up, leaving output below it
    ⓸⓸
    Stack is now [ firstchar, ":", diff, "\n", reducedinput, newlength ]
                   `------------------------'                `-------'
                   Every iteration of the               The length provides
                   While loop generates                 the While loop's
                   a bit like this                      terminating condition
} End While
終
Discard the length which is now 0
丟

3

F # ( 66 59 49, 72 với định dạng theo quy định)

let f s=s|>Seq.countBy(id)|>Seq.iter(printfn"%A")

Đầu ra:

> f The definition of insanity is quoting the same phrase again and again and not expect despair.
(' ', 15)
('.', 1)
('T', 1)
('a', 10)
('c', 1)
('d', 4)
('e', 8)
('f', 2)
('g', 3)
('h', 3)
('i', 10)
('m', 1)
('n', 10)
('o', 4)
('p', 3)
('q', 1)
('r', 2)
('s', 5)
('t', 6)
('u', 1)
('x', 1)
('y', 1)

Với định dạng quy định, nó trở thành:

let f s=s|>Seq.countBy(id)|>Seq.iter(fun(a,b)->printfn"\"%c\" :  %d"a b)

Bạn có thể loại bỏ một ký tự bằng cách chuyển khỏi cú pháp đường ống cho một vài trong số các lệnh gọi hàm:let f s=Seq.countBy id (Seq.sort s)|>Seq.iter(printfn"%A")
goric

Trong thực tế, tại sao thậm chí sắp xếp ở nơi đầu tiên? let f s=Seq.countBy id s|>Seq.iter(printfn"%A")
goric

3

Toán học, 34 29 byte

Không chắc tại sao câu trả lời Mathicala khác lại phức tạp đến thế ...;)

Grid@Tally@Characters@Input[]

3

Bash ( 20 15 ký tự)

 ptx -S.|uniq -c
 10                                        a
  1                                        c
  4                                        d
  8                                        e
  2                                        f
  3                                        g
  3                                        h
 10                                        i
  1                                        m
 10                                        n
  4                                        o
  3                                        p
  1                                        q
  2                                        r
  5                                        s
  6                                        t
  1                                        T
  1                                        u
  1                                        x
  1                                        y

Mã hóa ASCII hiện được hỗ trợ

Bash (23 ký tự):

xxd -p -c1|sort|uniq -c

  1 0a
 15 20
  1 2e
  1 54
 10 61
  1 63
  4 64
  8 65
  2 66
  3 67
  3 68
 10 69
  1 6d
 10 6e
  4 6f
  3 70
  1 71
  2 72
  5 73
  6 74
  1 75
  1 78
  1 79

Định dạng ASCII không được hỗ trợ


Chỉ tò mò thôi, bạn có thực sự cần | sort | Ở đây, ptx AFAIK sẽ tạo ra một danh sách các ký tự được sắp xếp mà bạn có thể cung cấp trực tiếp cho "uniq -c"
zeppelin

@zeppelin một chút googling thú nhận những gì bạn đã nói
Pureferret

3

Java 8, 273 253 249 246 239 200 byte

interface I{static void main(String[]a){int m[]=new int[999],i=0;for(int c:new java.util.Scanner(System.in).nextLine().getBytes())m[c]++;for(;++i<999;)if(m[i]>0)System.out.printf("%c: %d%n",i,m[i]);}}

-24 byte nhờ @Poke .
-7 byte nhờ @ OlivierGrégoire .

Giải trình:

Hãy thử nó ở đây.

interface I{                        // Class
  static void main(String[]a){      //  Mandatory main-method
    int m[]=new int[999],           //  Integer-array to count the occurrences
        i=0;                        //  Index-integer, starting at 0
    for(int c:new java.util.Scanner(System.in).nextLine().getBytes())
                                    //   Loop over the input as bytes:
      m[c]++;                       //    Increase the occurrence-counter of the char by 1
    for(;++i<999;)                  //   Loop over the array:
      if(m[i]>0)                    //    If the current character occurred at least once:
        System.out.print("%c: %d%n",//     Print with proper formatting:
         i,                         //      The character
         m[i]);}}                   //      and the occurrence-count

249 byteimport java.util.*;class I{public static void main(String[]a){Map m=new HashMap();for(char c:new Scanner(System.in).nextLine().toCharArray()){m.put(c,m.get(c)!=null?(int)m.get(c)+1:1);}for(Object e:m.keySet()){System.out.println(e+": "+m.get(e));}}}
Chọc

2
m.compute(c,(k,v)->v!=null?(int)v+1:1);thay vì m.put(c,m.get(c‌​)!=null?(int)m.get(c‌​)+1:1);để tiết kiệm 3 byte.
Olivier Grégoire

2

Powershell, 63

$a=@{};[char[]](read-host)|%{$a[$_]++};$a.Keys|%{"$_ :"+$a[$_]}

2
Mỗi khóa trong hàm băm có thể được truy cập như một thuộc tính trên hàm băm đó, vì vậy bạn có thể tắt hai ký tự bằng cách thay thế từng trường hợp $a[$_]bằng $a.$_. Xemhelp about_hash_tables
goric

2

Tập lệnh lệnh Windows - 72 byte

set/p.=
:a
set/a\%.:~,1%=\%.:~,1%+1
set.=%.:~1%
%.%goto:b
goto:a
:b
set\

Đầu ra:

\=15 (space)
\.=1
\a=10
\c=1
\d=4
\e=8
\f=2
\g=3
\h=3
\i=10
\m=1
\n=10
\o=4
\p=3
\q=1
\r=2
\s=5
\T=7
\u=1
\x=1
\y=1

Tốt đẹp! Mặc dù có trường hợp gấp, nhưng thật tuyệt vời khi thấy sự thông minh thực sự trong lập trình tệp hàng loạt.
Brian Minton

2

J, 23 ký tự

(~.;"0+/@|:@=)/:~1!:1]1

Định dạng đầu ra hơi khác nhau (dòng 2 là stdin):

   (~.;"0+/@|:@=)/:~1!:1]1
Mississippi
┌─┬─┐
│M│1│
├─┼─┤
│i│4│
├─┼─┤
│p│2│
├─┼─┤
│s│4│
└─┴─┘

2

J, 22 ký tự

(~.;"0+/@(=/~.))1!:1]1

Thí dụ:

   (~.;"0+/@(=/~.))1!:1]1
The definition of insanity is quoting the same phrase again and again and not expect despair.
+-+--+
|T|1 |
+-+--+
|h|3 |
+-+--+
|e|8 |
+-+--+
| |15|
+-+--+
|d|4 |
+-+--+
|f|2 |
+-+--+
|i|10|
+-+--+
|n|10|
+-+--+
|t|6 |
+-+--+
|o|4 |
+-+--+
|s|5 |
+-+--+
|a|10|
+-+--+
|y|1 |
+-+--+
|q|1 |
+-+--+
|u|1 |
+-+--+
|g|3 |
+-+--+
|m|1 |
+-+--+
|p|3 |
+-+--+
|r|2 |
+-+--+
|x|1 |
+-+--+
|c|1 |
+-+--+
|.|1 |
+-+--+

2

C #

string str = Console.ReadLine(); // Get Input From User Here
char chr;
for (int i = 0; i < 256; i++)
{
    chr = (char)i; // Use The Integer Index As ASCII Char Value --> Convert To Char
    if (str.IndexOf(chr) != -1) // If The Current Char Exists In The Input String
    {
        Console.WriteLine(chr + " : " + str.Count(x => x == chr)); // Count And Display
    }
}
Console.ReadLine(); // Hold The Program Open.

Trong trường hợp của chúng tôi, nếu đầu vào sẽ là " Định nghĩa điên rồ là trích dẫn cùng một cụm từ nhiều lần và không mong đợi sự tuyệt vọng. "

Đầu ra sẽ là:

  : 15
. : 1
T : 1
a : 10
c : 1
d : 4
e : 8
f : 2
g : 3
h : 3
i : 10
m : 1
n : 10
o : 4
p : 3
q : 1
r : 2
s : 5
t : 6
u : 1
x : 1
y : 1

1
Câu hỏi yêu cầu đầu vào từ bàn phím, vì vậy dòng đầu tiên phải là string str = Console.ReadLine();. Nhưng đây là mã golf nên nó thực sự phải như vậy var str=Console.ReadLine();. Các ý kiến ​​khác tôi muốn đưa ra phải được giữ lại cho đến khi OP cải thiện câu hỏi.
Peter Taylor

Bạn nói đúng, tôi đã chỉnh sửa câu trả lời của mình.
Manila

2

C #: 129

Đây là câu trả lời của người Manila nhưng ngắn hơn:

var s=Console.ReadLine();for(int i=0;i<256;i++){var ch=(char)i;Console.Write(s.Contains(ch)?ch+":"+s.Count(c=>c==ch)+"\r\n":"");}

Cái này của tôi:

C #: 103

foreach(var g in Console.ReadLine().OrderBy(o=>o).GroupBy(c=>c))Console.WriteLine(g.Key+":"+g.Count());

Không biên dịch, cần thêm khoảng 50 ký tự cho các định nghĩa sử dụng / không gian tên / lớp / phương thức.
Pierre-Luc Pineault

Ồ, không biết đó là bắt buộc, tôi xin lỗi.
Abbas

2

Python 2 (90 ký tự)

import collections as c;print"\n".join("%s %s"%i for i in c.Counter(raw_input()).items())

Đầu ra khi chạy trên nguồn riêng của nó:

  8
" 4
% 3
) 4
( 4
. 3
; 1
C 1
\ 1
_ 1
a 2
c 4
e 3
f 1
i 9
j 1
m 2
l 2
o 6
n 7
p 3
s 5
r 5
u 2
t 6
w 1
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.