แสดงจำนวนการเกิดขึ้นสำหรับทุกอักขระในสตริงอินพุต


21

รหัสควรใช้สายอักขระเป็นอินพุตจากแป้นพิมพ์:

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

อักขระ ASCII ทั้งหมดที่นับเป็นยูนิโค้ดไม่ใช่ความต้องการช่องว่างเครื่องหมายคำพูด ฯลฯ และอินพุตควรมาจากคีย์บอร์ด / ไม่ใช่ค่าคงที่แอ็ตทริบิวต์เอาต์พุตควรพิมพ์ด้วยบรรทัดใหม่หลังจากอักขระแต่ละตัวในตัวอย่างข้างต้นไม่ควรส่งคืนเป็นสตริง หรือทิ้งเป็น hashmap / dictionary เป็นต้นดังนั้นx : 1และx: 1ก็โอเค แต่ {'x':1,...และx:1ไม่ใช่

ถาม: ฟังก์ชั่นหรือโปรแกรมที่สมบูรณ์โดยใช้ stdin และเขียน stdout?
ตอบ: รหัสจะต้องเป็นโปรแกรมที่รับอินพุตโดยใช้มาตรฐานในและแสดงผลลัพธ์ผ่านทางมาตรฐาน

สกอร์:

โดยรวมที่สั้นที่สุด : 5 ไบต์

โดยรวมที่สั้นที่สุด : 7 ไบต์


3
อักขระ ASCII ทั้งหมดเป็นอินพุตหรือไม่ หรือพิมพ์ได้? หรือถึง Unicode? จะมีการขึ้นบรรทัดใหม่หรือไม่
Justin

2
ฉันสามารถสร้างฟังก์ชั่นหรือจำเป็นต้องใช้โปรแกรมทั้งหมดหรือไม่? ฉันสามารถส่งออกอักขระ ASCII ทั้งหมดและพิมพ์0ตามจำนวนครั้งที่เกิดขึ้นได้หรือไม่
Justin

16
รูปแบบเอาต์พุตเข้มงวดหรือเพียงพอที่จะรักษาความหมายไว้หรือไม่
John Dvorak

การแก้ไขของคุณไม่ได้ตอบคำถามของฉัน
Justin

5
คุณไม่ได้พูดว่าจะต้องเรียงลำดับผลลัพธ์ตามตัวอักษรหรือไม่ คุณไม่ได้บอกว่าถ้าตัวคั่นต้องการ" : "(สังเกตช่องว่างสองช่องหลัง:) หรือถ้าตัวคั่นอื่น (สั้นลง) นั้นใช้ได้ คุณไม่ได้แก้ไขปัญหาเรื่อง Unicode / การเข้ารหัส
CodesInChaos

คำตอบ:


2

APL (Dyalog Unicode) , 5 ไบต์SBCS

โปรแกรมร่างกายเต็ม พร้อมต์สำหรับสตริงจาก STDIN และพิมพ์ตารางที่คั่นด้วยบรรทัดใหม่ให้เป็น STDOUT คอลัมน์ซ้ายสุดคืออักขระอินพุตและการนับจะถูกจัดชิดขวาโดยตัวเลขที่ใหญ่ที่สุดคั่นด้วยอักขระโดยเว้นวรรคหนึ่งช่อง

,∘≢⌸⍞

ลองออนไลน์!

 พรอมต์สำหรับการป้อนข้อความจาก STDIN

 สร้างตารางของปุ่มที่ประกอบด้วย
, องค์ประกอบที่ไม่ซ้ำกันตาม
 ด้วย
 การนับของดัชนีการเกิดขึ้น (เช่นกี่ครั้งที่มันเกิดขึ้น)


ดูเหมือนว่า:จำเป็นต้องมีโชคไม่ดีในผลลัพธ์ (คุณไม่สามารถลบคำตอบนี้ได้)
Erik the Outgolfer

@EriktheOutgolfer คุณสรุปได้อย่างไร? เห็นได้ชัดว่า OP พบคำตอบที่ได้รับการยอมรับให้สอดคล้องกับความคิดเห็นเก่า
อดัม

อีกเหตุผลหนึ่งที่ข้อมูลจำเพาะอยู่ในคำถามนั้น ...
Erik the Outgolfer

15

PHP - 68 (หรือ 39) ไบต์

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

เอาต์พุตสำหรับข้อความตัวอย่าง:

  : 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

หากไม่ต้องการเอาต์พุตที่แน่นอนจะสามารถทำงานได้39 ไบต์ :

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

ตัวอย่างผลลัพธ์:

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
)

