Visualizza il numero di occorrenze per ogni carattere in una stringa di input


21

Il codice dovrebbe prendere una stringa come input dalla tastiera:

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

L'output dovrebbe essere così (non ordinato in alcun ordine particolare):

  :  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

Tutti i caratteri ASCII contano unicode non è un requisito, spazi, virgolette, ecc. E l'input dovrebbe provenire da tastiera / non costanti, attributi, l'output dovrebbe essere stampato con una nuova riga dopo ogni carattere come nell'esempio sopra, non dovrebbe essere restituito come stringa o scaricati come hashmap / dizionario ecc, in modo x : 1e x: 1sono ok, ma {'x':1,...e x:1non lo sono.

D: Funzione o programma completo che prende stdin e scrive stdout?
A: Il codice deve essere un programma che accetta input usando standard in e visualizza il risultato tramite standard out.

Pagelle:

Complessivamente più breve : 5 byte

Complessivamente più breve : 7 byte


3
Tutti i caratteri ASCII come input? O semplicemente stampabile? O fino a Unicode? Ci saranno newline?
Justin,

2
Posso creare una funzione o è necessario un intero programma? Posso stampare tutti i caratteri ASCII e stampare 0come numero di occorrenze?
Justin,

16
Il formato di output è rigoroso o è sufficiente per preservarne il significato?
John Dvorak,

La tua modifica non ha risposto alla mia domanda.
Justin,

5
Non hai detto se l'output deve essere ordinato in ordine alfabetico. Non hai detto se il separatore deve essere " : "(notare i due spazi dopo il :) o se altri (più brevi) separatori vanno bene. Non hai risolto il problema Unicode / codifica.
Codici A Caos il

Risposte:


2

APL (Dyalog Unicode) , 5 byte SBCS

Corpo del programma completo. Richiede una stringa da STDIN e stampa la tabella separata newline su STDOUT. La colonna più a sinistra contiene i caratteri di input e i conteggi sono allineati a destra con il numero più grande separato dal suo carattere da un singolo spazio.

,∘≢⌸⍞

Provalo online!

 richiedere l'immissione di testo da STDIN

 creare una tabella di chiavi composta
, dall'elemento univoco seguito
 dal
 conteggio degli indici della sua occorrenza (cioè quante volte si verifica)


Sembra che :purtroppo sia richiesto nell'output (non è possibile eliminare questa risposta).
Erik the Outgolfer

@EriktheOutgolfer Come lo deduci? Chiaramente OP ha trovato questa risposta accettabile, in conformità con un vecchio commento .
Adám,

Un altro motivo per cui le specifiche sono nella domanda stessa ...
Erik the Outgolfer

15

PHP - 68 (o 39) byte

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

Output per il testo di esempio:

  : 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 l'output esatto non è richiesto, funzionerebbe per 39 byte :

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

Uscita campione:

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
)

dove ogni indice numerico si riferisce al valore ordinale del carattere che rappresenta.

Sospetto fortemente che l'uso di una funzione integrata che fa esattamente ciò che indica il problema sarà presto vietato.


$argv[1]invece di fgets(STDIN)salvare 4 byte.
Tito

14

k ( 8 7)

#:'=0:0

Esempio

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

modifica: fino a sette, H / T Aaron Davies

Spiegazione

Prendi una stringa dalla tastiera:

k)0:0
text
"text"

Raggruppa gli elementi distinti e restituisce una mappa contenente chiave come caratteri e valori distinti sono gli indici in cui si verificano gli elementi distinti.

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

Ora conta i valori di ogni voce nella mappa.

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

Abbastanza incredibile
Pureferret,

l'in :in =:è superfluo; k)#:'=0:0funziona benissimo (7 caratteri). (bonus per sapere 0:0, non avevo idea!)
Aaron Davies il

Una spiegazione dettagliata sarebbe davvero interessante :)
Timwi,

