Exibir o número de ocorrências para cada caractere em uma sequência de entrada

21

O código deve receber uma string como entrada do teclado:

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

A saída deve ser assim (não classificada em nenhuma ordem específica):

  :  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

Todos os caracteres ASCII contam unicode não é um requisito, espaços, aspas, etc. ou despejado como hashmap / dicionário etc, assim x : 1e x: 1estão ok, mas {'x':1,...e x:1não são.

P: Função ou programa completo usando stdin e escrevendo stdout?
R: O código precisa ser um programa que receba entrada usando entrada padrão e exiba o resultado via saída padrão.

Placar:

Menor geral : 5 bytes

Menor geral : 7 bytes

Eduard Florinescu
fonte
3
Todos os caracteres ascii como entrada? Ou apenas imprimível? Ou até unicode? Haverá novas linhas?
Justin
2
Posso criar uma função ou é necessário um programa inteiro? Posso imprimir todos os caracteres ascii e imprimir 0como o número de ocorrências?
Justin
16
O formato de saída é rigoroso ou é suficiente para preservar o significado?
John Dvorak
Sua edição não abordou minha pergunta.
Justin
5
Você não disse se a saída precisa ser classificada em ordem alfabética. Você não disse se o separador precisa ser " : "(observe os dois espaços após o :) ou se outros separadores (mais curtos) estão bem. Você não resolveu o problema de unicode / codificação.
CodesInChaos

Respostas:

2

APL (Dyalog Unicode) , 5 bytes SBCS

Corpo do programa completo. Solicita uma sequência de STDIN e imprime a tabela separada por nova linha em STDOUT. A coluna mais à esquerda contém os caracteres de entrada e as contagens são alinhadas à direita com o maior número separado de seu caractere por um único espaço.

,∘≢⌸⍞

Experimente online!

 solicitar entrada de texto de STDIN

 crie uma tabela de chaves consistindo
, no elemento único seguido
 pelo
 registro dos índices de sua ocorrência (ou seja, quantas vezes isso ocorre)

Adão
fonte
:Infelizmente, parece que isso é necessário na saída (você não pode excluir esta resposta).
Erik the Outgolfer
@EriktheOutgolfer Como você deduz isso? Claramente, o OP achou esta resposta aceitável, de acordo com um comentário antigo .
Adám 29/03/19
Outra razão para a especificação de estar na própria pergunta ...
Erik o Outgolfer
15

PHP - 68 (ou 39) bytes

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

Saída para o texto de exemplo:

  : 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

Se a saída exata não for necessária, isso funcionaria para 39 bytes :

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

Saída de amostra:

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
)

onde cada índice numérico se refere ao valor ordinal do caractere que representa.

Eu suspeito muito fortemente que o uso de uma função interna que faça exatamente o que o problema declara em breve será desabilitado.

primo
fonte
$argv[1]em vez de fgets(STDIN)salva 4 bytes.
Titus
14

k ( 8 7)

#:'=0:0

Exemplo

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

editar: Até sete, H / T Aaron Davies

Explicação

Pegue uma String no teclado:

k)0:0
text
"text"

Agrupe os elementos distintos e retorne um mapa contendo a chave, pois caracteres e valores distintos são os índices em que os elementos distintos ocorrem.

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

Agora conte os valores de cada entrada no mapa.

k)#:'=0:0
text
t| 2
e| 1
x| 1
skeevey
fonte
Incrível.
Pureferret 22/01
o :in =:é supérfluo; k)#:'=0:0funciona bem (7 caracteres). (bônus para saber sobre 0:0, eu não tinha idéia!)
Aaron Davies
Uma explicação detalhada seria muito legal :)
Timwi
qtradução é mais fácil de entendercount each group read0 0
skeevey
13

Utilitários principais do GNU - 29 22 20 caracteres (53 com formatação)

Melhoria de Wumpus (20 caracteres):

fold -1|sort|uniq -c

Melhoria do Firefly (22 caracteres):

grep -o .|sort|uniq -c

original de joeytwiddle (29 caracteres):

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

Originalmente, eu sedsimplesmente adicionava uma nova linha após cada caractere. Firefly melhorou isso comgrep -o . , pois -oexibe todos os padrões correspondentes em sua própria linha. Wumpus apontou uma melhoria adicional usando em seu fold -1lugar. Bom trabalho!

