Tampilkan jumlah kemunculan untuk setiap karakter dalam string input


21

Kode harus mengambil string sebagai input dari keyboard:

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

Outputnya harus seperti ini (tidak diurutkan dalam urutan tertentu):

  :  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

Semua karakter ASCII menghitung unicode bukan keharusan, spasi, tanda kutip, dll dan input harus berasal dari keyboard / bukan konstanta, atribut, output harus dicetak dengan baris baru setelah setiap karakter seperti pada contoh di atas, tidak boleh dikembalikan sebagai string atau dibuang sebagai hashmap / kamus dll, jadi x : 1dan x: 1ok, tapi {'x':1,...dan x:1tidak.

Q: Berfungsi atau menyelesaikan program mengambil stdin dan menulis stdout?
A: Kode harus berupa program yang mengambil input menggunakan standar dalam dan menampilkan hasilnya melalui standar keluar.

Papan angka:

Keseluruhan terpendek : 5 byte

Keseluruhan terpendek : 7 byte


3
Semua karakter ascii sebagai input? Atau hanya bisa dicetak? Atau hingga unicode? Akankah ada baris baru?
Justin

2
Bisakah saya membuat fungsi, atau seluruh program diperlukan? Bisakah saya menampilkan semua karakter ascii dan mencetak 0sebagai jumlah kemunculan?
Justin

16
Apakah format outputnya ketat, atau cukup untuk mempertahankan artinya?
John Dvorak

Hasil edit Anda tidak menjawab pertanyaan saya.
Justin

5
Anda tidak mengatakan apakah output perlu disortir berdasarkan abjad. Anda tidak mengatakan apakah pemisah harus " : "(perhatikan dua spasi setelah :) atau jika pemisah lainnya (lebih pendek) baik-baik saja. Anda tidak mengatasi masalah unicode / encoding.
CodesInChaos

Jawaban:


2

APL (Dyalog Unicode) , 5 byte SBCS

Badan program penuh. Meminta string dari STDIN dan mencetak tabel yang dipisahkan baris baru ke STDOUT. Kolom paling kiri adalah karakter input, dan jumlah disejajarkan dengan angka terbesar yang dipisahkan dari karakternya dengan satu spasi.

,∘≢⌸⍞

Cobalah online!

 meminta input teks dari STDIN

 buat tabel kunci yang terdiri dari
, elemen unik diikuti
 oleh
 penghitungan indeks kemunculannya (yaitu berapa kali itu terjadi)


Sepertinya :sayangnya diperlukan dalam output (Anda tidak dapat menghapus jawaban ini).
Erik the Outgolfer

@EriktheOutgolfer Bagaimana Anda menyimpulkan itu? Jelas OP menemukan jawaban ini dapat diterima, sesuai dengan komentar lama .
Adam

Alasan lain mengapa spec berada dalam pertanyaan itu sendiri ...
Erik the Outgolfer

15

PHP - 68 (atau 39) byte

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

Output untuk teks contoh:

  : 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

Jika output yang tepat tidak diperlukan, ini akan bekerja selama 39 byte :

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

Output sampel:

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
)

di mana setiap indeks numerik merujuk nilai ordinal dari karakter yang diwakilinya.

Saya menduga sangat kuat bahwa menggunakan fungsi built-in yang melakukan persis apa yang dinyatakan masalah segera akan dianulir.


$argv[1]bukannya fgets(STDIN)menyimpan 4 byte.
Titus

14

k ( 8 7)

#:'=0:0

Contoh

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

sunting: Turun ke tujuh, H / T Aaron Davies

Penjelasan

Ambil Tali dari keyboard:

k)0:0
text
"text"

Kelompokkan elemen-elemen yang berbeda dan kembalikan peta yang berisi kunci sebagai karakter dan nilai yang berbeda adalah indeks di mana elemen-elemen yang berbeda terjadi.

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

Sekarang hitung nilai setiap entri di peta.

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

Luar biasa.
Pureferret

yang :di =:adalah berlebihan; k)#:'=0:0berfungsi dengan baik (7 karakter). (bonus untuk mengetahui tentang 0:0, saya tidak tahu!)
Aaron Davies

Penjelasan terperinci akan sangat keren :)
Timwi

qterjemahannya lebih mudah dimengerti -count each group read0 0
skeevey

13

Utilitas inti GNU - 29 22 20 karakter (53 dengan pemformatan)

Peningkatan Wumpus (20 karakter):

fold -1|sort|uniq -c