qla traduzione è più semplice da capire -count each group read0 0
skeevey,

13

GNU core utils - 29 22 20 caratteri (53 con formattazione)

Miglioramento di Wumpus (20 caratteri):

fold -1|sort|uniq -c

Miglioramento di Firefly (22 caratteri):

grep -o .|sort|uniq -c

originale di joeytwiddle (29 caratteri):

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

Inizialmente sedaggiungevo semplicemente una nuova riga dopo ogni personaggio. Firefly è migliorato con quello grep -o ., poiché -omostra ogni modello abbinato su una propria linea. Wumpus ha sottolineato un ulteriore miglioramento usando fold -1invece. Bel lavoro!

uniq fa il vero lavoro, anche se si applica solo agli elenchi ordinati.

Si noti che il formato di output non corrisponde esattamente all'esempio nella domanda. Ciò richiede un passaggio finale sedper scambiare gli argomenti. (In attesa di una risposta alla domanda di Jan Dvorak per vedere se questo è necessario ...)

Riformattare con sed è "solo" altri 33 caratteri! ( Totale 53 )

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

Awk può quasi fare il lavoro aggiungendo solo 25 caratteri, ma nasconde il primo spazio. Stupido sciocco!

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

Mi chiedo se sia possibile apportare miglioramenti nella fase di riformattazione ...


2
Per sed puoi usare &"intere partite" invece di \0, anche se grep -o .è ancora leggermente più corto. Vale la pena ricordare che l'output di uniq -cdifferisce leggermente da quello indicato nella domanda.
FireFly,

Oh grazie! Aggiornato. Non dovrei dimenticare grep -o; è utile.
joeytwiddle,

2
fold -1fa la stessa cosa digrep -o .

Fantastico :) Imparare nuovi trucchi!
joeytwiddle,

1
ptx -S.fa lo stesso trucco .
Pureferret,

7

Ruby 1.9.3: 53 caratteri

(Basato sui commenti di @ shiva e @ daneiro.)

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

Esecuzione di esempio:

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

Rubino: 44 caratteri

Non rispettando il formato di output:

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

Esecuzione di esempio:

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

Perché strip()? La domanda dice "tutti i personaggi contano".
arte

Bene, tornerà \nanche se non hai intenzione di farlo
Siva

No. Ritorna solo \nse è stato davvero superato. Passarlo è un effetto collaterale dell'utilizzo di qui-stringa. pastebin.com/gCrgk9m1
arte

1
L'uso $_e l'abbandono asono comunque validi. E c+"...invece di"#{c}...
daniero il

7

Python 3: 76 caratteri

76

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

44

(stampa più volte gli stessi personaggi, vedi la risposta di Wasi per una versione valida)

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

La versione 45 caratteri stampa i personaggi più di una volta.
Ugoren,

Giusto ... Grazie per averlo notato!
evuez,

@evuez Ho appena corretto la tua versione da 45 caratteri. Ma l'hai rimosso, quindi l'ho inviato di nuovo. Dai un'occhiata
Wasi,

6

Perl 6: 21 caratteri

.say for get.comb.Bag
(REPL)
> .say per get.comb.Bag
La definizione di follia sta citando la stessa frase ancora e ancora e non aspettarsi disperazione.
"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←⍞

Se hai davvero bisogno di :, sono 19 (ma ce ne sono altri che non lo stanno includendo):

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

Produzione:

      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

Domanda semi-seria: com'è mantenere il codice APL legacy?
Michael Stern,

@MichaelStern: Nessuna idea, non ho mai dovuto farlo. Ma immagino che non sia peggio che mantenere altri codici legacy. APL è in realtà abbastanza facile da leggere una volta che ci sei abituato.
Marin

5

R, 30 caratteri

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

Esempio di utilizzo:

> 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 

Buona idea! Ma la domanda dice che il codice deve stampare il risultato. Il tuo codice restituisce solo il risultato. Suppongo che tu abbia bisogno cat.
Sven Hohenstein,