โดยที่แต่ละตัวเลขดัชนีหมายถึงค่าลำดับของตัวละครมันหมายถึง

ฉันสงสัยอย่างมากว่าการใช้ฟังก์ชั่นที่สร้างขึ้นซึ่งทำสิ่งที่ปัญหาจะไม่ได้รับอนุญาตในไม่ช้า


$argv[1]แทนการfgets(STDIN)บันทึก 4 ไบต์
ติตัส

14

k ( 8 7)

#:'=0:0

ตัวอย่าง

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

แก้ไข: ลงไปที่เจ็ด, H / T Aaron Davies

คำอธิบาย

ใช้สตริงจากคีย์บอร์ด:

k)0:0
text
"text"

จัดกลุ่มองค์ประกอบที่แตกต่างและส่งคืนแผนที่ที่มีคีย์เป็นอักขระและค่าที่แตกต่างกันเป็นดัชนีที่มีองค์ประกอบที่แตกต่างกัน

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

ตอนนี้นับค่าของแต่ละรายการในแผนที่

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

ค่อนข้างเหลือเชื่อ
Pureferret

:ใน=:เป็นฟุ่มเฟือย; k)#:'=0:0ทำงานได้ดี (7 ตัวอักษร) (โบนัสสำหรับการรู้เกี่ยวกับ0:0ฉันไม่มีความคิด!)
Aaron Davies

คำอธิบายรายละเอียดจะเย็นจริงๆ :)
Timwi

qการแปลนั้นง่ายต่อการเข้าใจ -count each group read0 0
skeevey

13

อุปกรณ์หลักของ GNU - 29 22 20 ตัวอักษร (53 พร้อมการจัดรูปแบบ)

การปรับปรุงของ Wumpus (20 ตัวอักษร):

fold -1|sort|uniq -c

การปรับปรุงของ Firefly (22 ตัวอักษร):

grep -o .|sort|uniq -c

ต้นฉบับของ joeytwiddle (29 ตัวอักษร):

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

เดิมทีฉันเคยsedเพิ่มบรรทัดใหม่หลังจากตัวละครแต่ละตัว Firefly พัฒนาให้ดีขึ้นด้วยgrep -o .เนื่องจาก-oแสดงทุกรูปแบบที่ตรงกันในบรรทัดของตัวเอง Wumpus ชี้ให้เห็นการปรับปรุงเพิ่มเติมโดยใช้fold -1แทน เยี่ยมมาก!

uniq ใช้งานได้จริงแม้ว่าจะใช้กับรายการที่เรียงลำดับเท่านั้น

โปรดทราบว่ารูปแบบผลลัพธ์ไม่ตรงกับตัวอย่างในคำถามทั้งหมด ที่ต้องมีการเรียกใช้ครั้งสุดท้ายsedเพื่อสลับอาร์กิวเมนต์ (รอคำตอบสำหรับคำถามของ Jan Dvorak เพื่อดูว่าจำเป็นหรือไม่ ... )

การจัดรูปแบบใหม่ด้วย sed คือ "เพียง" อีก 33 ตัวอักษร! ( ทั้งหมด 53 )

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

Awk เกือบจะสามารถทำงานได้ในขณะที่เพิ่มเพียง 25 ตัวอักษร แต่ซ่อนพื้นที่แรก โง่เขลา!

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

ฉันสงสัยว่าการปรับปรุงสามารถทำได้ในขั้นตอนการจัดรูปแบบใหม่หรือไม่