Peningkatan Firefly (22 karakter):

grep -o .|sort|uniq -c

asli joeytwiddle (29 karakter):

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

Awalnya saya biasa sedmenambahkan baris baru setelah setiap karakter. Firefly meningkatkannya dengan grep -o ., karena -omenampilkan setiap pola yang cocok pada jalurnya sendiri. Wumpus menunjukkan perbaikan lebih lanjut menggunakan fold -1bukan. Kerja bagus!

uniq melakukan pekerjaan yang sebenarnya, meskipun hanya berlaku untuk daftar yang diurutkan.

Perhatikan bahwa format output tidak sama persis dengan contoh dalam pertanyaan. Itu membutuhkan putaran terakhir seduntuk menukar argumen. (Menunggu jawaban untuk pertanyaan Jan Dvorak untuk melihat apakah ini diperlukan ...)

Memformat ulang dengan sed adalah "hanya" 33 karakter lain! ( Total 53 )

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

Awk hampir bisa melakukan pekerjaan sambil menambahkan hanya 25 karakter, tetapi menyembunyikan ruang pertama. Awk konyol!

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

Saya ingin tahu apakah perbaikan dapat dilakukan pada tahap format ulang ...


2
Untuk sed Anda dapat menggunakan &untuk "seluruh pertandingan" bukan \0, meskipun grep -o .sedikit lebih pendek. Perlu disebutkan bahwa output uniq -csedikit berbeda dari yang diberikan dalam pertanyaan.
FireFly

Oh terima kasih Diperbarui. Saya tidak boleh lupa grep -o; itu yang bermanfaat.
joeytwiddle

2
fold -1melakukan hal yang sama dengangrep -o .

Luar biasa :) Mempelajari trik baru!
joeytwiddle

1
ptx -S.melakukan trik yang sama .
Pureferret

7

Ruby 1.9.3: 53 karakter

(Berdasarkan komentar @ shiva dan @ daneiro.)

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

Contoh dijalankan:

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 karakter

Tidak menghormati format output:

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

Contoh dijalankan:

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

Kenapa harus strip()? Pertanyaannya mengatakan, "semua karakter dihitung".
manatwork

Yah, dapatkan akan kembali \nbahkan jika Anda tidak berniat untuk
Siva

Nggak. Hanya mengembalikan \njika itu benar-benar berlalu. Melewati itu adalah efek samping dari menggunakan string di sini. pastebin.com/gCrgk9m1
manatwork

1
Menggunakan $_dan membolos amasih terdengar sekalipun. Dan c+"...bukannya"#{c}...
daniero

7

Python 3: 76 karakter

76

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

44

(cetak karakter yang sama berkali-kali, lihat jawaban Wasi untuk versi yang valid)

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

Versi 45 char mencetak karakter lebih dari sekali.
ugoren

Benar ... Terima kasih telah memperhatikan!
evuez

@evuez Saya baru saja memperbaiki versi 45 char Anda. Tapi, Anda menghapusnya jadi saya telah mengirimkannya sekali lagi. Silakan lihat
Wasi

6

Perl 6: 21 karakter

.say for get.comb.Bag
(REPL)
> .say untuk get.comb.Bag
Definisi kegilaan adalah mengutip frasa yang sama berulang-ulang dan tidak berharap putus asa.
"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←⍞

Jika Anda benar-benar membutuhkannya :, berarti 19 (tetapi ada orang lain yang tidak memasukkannya):

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

Keluaran:

      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

Pertanyaan setengah serius - seperti apa mempertahankan kode APL lama?
Michael Stern

@MichaelStern: Tidak tahu, saya tidak pernah melakukan itu. Tapi saya kira itu tidak lebih buruk daripada mempertahankan kode warisan lainnya. APL sebenarnya cukup mudah dibaca setelah Anda terbiasa.
marinus

5

R, 30 karakter

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

Contoh penggunaan:

> 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 

Ide bagus! Tetapi pertanyaannya mengatakan kode harus mencetak hasilnya. Kode Anda baru saja mengembalikan hasilnya. Saya kira Anda perlu cat.
Sven Hohenstein

@ SvenHohenstein juga tidak ditentukan ketika saya menjawab (saya menjawab sebelum revisi 4 dari pertanyaan) ... tetapi pada kenyataannya cathanya akan mengembalikan nilai bukan nama nilai (yaitu karakter). Jadi itu akan membutuhkan solusi yang lebih kompleks.
plannapus

5

Perl 5, 54 karakter

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