@SvenHohenstein non è stato specificato quando ho risposto (ho risposto prima della revisione 4 della domanda) ... ma di fatto catrestituirà solo i valori e non i nomi dei valori (cioè i caratteri). Quindi avrebbe bisogno di una soluzione più complessa.
plannapus,

5

Perl 5, 54 caratteri

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

1
Soluzione molto bella, facile da leggere. Questo dovrebbe essere sort keys%h, però.
primo

1
Ehi @protista, sembra buono! Sono d'accordo con @primo però! Puoi comunque salvare due caratteri usando $_=<>;s/./$h{$_}++/eg;o map{$h{$_}++}<>=~/./g;invece dimap{$h{$_}++}split//,<>;
Dom Hastings il

1
@DomHastings o $h{$_}++for<>=~/./g, che penso possa essere ottimale. Newline letterale invece \nche pure.
primo

Ah bello, ancora meglio! Sì, ho dimenticato di menzionare la nuova riga letterale, che è diventato il mio nuovo byte -1 preferito!
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: in ogni caso il numero di byte cancellati si riferisce a console.log()chiamate extra che sono inutili se eseguite nella console. Grazie mille a @imma per l'ottima cattura con -~a[b]e prompt(a={}). Ciò ha sicuramente salvato qualche altro byte.


1
map invece di un ciclo aiuta anche un po '(a [b [i]] || 0) +1 può essere ridotto a - ~ a [b [i]] e console.log può probabilmente andare, restituendo solo l'ultimo valore, dare prompt (a = {}). split (""). map (funzione (c) {a [c] = - ~ a [c]}); a
imma

1
puoi cambiarlo forin for in- test nella scheda vuota produce gli stessi risultati. Inoltre, l'ultimo ;non è necessario, quindi:b=prompt(a={});for(i in b){a[b[i]]=-~a[b[i]]}a
Eithed

1
bello :-) inserisci il b = ... nel for e scambia il for {} per s; per altri 2 byte off: for (i in b = prompt (a = {})) a [b [i]] = - ~ a [b [i]]; a
imma

sebbene possano volere un esatto output di testo: - / che lo rimette / me esegue il backup di 36 (a 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 solo se i primitivi sono sovraccarichi - in for ineffetti ti dà funzioni in SO, ma non in una scheda vuota;)
Eithed

5

Python 2, correttamente (58)

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

Produzione:

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, stile ghepardo (41)

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

Produzione:

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}

Ho dimenticato di rimuovere le parentesi dopo la stampa nella seconda, che lo rende 41
ToonAlfrink

Si può scendere a 52 caratteri con la prima versione: for l in set(s):print l,":",s.count(l). Per il secondo, la rimozione di spazi non necessari ti fa vincere 2 caratteri:print{l:s.count(l)for l in s}
evuez

5

Mathematica, 61 byte

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

Si apre quindi questa finestra di dialogo,

ingresso

e per la frase di esempio, produce come output

produzione


4

python 3, 49

Rubare idea da evuez

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

ingresso:

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

produzione:

  :  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

bel miglioramento! perché non rimuovi l'ordinato ()?
evuez,

1
giusto! comunque, se non si usa la comprensione di un elenco, è di 1 carattere in meno:for i in sorted(set(t)):print(i,':',t.count(i))
evuez,

@evuez Grazie, avrei dovuto aggiungerlo come commento nel tuo codice. Se ti piace puoi aggiungerlo di nuovo nella tua soluzione (eliminerò felicemente questo): D
Wasi

Non sarebbe giusto, non ci avevo pensato set()! ;)
evuez,

4

JavaScript (69 68 caratteri):

Si aspetta sdi contenere la stringa.

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

Questo segue perfettamente le nuove regole.

Nota: questo presuppone un ambiente pulito, senza proprietà personalizzate su alcun prototipo di oggetto standard.