2
สำหรับ sed คุณสามารถใช้&สำหรับ "การแข่งขันทั้งหมด" แทนได้\0แต่grep -o .จะสั้นกว่านี้เล็กน้อย เป็นมูลค่าการกล่าวขวัญว่าผลลัพธ์ของuniq -cความแตกต่างเล็กน้อยจากที่ระบุในคำถาม
FireFly

โอ้ขอบคุณคุณ! Updated ฉันไม่ควรลืมgrep -o; มันเป็นประโยชน์อย่างหนึ่ง
joeytwiddle

2
fold -1ทำสิ่งเดียวกันกับgrep -o .

เยี่ยมมาก :) เรียนรู้เทคนิคใหม่!
joeytwiddle

1
ptx -S.ไม่เหมือนกันเคล็ดลับ
Pureferret

7

Ruby 1.9.3: 53 ตัวอักษร

(ขึ้นอยู่กับความคิดเห็นของ @ shiva's และ @ daneiro)

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

วิ่งตัวอย่าง:

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 ตัวอักษร

ไม่เคารพรูปแบบผลลัพธ์:

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

วิ่งตัวอย่าง:

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 charsa=gets.strip;a.split('').uniq.each{|x|puts"#{x} : #{a.count(x)}"}
Siva

ทำไมถึงstrip()? คำถามบอกว่า“ ตัวละครทุกตัวนับ”
จัดการ

ได้รับจะกลับมา\nแม้ว่าคุณไม่ได้ตั้งใจ
ศิวะ

Nope ผลตอบแทน\nก็ต่อเมื่อมันผ่านจริงๆ การส่งผ่านเป็นผลข้างเคียงของการใช้ here-string pastebin.com/gCrgk9m1
จัดการ

1
การใช้$_และการคิดเลขaยังคงให้เสียง และc+"...แทน"#{c}...
daniero

7

Python 3: 76 ตัวอักษร

76

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

44

(พิมพ์ตัวอักษรเดียวกันหลาย ๆ ครั้งดูคำตอบของWasiสำหรับรุ่นที่ถูกต้อง)

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

รุ่น char 45 พิมพ์อักขระมากกว่าหนึ่งครั้ง
ugoren

ถูกต้อง ... ขอบคุณที่สังเกต!
evuez

@evuez ฉันเพิ่งแก้ไขรุ่นถ่าน 45 ตัวของคุณ แต่คุณลบมันแล้วฉันได้ส่งมันอีกครั้ง มีรูปลักษณ์
วะสี

6

Perl 6: 21 ตัวอักษร

.say for get.comb.Bag
(REPL)
> .say สำหรับ get.comb.Bag
คำจำกัดความของความวิกลจริตคือการอ้างวลีเดียวกันซ้ำแล้วซ้ำอีกและไม่คาดหวังความสิ้นหวัง
"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

5

APL (15)

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

หากคุณต้องการจริงๆ:มันคือ19 (แต่มีคนอื่นที่ไม่ได้รวมไว้):

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

เอาท์พุท:

      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

คำถามกึ่งจริงจัง - อะไรคือสิ่งที่ต้องการรักษารหัส APL ดั้งเดิม
Michael Stern

@MichaelStern: ไม่เป็นไรฉันไม่เคยทำแบบนั้นมาก่อน แต่ฉันเดาว่ามันไม่เลวร้ายไปกว่าการรักษารหัสดั้งเดิมอื่น ๆ APL นั้นค่อนข้างง่ายต่อการอ่านเมื่อคุณคุ้นเคย
marinus

5

R, 30 ตัวอักษร

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

ตัวอย่างการใช้งาน:

> 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 

ความคิดที่ดี! แต่คำถามบอกว่ารหัสจะต้องพิมพ์ผลลัพธ์ รหัสของคุณจะส่งคืนผลลัพธ์ catฉันคิดว่าคุณต้องการ
Sven Hohenstein

@SvenHohenstein ดีไม่ได้ระบุไว้เมื่อฉันตอบ (ฉันตอบก่อนที่จะแก้ไขคำถาม 4 ข้อ) ... แต่ตามความเป็นจริงแล้วcatจะคืนค่าไม่ใช่ชื่อค่า (เช่นตัวอักษร) ดังนั้นมันจะต้องมีวิธีแก้ปัญหาที่ซับซ้อนมากขึ้น
plannapus

5

Perl 5, 54 ตัวอักษร

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

1
ทางออกที่ดีมากอ่านง่าย ที่จะต้องมีsort keys%hแม้ว่า
primo

1
เฮ้ @protist ดูดี! ฉันเห็นด้วยกับ @primo แม้ว่า! อย่างไรก็ตามคุณสามารถบันทึกสองตัวอักษรโดยใช้$_=<>;s/./$h{$_}++/eg;หรือmap{$h{$_}++}<>=~/./g;แทนmap{$h{$_}++}split//,<>;
Dom Hastings

1
@ DomHastings หรือ$h{$_}++for<>=~/./gซึ่งฉันคิดว่าอาจเหมาะสมที่สุด ขึ้นบรรทัดใหม่ตามตัวอักษรแทน\nเช่นกัน
primo

อ่าดีกว่า! ใช่ฉันลืมที่จะพูดถึงบรรทัดใหม่ตัวอักษรที่กลายเป็นที่ชื่นชอบ -1 ไบต์ใหม่ของฉัน!
Dom Hastings

5

JavaScript

  1. 66 53 ไบต์:

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

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

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

หมายเหตุ:ในทุกกรณีจำนวนไบต์ที่ถูกลบอ้างถึงการconsole.log()โทรพิเศษซึ่งไม่มีประโยชน์หากทำงานในคอนโซล ขอบคุณบิ๊กเพื่อ@immaสำหรับจับที่ดีกับและ-~a[b] prompt(a={})วิธีนี้ช่วยประหยัดไบต์ได้มากขึ้น


1
แผนที่แทนการวนซ้ำช่วยเล็กน้อย (a [b [i]] || 0) +1 สามารถลดลงเป็น - ~ a [b [i]] & console.log สามารถไปได้เพียงแค่คืนค่าสุดท้าย ให้พรอมต์ (a = {}). แยก (""). map (ฟังก์ชั่น (c) {a [c] = - ~ a [c]}); a
imma

1
คุณสามารถเปลี่ยนforเป็นการfor inทดสอบในแท็บที่ว่างเปล่าซึ่งให้ผลลัพธ์เหมือนกัน นอกจากนี้ยัง;ไม่จำเป็นต้องใช้ล่าสุดดังนั้น:b=prompt(a={});for(i in b){a[b[i]]=-~a[b[i]]}a
eithed

1
ดี :-) ติด the b = ... เข้าสู่ & for swop the for {} สำหรับ สำหรับการปิด 2 ไบต์อื่น: สำหรับ (i ใน b = พรอมต์ (a = {})) [b [i]] = - ~ a [b [i]]; a
imma