1
Solusi yang sangat bagus, mudah dibaca. Itu perlu sort keys%h, meskipun.
Primo

1
Hai @protist, terlihat bagus! Saya setuju dengan @primo! Namun Anda dapat menyimpan dua karakter menggunakan $_=<>;s/./$h{$_}++/eg;atau map{$h{$_}++}<>=~/./g;bukanmap{$h{$_}++}split//,<>;
Dom Hastings

1
@DomHastings atau $h{$_}++for<>=~/./g, yang saya pikir mungkin optimal. Baris baru literal bukan \njuga.
Primo

Ah bagus, bahkan lebih baik! Ya, saya lupa menyebutkan baris baru literal, itu menjadi -1 byte favorit baru saya!
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: Dalam semua kasus, jumlah byte yang dihapus mengacu pada console.log()panggilan tambahan yang tidak ada gunanya jika dijalankan di konsol. Terima kasih banyak kepada @imma untuk hasil tangkapan yang luar biasa bersama -~a[b]dan prompt(a={}). Ini jelas menghemat lebih banyak byte.


1
map bukan loop membantu sedikit juga (a [b [i]] || 0) +1 dapat dikurangi menjadi - ~ a [b [i]] & console.log mungkin bisa pergi, hanya mengembalikan nilai terakhir, memberi prompt (a = {}). split (""). map (fungsi (c) {a [c] = - ~ a [c]}); a
imma

1
Anda dapat berubah formenjadi for in- pengujian di tab kosong menghasilkan hasil yang sama. Juga, yang terakhir ;tidak diperlukan, dengan demikian:b=prompt(a={});for(i in b){a[b[i]]=-~a[b[i]]}a
lahir

1
bagus :-) menempelkan b = ... ke dalam untuk & menukar untuk {} untuk; untuk 2 byte lagi off: for (i in b = prompt (a = {})) a [b [i]] = - ~ a [b [i]]; a
imma

walaupun mereka mungkin menginginkan keluaran teks yang tepat: - / yang membuatnya / saya cadangan dengan 36 (hingga 79) byte: untuk (i in b = prompt (a = {})) a [b [i]] = - ~ a [b [i]]; untuk (n in a) console.log (n + ":" + a [n])
imma

1
@VisioN hanya jika primitif kelebihan beban - for inmemang memberi Anda fungsi dalam SO, tetapi tidak di tab kosong;)
eithed

5

Python 2, dengan benar (58)

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

Keluaran:

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, gaya cheetah (41)

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

Keluaran:

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}

Lupa menghapus tanda kurung setelah mencetak yang kedua, itu membuatnya 41
ToonAlfrink

Anda dapat pergi ke 52 karakter dengan versi pertama Anda: for l in set(s):print l,":",s.count(l). Untuk yang kedua, menghilangkan spasi yang tidak perlu membuat Anda memenangkan 2 karakter:print{l:s.count(l)for l in s}
evuez

5

Mathematica, 61 byte

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

Kemudian muncul kotak dialog ini,

memasukkan

dan untuk kalimat sampel, hasilkan sebagai keluaran

keluaran


4

python 3, 49

Mencuri ide dari evuez

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

memasukkan:

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

keluaran:

  :  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

perbaikan bagus! mengapa Anda tidak menghapus yang diurutkan ()?
evuez

1
kanan! for i in sorted(set(t)):print(i,':',t.count(i))
Lagi

@evuez Terima kasih, saya seharusnya menambahkannya sebagai komentar dalam kode Anda. Jika Anda suka, Anda dapat menambahkannya lagi di solusi Anda (saya akan dengan senang hati menghapus yang ini): D
Wasi

Tidak adil, saya tidak memikirkan set()! ;)
evuez

4

JavaScript (69 68 karakter):

Berharap suntuk memegang string.

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

Ini mengikuti aturan baru dengan sempurna.

Catatan: Ini menganggap lingkungan yang bersih, tanpa properti khusus pada prototipe objek standar.

Sunting: 1 karakter lebih sedikit!

Output konsol:

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

Jawaban lama (44 karakter):

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

Ini valid sebelum aturan berubah.

r berisi output.


3

Haskell, 93

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

3

PowerShell (49)

[char[]](read-host)|group|%{$_.Name+":"+$_.Count}

3

C # (178 220 karakter)

Berdasarkan komentar @ Spongeman, saya mengubahnya sedikit:

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