uniq faz o trabalho real, embora se aplique apenas a listas classificadas.

Observe que o formato de saída não corresponde exatamente ao exemplo da pergunta. Isso requer uma execução final sedpara trocar os argumentos. (Esperando uma resposta para a pergunta de Jan Dvorak para ver se isso é necessário ...)

Reformatar com sed é "apenas" outros 33 caracteres! ( Total 53 )

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

O Awk pode quase fazer o trabalho enquanto adiciona apenas 25 caracteres, mas oculta o primeiro espaço. Awk parvo!

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

Gostaria de saber se melhorias podem ser feitas no estágio de reformatação ...

joeytwiddle
fonte
2
Para sed, você pode usar &"match inteiro" em vez de \0, embora ainda grep -o .seja um pouco mais curto. Vale ressaltar que a saída de uniq -cdifere um pouco da dada na pergunta.
FireFly
Oh, obrigado! Atualizada. Não devo esquecer grep -o; é útil.
Joeytwiddle
2
fold -1faz a mesma coisa quegrep -o .
Impressionante :) Aprendendo novos truques!
Joeytwiddle
11
ptx -S.faz o mesmo truque .
Pureferret
7

Ruby 1.9.3: 53 caracteres

(Com base nos comentários de @ shiva e @ daneiro.)

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

Exemplo de execução:

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 caracteres

Não respeitando o formato de saída:

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

Exemplo de execução:

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}
homem a trabalhar
fonte
11
63 caracteresa=gets.strip;a.split('').uniq.each{|x|puts"#{x} : #{a.count(x)}"}
Siva
Porque strip()? A pergunta diz: "todos os caracteres contam".
manatwork
Bem, fica retornará \nmesmo se você não pretende
Siva
Não. Só retorna \nse foi realmente aprovado. Passá-lo é um efeito colateral do uso da string aqui. pastebin.com/gCrgk9m1
manatwork
11
No entanto, usar $_e abandonar aainda é válido . E em c+"...vez de"#{c}...
daniero 22/01
7

Python 3: 76 caracteres

76

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

44

(imprima os mesmos caracteres várias vezes, consulte a resposta de Wasi para obter uma versão válida)

a=input()
for x in a:print(x,':',a.count(x))
evuez
fonte
A versão de 45 caracteres imprime caracteres mais de uma vez.
ugoren
Certo ... Obrigado por perceber!
evuez
@evuez Acabei de corrigir sua versão de 45 caracteres. Mas você o removeu, então eu o enviei novamente. Dê uma olhada
Wasi
6

Caracteres do Perl 6: 21

.say for get.comb.Bag
(REPL)
> .say para get.comb.Bag
A definição de insanidade está citando a mesma frase repetidamente e não espera desespero.
"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
Ayiko
fonte
5

APL (15)

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

Se você realmente precisa :, são 19 (mas há outros que não estão incluindo):

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

Saída:

      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
marinus
fonte
Pergunta semi-séria - como é manter o código APL legado?
Michael Stern
@ MichaelStern: Não faço ideia, eu nunca tive que fazer isso. Mas acho que não é pior do que manter outro código legado. APL é realmente muito fácil de ler quando você está acostumado.
marinus
5

R, 30 caracteres

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

Exemplo de uso:

> 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 
plannapus
fonte
Boa ideia! Mas a pergunta diz que o código deve imprimir o resultado. Seu código apenas retorna o resultado. Suponho que você precise cat.
Sven Hohenstein
@SvenHohenstein bem, não foi especificado quando eu respondi (eu respondi antes da revisão 4 da pergunta) ... mas, na verdade cat, retornará apenas os valores e não os nomes dos valores (ou seja, os caracteres). Portanto, seria necessária uma solução mais complexa.
plannapus
5

Perl 5, 54 caracteres

map{$h{$_}++}split//,<>;print"$_ : $h{$_}\n"for keys%h
protista
fonte
11
Solução muito boa, fácil de ler. Isso precisaria ser sort keys%h, no entanto.
Primo 22/01
11
Hey @protist, parece ser bom! Eu concordo com @primo embora! Você pode, no entanto, salvar dois caracteres usando $_=<>;s/./$h{$_}++/eg;ou em map{$h{$_}++}<>=~/./g;vez demap{$h{$_}++}split//,<>;
1111 Dom Hastings
11
@DomHastings ou $h{$_}++for<>=~/./g, o que acho melhor. Nova linha literal em vez de \ntambém.
Primo
Ah legal, melhor ainda! Sim, esqueci de mencionar a nova linha literal, que se tornou meu novo byte favorito de -1!
Dom Hastings
5