แม้ว่าพวกเขาอาจต้องการเอาท์พุทข้อความที่แน่นอน: - / ซึ่งทำให้มัน / ฉันสำรองโดย 36 (ถึง 79) ไบต์: สำหรับ (ฉันใน b = พรอมต์ (a = {})) a [b [i]] = - ~ a [b [i]]; สำหรับ (n ใน a) console.log (n + ":" + a [n])
imma

1
@VisioN เฉพาะในกรณีที่ดั้งเดิมมีมากเกินไป - for inแน่นอนให้คุณทำงานใน SO แต่ไม่ได้อยู่ในแท็บที่ว่างเปล่า;)
eithed

5

Python 2 ถูกต้อง (58)

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

เอาท์พุท:

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 สไตล์เสือชีต้า (41)

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

เอาท์พุท:

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}

ลืมลบเครื่องหมายวงเล็บออกหลังจากพิมพ์ในอันที่สองซึ่งทำให้ 41
ToonAlfrink

คุณสามารถลงไปถึง 52 for l in set(s):print l,":",s.count(l)ตัวอักษรกับรุ่นแรกของคุณ: สำหรับส่วนที่สองการลบช่องว่างที่ไม่จำเป็นออกทำให้คุณชนะ 2 ตัวอักษร:print{l:s.count(l)for l in s}
2557