tidak dikompilasi. yang ini: 178 karakter. menggunakan System.Linq; menggunakan C = System.Console; kelas F {static void Main () {C.WriteLine (string.Join ("\ n", C.ReadLine (). GroupBy (c => c) .Pilih ( g => g.Key + ":" + g.Count ()). OrderBy (s => s)));}}
Spongman

168: menggunakan C = System.Console; menggunakan System.Linq; kelas F {static void Main () {foreach (var g dalam C.ReadLine (). GroupBy (c => c) .OrderBy (g => g.Key )) C.WriteLine (g.Key + ":" + g.Count ());}}
Spongman

pengurutan tampaknya tidak perlu, 150: menggunakan C = System.Console; menggunakan System.Linq; kelas F {static void Main () {foreach (var g dalam C.ReadLine (). GroupBy (c => c)) C.WriteLine (g.Key + ":" + g.Count ());}}
Spongman

Wow. Cepat atau kebetulan? Anda menjawab sesaat setelah saya memperbarui jawaban saya: D Hanya memperhatikan bahwa penyortiran tidak secara eksplisit disebutkan!
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 karakter

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

Keluaran

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

Jika Anda ingin spasi di sekitar :, ubah menjadi 긃똠, buatlah 20 karakter.

Penjelasan

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 dengan format yang ditentukan)

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

Keluaran:

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

Dengan pemformatan yang ditentukan, itu menjadi:

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

Anda dapat menjatuhkan karakter dengan beralih dari sintaks pipa untuk beberapa panggilan fungsi:let f s=Seq.countBy id (Seq.sort s)|>Seq.iter(printfn"%A")
goric

Bahkan, mengapa menyortir di tempat pertama? let f s=Seq.countBy id s|>Seq.iter(printfn"%A")
goric

3

Mathematica, 34 29 byte

Tidak yakin mengapa jawaban Mathematica lainnya sangat rumit ...;)

Grid@Tally@Characters@Input[]

3

Bash ( 20 15 karakter)

 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

Pengkodean ASCII sekarang didukung

Bash (23 karakter):

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

Pemformatan ASCII tidak didukung


hanya karena penasaran, apakah Anda benar-benar membutuhkan | semacam | di sini, AFAIK ptx sudah akan menghasilkan daftar karakter yang diurutkan yang dapat Anda masukkan langsung ke "uniq -c"
zeppelin

@ zeppelin sedikit googling mengonfirmasi apa yang Anda katakan
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 terima kasih kepada @Poke .
-7 byte terima kasih kepada @ OlivierGrégoire .

Penjelasan:

Coba di sini.

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

2
m.compute(c,(k,v)->v!=null?(int)v+1:1);alih-alih m.put(c,m.get(c‌​)!=null?(int)m.get(c‌​)+1:1);menyimpan 3 byte.
Olivier Grégoire

2

Powershell, 63

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

2
Setiap kunci dalam hash dapat diakses sebagai properti di hash itu, sehingga Anda dapat memotong dua karakter dengan mengganti setiap instance $a[$_]dengan $a.$_. Lihathelp about_hash_tables
goric

2

Script Perintah Windows - 72 Bytes

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

Output:

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

Bagus! Memang flip case, tapi selalu luar biasa untuk melihat kepintaran yang sebenarnya dalam pemrograman file batch.
Brian Minton

2

J, 23 karakter

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

Format output yang sedikit berbeda (baris 2 adalah stdin):

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

2

J, 22 karakter

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

Contoh:

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

Dalam Kasus Kami, Jika Masukan Akan " Definisi kegilaan adalah mengutip frasa yang sama berulang-ulang dan tidak mengharapkan putus asa. "

Output Akan:

  : 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
Pertanyaannya meminta input dari keyboard, jadi baris pertama seharusnya string str = Console.ReadLine();. Tapi ini kode-golf, jadi seharusnya memang begitu var str=Console.ReadLine();. Komentar lain yang ingin saya sampaikan harus ditunda hingga OP memperbaiki pertanyaan.
Peter Taylor

Anda benar, saya mengedit jawaban saya.
Aviv

2

C #: 129

Ini jawaban Aviv tapi lebih pendek:

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":"");}

Ini adalah milikku:

C #: 103

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

Tidak mau dikompilasi, perlu menambahkan sekitar 50 karakter untuk definisi usings / namespace / class / metode.
Pierre-Luc Pineault

Oh, tidak tahu itu wajib, maaf.
Abbas

2

Python 2 (90 karakter)

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

Output saat dijalankan pada sumbernya sendiri:

  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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.