Javascript

  1. 66 53 bytes:

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

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

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

NB: Em todos os casos, o número de bytes excluídos refere-se a console.log()chamadas extras que não fazem sentido se executadas no console. Muito obrigado a @imma pela ótima captura com -~a[b]e prompt(a={}). Definitivamente, isso salvou mais alguns bytes.

Visão
fonte
11
mapa em vez de um loop também ajuda um pouco (a [b [i]] || 0) +1 pode ser reduzido para - ~ a [b [i]] e console.log provavelmente pode ir, apenas retornando o último valor, dando prompt (a = {}). split (""). map (function (c) {a [c] = - ~ a [c]}); a
imma
11
você pode mudar forpara for in- o teste na guia vazia produz os mesmos resultados. Além disso, o último ;não é necessário, portanto:b=prompt(a={});for(i in b){a[b[i]]=-~a[b[i]]}a
eithed 22/01/14
11
nice :-) coloque o b = ... no for & troque o for {} 's por a; para outros 2 bytes de desconto: para (i em b = prompt (a = {})) a [b [i]] = - ~ a [b [i]]; a
imma
embora eles possam querer uma saída de texto exata: - / o que faz com que eu seja copiado por 36 (a 79) bytes: for (i in b = prompt (a = {})) a [b [i]] = - ~ a [b [i]]; para (n em a) console.log (n + ":" + a [n])
imma
11
@VisioN somente se os primitivos estão sobrecarregados - for inna verdade, dá-lhe funções no SO, mas não na guia vazia;)
eithed
5

Python 2, corretamente (58)

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

Saída:

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, estilo chita (41)

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

Saída:

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}
ToonAlfrink
fonte
Esqueceu de remover os suportes após a impressão no segundo, o que o torna 41
ToonAlfrink
Você pode ir até 52 caracteres com a sua primeira versão: for l in set(s):print l,":",s.count(l). Para o segundo, remover espaços desnecessários faz você ganhar 2 caracteres:print{l:s.count(l)for l in s}
evuez
5

Mathematica, 61 bytes

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

Em seguida, aparece essa caixa de diálogo,

entrada

e para a sentença de amostra, produz como saída

saída

Michael Stern
fonte
4

python 3, 49

Roubar a ideia de evuez

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

entrada:

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

saída:

  :  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
Wasi
fonte
boa melhoria! por que você não remove o classificado ()?
evuez
11
direita! de qualquer maneira, se você não usar uma compreensão de lista, é 1 caractere a menos:for i in sorted(set(t)):print(i,':',t.count(i))
evuez
@evuez Obrigado, eu deveria adicioná-lo como um comentário no seu código. Se você quiser, pode adicioná-lo novamente em sua solução (felizmente excluirei este): D
Wasi
Não seria justo, eu não tinha pensado nisso set()! ;)
evuez
4

JavaScript (69 68 caracteres):

Espera ssegurar a corda.

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

Isso segue as novas regras perfeitamente.

Nota: Isso pressupõe um ambiente limpo, sem propriedades personalizadas em nenhum protótipo de objeto padrão.

Editar: 1 caractere a menos!

Saída do console:

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

Resposta antiga (44 caracteres):

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

Isso era válido antes das regras serem alteradas.

r contém a saída.

Escova dental
fonte
3

Haskell, 93

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

PowerShell (49)

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

C # (178 220 caracteres)

Baseado no comentário de @ Spongeman, eu mudei um pouco:

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])));}}
gideon
fonte
não compila. este faz: 178 caracteres. using System.Linq; using C = System.Console; class F {static void Main () {C.WriteLine (string.Join ("\ n", C.ReadLine (). GroupBy (c => c) .Selecione ( g => g.Key + ":" + g.Count ()). OrderBy (s => s)));}}
Spongman
168: using C = System.Console; using System.Linq; class F {static void Main () {foreach (var g em C.ReadLine (). GroupBy (c => c) .OrderBy (g => g.Key )) C.WriteLine (g.Key + ":" + g.Count ());}}
Spongman
aparentemente, a classificação não é necessária, 150: using C = System.Console; using System.Linq; class F {static void Main () {foreach (var g em C.ReadLine (). GroupBy (c => c)) C.WriteLine (g.Key + ":" + g.Count ());}}
Spongman
Uau. Rápido ou coincidência? Você respondeu apenas um segundo depois que eu atualizei minha resposta: D Acabei de perceber que a classificação não foi mencionada explicitamente!
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 caracteres

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