5

Mathematica, 61 ไบต์

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

จากนั้นจะปรากฏขึ้นในกล่องโต้ตอบนี้

อินพุต

และสำหรับประโยคตัวอย่างสร้างเป็นเอาต์พุต

เอาท์พุต


4

หลาม 3, 49

ขโมยแนวคิดจากevuez

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

การป้อนข้อมูล:

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

การปรับปรุงที่ดี! ทำไมคุณไม่ลบการจัดเรียง ()
evuez

1
ขวา! อย่างไรก็ตามถ้าคุณไม่ใช้ความเข้าใจในรายการก็จะมีน้อยกว่า 1 ตัว:for i in sorted(set(t)):print(i,':',t.count(i))
evuez

@evuez ขอบคุณฉันควรจะเพิ่มเป็นความคิดเห็นในรหัสของคุณ ถ้าคุณชอบคุณสามารถเพิ่มได้อีกในโซลูชันของคุณ (ฉันจะลบอันนี้อย่างมีความสุข): D
Wasi

จะไม่ยุติธรรมฉันไม่ได้คิดเรื่องset()! ;)
หลักฐาน

4

JavaScript (69 68 ตัวอักษร):

คาดว่าsจะเก็บสตริง

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

นี่เป็นไปตามกฎใหม่อย่างสมบูรณ์แบบ

หมายเหตุ: สิ่งนี้จะถือว่าสภาพแวดล้อมที่สะอาดโดยไม่มีคุณสมบัติที่กำหนดเองบนต้นแบบวัตถุมาตรฐานใด ๆ

แก้ไข:น้อยกว่า 1 ตัวอักษร!

เอาต์พุตคอนโซล:

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

คำตอบเก่า (44 ตัวอักษร):

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

สิ่งนี้ใช้ได้ก่อนที่กฎจะเปลี่ยนแปลง

r มีเอาต์พุต




3

C # (178 220ตัวอักษร)

จากความคิดเห็นของ @ Spongeman ฉันได้ทำการเปลี่ยนแปลงเล็กน้อย:

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])));}}

ไม่ได้รวบรวม อันนี้ทำ: 178 ตัวอักษร using System.Linq; using C = System.Console; class F {โมฆะคงที่ Main () {C.WriteLine (string.Join ("\ n", C.ReadLine ()) GroupBy (c => c) .Select ( g => g.Key + ":" + g.Count ()) OrderBy (s => s)));}}
Spongman

168: การใช้ C = System.Console; using System.Linq; class F {โมฆะคงที่ Main () {foreach (var g ใน C.ReadLine (). GroupBy (c => c). OrderBy (g => g.Key )) C.WriteLine (g.Key + ":" + g.Count ());}}
Spongman

เห็นได้ชัดว่าการเรียงลำดับนั้นไม่จำเป็น 150: using C = System.Console; using System.Linq; class F {โมฆะคงที่ Main () {foreach (var g ใน C.ReadLine () GroupBy (c => c)) C.WriteLine (g.Key + ":" + g.Count ());}}
Spongman

ว้าว. ด่วนหรือบังเอิญ? คุณตอบเพียงเสี้ยววินาทีหลังจากฉันอัปเดตคำตอบของฉัน: D เพิ่งสังเกตเห็นว่าการเรียงลำดับไม่ได้กล่าวถึงอย่างชัดเจน!
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 ตัว

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

เอาท์พุต

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

หากคุณต้องการช่องว่างรอบ ๆ:เปลี่ยนเป็น긃똠เป็น 20 ตัวอักษร

คำอธิบาย

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 พร้อมการจัดรูปแบบที่กำหนด)

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

เอาท์พุท:

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

ด้วยการจัดรูปแบบที่กำหนดจะกลายเป็น:

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

คุณสามารถวางอักขระได้โดยการสลับออกจากซิงก์ไปป์สำหรับการเรียกใช้ฟังก์ชันสองสามครั้ง:let f s=Seq.countBy id (Seq.sort s)|>Seq.iter(printfn"%A")
goric