Modifica: 1 carattere in meno!

Uscita 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

Vecchia risposta (44 caratteri):

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

Questo era valido prima che le regole cambiassero.

r contiene l'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 caratteri)

Sulla base del commento di @ Spongeman l'ho cambiato un po ':

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

non compilare. questo fa: 178 caratteri. using System.Linq; using 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: using C = System.Console; using 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,

apparentemente l'ordinamento non è necessario, 150: using C = System.Console; using System.Linq; class F {static void Main () {foreach (var g in C.ReadLine (). GroupBy (c => c)) C.WriteLine (g.Key + ":" + g.Count ());}}
Spongman,

Wow. Veloce o coincidenza? Hai risposto solo un secondo dopo aver aggiornato la mia risposta: D Ho appena notato che l'ordinamento non è stato menzionato esplicitamente!
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 caratteri

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

Produzione

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 vuoi gli spazi attorno a :, cambia in 긃똠, rendendolo 20 caratteri.

Spiegazione

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 con formattazione prescritta)

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

Produzione:

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

Con la formattazione prescritta, diventa:

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

Puoi eliminare un personaggio allontanandoti dalla sintassi let f s=Seq.countBy id (Seq.sort s)|>Seq.iter(printfn"%A")
reindirizzata

In effetti, perché anche ordinare in primo luogo? let f s=Seq.countBy id s|>Seq.iter(printfn"%A")
goric

3

Mathematica, 34 29 byte

Non so perché l'altra risposta di Mathematica sia così complicata ...;)

Grid@Tally@Characters@Input[]

3

Bash ( 20 15 caratteri)

 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 ASCII ora supportata

Bash (23 caratteri):

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

Formattazione ASCII non supportata


solo per curiosità, hai davvero bisogno | sort | qui, AFAIK ptx produrrà già un elenco ordinato di caratteri che puoi alimentare direttamente in "uniq -c"
zeppelin

@zeppelin conferma un po 'su Google cosa hai detto
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 grazie a @Poke .
-7 byte grazie a @ OlivierGrégoire .

Spiegazione:

Provalo qui.

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);invece di m.put(c,m.get(c‌​)!=null?(int)m.get(c‌​)+1:1);salvare 3 byte.
Olivier Grégoire

2

Powershell, 63

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

2
È possibile accedere a ciascuna chiave di un hash come proprietà di tale hash, quindi è possibile radere via due caratteri sostituendo ciascuna istanza di $a[$_]con $a.$_. Vedihelp about_hash_tables
goric

2

Script di comando di Windows - 72 byte

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

Uscite:

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

Bello! Piega comunque il caso, ma è sempre sorprendente vedere la reale intelligenza nella programmazione di file batch.
Brian Minton,

2

J, 23 caratteri

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

Formato di output leggermente diverso (la riga 2 è stdin):

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

2

J, 22 caratteri

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

Esempio:

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

Nel nostro caso, se l'input sarà " La definizione di follia sta citando la stessa frase ancora e ancora e non si aspetta la disperazione " .

L'output sarà:

  : 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
La domanda richiede input dalla tastiera, quindi la prima riga dovrebbe essere string str = Console.ReadLine();. Ma questo è il golf del codice, quindi dovrebbe effettivamente esserlo var str=Console.ReadLine();. Gli altri commenti che vorrei fare devono essere sospesi fino a quando OP non risolverà la questione.
Peter Taylor,

Hai ragione, ho modificato la mia risposta.
Aviv,

2

C #: 129

Questa è la risposta di Aviv ma più breve:

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

Questo è mio:

C #: 103

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

Non compilare, è necessario aggiungere circa 50 caratteri per le definizioni usings / namespace / class / method.
Pierre-Luc Pineault,

Oh, non sapevo che fosse obbligatorio, mi dispiace.
Abbas,

2

Python 2 (90 caratteri)

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

Output quando eseguito sulla propria 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.