Saída

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

Se você quiser os espaços ao redor do :, mude para 긃똠, com 20 caracteres.

Explicação

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
丟
Timwi
fonte
3

F # ( 66 59 49, 72 com formatação prescrita)

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

Saída:

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

Com a formatação prescrita, torna-se:

let f s=s|>Seq.countBy(id)|>Seq.iter(fun(a,b)->printfn"\"%c\" :  %d"a b)
Rik
fonte
Você pode deixar cair um personagem por mudar para longe da sintaxe canalizado para algumas das chamadas de função:let f s=Seq.countBy id (Seq.sort s)|>Seq.iter(printfn"%A")
Gorić
De fato, por que classificar em primeiro lugar? let f s=Seq.countBy id s|>Seq.iter(printfn"%A")
goric
3

Mathematica, 34 29 bytes

Não sei por que a outra resposta do Mathematica é tão complicada ...;)

Grid@Tally@Characters@Input[]
Martin Ender
fonte
3

Bash ( 20 15 caracteres)

 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

Codificação ASCII agora suportada

Bash (23 caracteres):

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

Formatação ASCII não suportada

Pureferret
fonte
só por curiosidade, você realmente precisa | classificar | aqui, AFAIK ptx já irá produzir uma lista ordenada de caracteres que você pode alimentar diretamente para "uniq -c"
zeppelin
@zeppelin um pouco googling confimrs o que você disse
Pureferret
3

Java 8, 273 253 249 246 239 200 bytes

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 bytes graças a @Poke .
-7 bytes graças a @ OlivierGrégoire .

Explicação:

Experimente aqui.

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
Kevin Cruijssen
fonte
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));}}}
Puxão
2
m.compute(c,(k,v)->v!=null?(int)v+1:1);em vez de m.put(c,m.get(c‌​)!=null?(int)m.get(c‌​)+1:1);salvar 3 bytes.
Olivier Grégoire
2

Powershell, 63

$a=@{};[char[]](read-host)|%{$a[$_]++};$a.Keys|%{"$_ :"+$a[$_]}
Danko Durbić
fonte
2
Cada chave em um hash pode ser acessada como uma propriedade nesse hash, para que você possa cortar dois caracteres substituindo cada instância de $a[$_]por $a.$_. Vejahelp about_hash_tables
goric
2

Script de comando do Windows - 72 bytes

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

Saídas:

\=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
Robert Sørlie
fonte
Agradável! No entanto, ele se dobra, mas é sempre incrível ver a inteligência real na programação de arquivos em lote.
Brian Minton 24/01
2

J, 23 caracteres

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

Formato de saída ligeiramente diferente (a linha 2 é stdin):

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

J, 22 caracteres

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

Exemplo:

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

No nosso caso, se a entrada será " A definição de insanidade está citando a mesma frase repetidamente e não espera desespero " .

A saída será:

  : 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
Aviv
fonte
11
A pergunta pede entrada do teclado, então a primeira linha deve ser string str = Console.ReadLine();. Mas isso é código-golfe, então realmente deveria ser var str=Console.ReadLine();. Os outros comentários que eu gostaria de fazer têm que ficar em espera até que o OP melhore a questão.
Peter Taylor
Você está certo, eu editei minha resposta.
Aviv
2

C #: 129

Esta é a resposta Avivs, mas mais curta:

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

Isso é meu:

C #: 103

foreach(var g in Console.ReadLine().OrderBy(o=>o).GroupBy(c=>c))Console.WriteLine(g.Key+":"+g.Count());
Abbas
fonte
Não será compilado, é necessário adicionar cerca de 50 caracteres para definições de usings / namespace / class / method.
Pierre-Luc Pineault
Oh, não sabia que isso era obrigatório, me desculpe.
Abbas
2

Python 2 (90 caracteres)

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

Saída quando executado em sua própria fonte:

  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
Paul Bissex
fonte