ในความเป็นจริงทำไมถึงต้องเรียงลำดับตั้งแต่แรก? let f s=Seq.countBy id s|>Seq.iter(printfn"%A")
goric

3

Mathematica, 34 29 ไบต์

ไม่แน่ใจว่าทำไมคำตอบ Mathematica อื่น ๆ นั้นซับซ้อนมาก ... ;)

Grid@Tally@Characters@Input[]

3

Bash ( 20 15 ตัวอักษร)

 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

รองรับการเข้ารหัส ASCII แล้ว

Bash (23 ตัวอักษร):

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

ไม่รองรับการฟอร์แมต ASCII


เพิ่งออกมาจากความอยากรู้อยากเห็นคุณต้องการ | เรียง | ที่นี่ AFAIK ptx จะสร้างรายการตัวอักษรที่เรียงลำดับไว้แล้วซึ่งคุณสามารถป้อนโดยตรงไปที่ "uniq -c"
zeppelin

@zeppelin สร้างความมั่นใจให้กับคุณในสิ่งที่คุณพูด
Pureferret

3

Java 8, 273 253 249 246 239 200 ไบต์

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 ไบต์ขอบคุณที่@Poke
-7 ไบต์ขอบคุณที่@ OlivierGrégoire

คำอธิบาย:

ลองที่นี่

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 bytesimport 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));}}}
Poke

2
m.compute(c,(k,v)->v!=null?(int)v+1:1);แทนที่จะm.put(c,m.get(c‌​)!=null?(int)m.get(c‌​)+1:1);บันทึกเป็น 3 ไบต์
Olivier Grégoire

2

พาวเวอร์เซลล์, 63

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

2
ที่สำคัญในกัญชาแต่ละคนสามารถเข้าถึงได้เป็นทรัพย์สินในกัญชาที่เพื่อให้คุณสามารถโกนตัวละครทั้งสองโดยการเปลี่ยนแต่ละตัวอย่างของการมี$a[$_] $a.$_ดูhelp about_hash_tables
goric

2

สคริปต์คำสั่งของ Windows - 72 ไบต์

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

ขาออก:

\=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

ดี! แม้ว่าจะเป็นตัวพิมพ์เล็ก แต่ก็น่าทึ่งเสมอที่เห็นความฉลาดที่แท้จริงในการเขียนโปรแกรมแบตช์
Brian Minton

2

J, 23 ตัวอักษร

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

รูปแบบผลลัพธ์ที่ต่างกันเล็กน้อย (บรรทัดที่ 2 คือ stdin):

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

2

J, 22 ตัวอักษร

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

ตัวอย่าง:

   (~.;"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.

ในกรณีของเราถ้าอินพุตจะเป็น "คำจำกัดความของความวิกลจริตคือการอ้างวลีเดียวกันซ้ำแล้วซ้ำอีกและไม่คาดหวังความสิ้นหวัง "

ผลลัพธ์จะเป็น:

  : 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
string str = Console.ReadLine();คำถามที่ถามสำหรับการป้อนข้อมูลจากแป้นพิมพ์เพื่อบรรทัดแรกที่ควรจะเป็น แต่นี้เป็นรหัสกอล์ฟvar str=Console.ReadLine();เพื่อให้มันจริงควรจะเป็น ความคิดเห็นอื่น ๆ ที่ฉันต้องการจะถูกพักไว้จนกว่า OP จะปรับปรุงคำถาม
Peter Taylor

ถูกต้องฉันแก้ไขคำตอบของฉัน
Aviv

2

C #: 129

นี่คือคำตอบ Avivs แต่สั้นกว่า:

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

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

จะไม่คอมไพล์ต้องเพิ่มประมาณ 50 chars สำหรับนิยาม usings / namespace / class / method
Pierre-Luc Pineault

โอ้ไม่ทราบว่าเป็นข้อบังคับฉันขอโทษ
Abbas

2

Python 2 (90 ตัวอักษร)

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

เอาต์พุตเมื่อรันบนซอร์สของตนเอง:

  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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.