Afficher le nombre d'occurrences pour chaque caractère d'une chaîne d'entrée

21

Le code doit prendre une chaîne en entrée du clavier:

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

La sortie doit être comme ceci (non triée dans un ordre particulier):

  :  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

Tous les caractères ASCII comptent unicode n'est pas une exigence, les espaces, les guillemets, etc. ou sauvegardé comme hashmap / dictionary etc, donc x : 1et x: 1sont ok, mais {'x':1,...et x:1ne le sont pas.

Q: Fonction ou programme complet prenant stdin et écrivant stdout?
R: Le code doit être un programme prenant l'entrée en utilisant l'entrée standard et affichant le résultat via la sortie standard.

Tableau d'affichage:

Globalement le plus court : 5 octets

Globalement le plus court : 7 octets

Eduard Florinescu
la source
3
Tous les caractères ascii en entrée? Ou tout simplement imprimable? Ou jusqu'à unicode? Y aura-t-il des nouvelles lignes?
Justin
2
Puis-je créer une fonction ou un programme complet est-il nécessaire? Puis-je sortir tous les caractères ascii et imprimer 0en nombre d'occurrences?
Justin
16
Le format de sortie est-il strict ou suffit-il de conserver le sens?
John Dvorak
Votre modification n'a pas répondu à ma question.
Justin
5
Vous n'avez pas dit si la sortie doit être triée par ordre alphabétique. Vous n'avez pas dit si le séparateur doit être " : "(notez les deux espaces après le :) ou si d'autres séparateurs (plus courts) conviennent. Vous n'avez pas résolu le problème unicode / encodage.
CodesInChaos

Réponses:

2

APL (Dyalog Unicode) , 5 octets SBCS

Corps de programme complet. Demande une chaîne de STDIN et imprime la table séparée par des sauts de ligne dans STDOUT. La colonne la plus à gauche est les caractères d'entrée et les nombres sont alignés à droite avec le plus grand nombre séparé de son caractère par un seul espace.

,∘≢⌸⍞

Essayez-le en ligne!

 invite pour la saisie de texte à partir de STDIN

 créer une table de clés constituée de
, l'unique élément suivi
 par
 le décompte des indices de son apparition (il se produit combien de fois)

Adam
la source
Il semble que le :soit malheureusement requis dans la sortie (vous ne pouvez pas supprimer cette réponse).
Erik the Outgolfer
@EriktheOutgolfer Comment déduisez-vous cela? Clairement OP a trouvé cette réponse acceptable, conformément à un vieux commentaire .
Adám
Une autre raison pour laquelle les spécifications sont dans la question elle-même ...
Erik the Outgolfer
15

PHP - 68 (ou 39) octets

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

Sortie pour l'exemple de texte:

  : 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

Si la sortie exacte n'est pas requise, cela fonctionnerait pour 39 octets :

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

Exemple de sortie:

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
)

où chaque index numérique fait référence à la valeur ordinale du caractère qu'il représente.

Je soupçonne très fortement que l'utilisation d'une fonction intégrée qui fait exactement ce que le problème déclare sera bientôt interdite.

primo
la source
$argv[1]au lieu d' fgets(STDIN)enregistrer 4 octets.
Titus
14

k ( 8 7)

#:'=0:0

Exemple

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

edit: Jusqu'à sept, H / T Aaron Davies

Explication

Prenez une chaîne du clavier:

k)0:0
text
"text"

Regroupez les éléments distincts et renvoyez une carte contenant la clé sous forme de caractères et de valeurs distincts qui sont les indices où les éléments distincts se produisent.

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

Comptez maintenant les valeurs de chaque entrée de la carte.

k)#:'=0:0
text
t| 2
e| 1
x| 1
skeevey
la source
Assez incroyable.
Pureferret
l' :en =:est superflu; k)#:'=0:0fonctionne très bien (7 caractères). (bonus pour le savoir 0:0, je n'en avais aucune idée!)
Aaron Davies
Une explication détaillée serait vraiment cool :)
Timwi
qla traduction est plus facile à comprendre -count each group read0 0
skeevey
13

Utilitaires principaux GNU - 29 22 20 caractères (53 avec formatage)

Amélioration de Wumpus (20 caractères):

fold -1|sort|uniq -c

Amélioration de Firefly (22 caractères):

grep -o .|sort|uniq -c

l'original de joeytwiddle (29 caractères):

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

À l'origine, j'avais l'habitude sedd'ajouter simplement une nouvelle ligne après chaque caractère. Firefly a amélioré cela avec grep -o ., car -oaffiche chaque motif correspondant sur sa propre ligne. Wumpus a souligné une autre amélioration en utilisant à la fold -1place. Bon travail!

uniq fait le vrai travail, bien qu'il ne s'applique qu'aux listes triées.

Notez que le format de sortie ne correspond pas exactement à l'exemple de la question. Cela nécessite une analyse finalesed pour échanger les arguments. (En attente d'une réponse à la question de Jan Dvorak pour voir si cela est nécessaire ...)

Le reformatage avec sed est "seulement" encore 33 caractères! ( Total 53 )

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

Awk peut presque faire le travail en ajoutant seulement 25 caractères, mais il cache le premier espace. Stupide awk!

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

Je me demande si des améliorations peuvent être apportées au stade du reformatage ...

joeytwiddle
la source
2
Pour sed, vous pouvez utiliser &pour "match entier" au lieu de \0, bien que ce grep -o .soit encore un peu plus court. Il convient de mentionner que la sortie de uniq -cdiffère légèrement de celle donnée dans la question.
FireFly
Oh merci! Mis à jour. Je ne devrais pas oublier grep -o; c'est utile.
joeytwiddle
2
fold -1fait la même chose quegrep -o .
Génial :) Apprendre de nouveaux trucs!
joeytwiddle
1
ptx -S.fait le même tour .
Pureferret
7

Ruby 1.9.3: 53 caractères

(Basé sur les commentaires de @ shiva et @ daneiro.)

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

Exemple d'exécution:

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 caractères

Ne respectant pas le format de sortie:

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

Exemple d'exécution:

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}
homme au travail
la source
1
63 caractèresa=gets.strip;a.split('').uniq.each{|x|puts"#{x} : #{a.count(x)}"}
Siva
Pourquoi strip()? La question dit, "tous les personnages comptent".
manatwork
Eh bien, les retours reviendront \nmême si vous n'en avez pas l'intention
Siva
Nan. Ne revient que \ns'il a vraiment été adopté. Le passer est un effet secondaire de l'utilisation de here-string. pastebin.com/gCrgk9m1
manatwork
1
Cependant, l' utilisation $_et l'abandon asont toujours valables. Et c+"...au lieu de"#{c}...
daniero
7

Python 3: 76 caractères

76

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

44

(imprimer plusieurs fois les mêmes caractères, voir la réponse de Wasi pour une version valide)

a=input()
for x in a:print(x,':',a.count(x))
evuez
la source
La version 45 caractères imprime les caractères plus d'une fois.
ugoren
D'accord ... Merci d'avoir remarqué!
evuez
@evuez Je viens de corriger votre version de 45 caractères. Mais, vous l'avez supprimé, je l'ai donc soumis à nouveau. Jetez un oeil
Wasi
6

Perl 6: 21 caractères

.say for get.comb.Bag
(REPL)
> .say pour get.comb.Bag
La définition de la folie cite la même phrase encore et encore et ne vous attendez pas au désespoir.
"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
la source
5

APL (15)

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

Si vous en avez vraiment besoin :, c'est 19 (mais il y en a d'autres qui ne l'incluent pas):

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

Sortie:

      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
la source
Question semi-sérieuse - à quoi ressemble la maintenance du code APL hérité?
Michael Stern
@MichaelStern: Aucune idée, je n'ai jamais eu à faire ça. Mais je suppose que ce n'est pas pire que de conserver un autre code hérité. APL est en fait assez facile à lire une fois que vous y êtes habitué.
marinus
5

R, 30 caractères

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

Exemple d'utilisation:

> 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
la source
Bonne idée! Mais la question dit que le code doit imprimer le résultat. Votre code renvoie simplement le résultat. Je suppose que tu en as besoin cat.
Sven Hohenstein le
@SvenHohenstein bien, cela n'a pas été spécifié lorsque j'ai répondu (j'ai répondu avant la révision 4 de la question) ... mais en fait, catje ne retournerai que les valeurs et non les noms de valeurs (c'est-à-dire les caractères). Il faudrait donc une solution plus complexe.
plannapus
5

Perl 5, 54 caractères

map{$h{$_}++}split//,<>;print"$_ : $h{$_}\n"for keys%h
protiste
la source
1
Très belle solution, facile à lire. sort keys%hMais cela devrait être le cas .
primo
1
Hé @protiste, ça a l'air bien! Je suis d'accord avec @primo! Vous pouvez cependant enregistrer deux caractères en utilisant $_=<>;s/./$h{$_}++/eg;ou à la map{$h{$_}++}<>=~/./g;place demap{$h{$_}++}split//,<>;
Dom Hastings
1
@DomHastings ou $h{$_}++for<>=~/./g, qui je pense pourrait être optimal. Newline littéral au lieu de \naussi bien.
primo
Ah bien, encore mieux! Oui, j'ai oublié de mentionner la nouvelle ligne littérale, c'est devenu mon nouveau favori -1 octet!
Dom Hastings du
5

Javascript

  1. 66 53 octets:

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

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

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

NB: Dans tous les cas, le nombre d'octets supprimés fait référence à un console.log()appel supplémentaire qui est inutile s'il est exécuté dans la console. Un grand merci à @imma pour la grande prise avec-~a[b] et prompt(a={}). Cela a certainement permis d'économiser encore plus d'octets.

Vision
la source
1
map au lieu d'une boucle aide un peu aussi (a [b [i]] || 0) +1 peut être réduit à - ~ a [b [i]] & console.log peut probablement aller, juste en retournant la dernière valeur, donnant l'invite (a = {}). split (""). map (fonction (c) {a [c] = - ~ a [c]}); a
imma
1
vous pouvez changer foren for in- le test dans un onglet vide produit les mêmes résultats. En outre, la dernière ;n'est pas nécessaire, donc:b=prompt(a={});for(i in b){a[b[i]]=-~a[b[i]]}a
eithed
1
nice :-) coller le b = ... dans le for & swop le for {}'s for a; pour 2 octets de plus: pour (i dans b = invite (a = {})) a [b [i]] = - ~ a [b [i]]; a
imma
bien qu'ils puissent vouloir une sortie de texte exacte: - / ce qui le / me sauvegarde par 36 (à 79) octets: pour (i dans b = invite (a = {})) a [b [i]] = - ~ a [b [i]]; pour (n dans a) console.log (n + ":" + a [n])
imma
1
@VisioN que si les primitives sont surchargées - en for ineffet vous donne des fonctions en SO, mais pas dans l' onglet vide;)
eithed
5

Python 2, correctement (58)

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

Sortie:

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, style guépard (41)

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

Sortie:

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
la source
J'ai oublié de retirer les crochets après l'impression dans le second, ce qui en fait 41
ToonAlfrink
Vous pouvez descendre à 52 caractères avec votre première version: for l in set(s):print l,":",s.count(l). Pour le second, supprimer les espaces inutiles vous fait gagner 2 caractères:print{l:s.count(l)for l in s}
evuez
5

Mathematica, 61 octets

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

Il apparaît ensuite cette boîte de dialogue,

input

et pour l'exemple de phrase, produit en sortie

output

Michael Stern
la source
4

python 3, 49

Voler l' idée d' Evuez

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

contribution:

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

production:

  :  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
Étais-je
la source
belle amélioration! pourquoi ne supprimez-vous pas le sorted ()?
evuez
1
droite! de toute façon, si vous n'utilisez pas une compréhension de liste, c'est 1 caractère de moins:for i in sorted(set(t)):print(i,':',t.count(i))
evuez
@evuez Merci, je devais l'ajouter comme commentaire dans votre code. Si vous le souhaitez, vous pouvez l'ajouter à nouveau dans votre solution (je supprimerai volontiers celle-ci): D
Wasi
Ce ne serait pas juste, je n'y avais pas pensé set()! ;)
evuez
4

JavaScript (69 68 caractères):

S'attend sà contenir la chaîne.

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

Cela suit parfaitement les nouvelles règles.

Remarque: cela suppose un environnement propre, sans propriétés personnalisées sur les prototypes d'objet standard.

Éditer: 1 caractère de moins!

Sortie 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

Ancienne réponse (44 caractères):

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

C'était valable avant que les règles ne changent.

r contient la sortie.

Brosse à dents
la source
3

Haskell, 93

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

PowerShell (49)

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

C # (178 220 caractères)

Sur la base du commentaire de @ Spongeman, je l'ai changé un peu:

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])));}}
gédéon
la source
ne compile pas. celui-ci fait: 178 caractères. 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: en utilisant C = System.Console; en utilisant System.Linq; classe F {static void Main () {foreach (var g dans C.ReadLine (). GroupBy (c => c) .OrderBy (g => g.Key )) C.WriteLine (g.Key + ":" + g.Count ());}}
Spongman
apparemment, le tri n'est pas nécessaire, 150: en utilisant C = System.Console; en utilisant System.Linq; classe F {static void Main () {foreach (var g dans C.ReadLine (). GroupBy (c => c)) C.WriteLine (g.Key + ":" + g.Count ());}}
Spongman
Sensationnel. Rapide ou coïncidence? Vous avez répondu juste une seconde après avoir mis à jour ma réponse: D Je viens de remarquer que le tri n'était pas explicitement mentionné!
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 caractères

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

Production

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

Si vous voulez les espaces autour de :, changez en 긃똠, ce qui en fait 20 caractères.

Explication

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
la source
3

F # ( 66 59 49, 72 avec formatage prescrit)

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

Sortie:

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

Avec le formatage prescrit, il devient:

let f s=s|>Seq.countBy(id)|>Seq.iter(fun(a,b)->printfn"\"%c\" :  %d"a b)
Rik
la source
Vous pouvez supprimer un caractère en let f s=Seq.countBy id (Seq.sort s)|>Seq.iter(printfn"%A")
quittant
En fait, pourquoi même trier en premier lieu? let f s=Seq.countBy id s|>Seq.iter(printfn"%A")
Goric
3

Mathematica, 34 29 octets

Je ne sais pas pourquoi l'autre réponse Mathematica est si compliquée ...;)

Grid@Tally@Characters@Input[]
Martin Ender
la source
3

Bash ( 20 15 caractères)

 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

Encodage ASCII désormais pris en charge

Bash (23 caractères):

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

Formatage ASCII non pris en charge

Pureferret
la source
juste par curiosité, avez-vous vraiment besoin de | trier | ici, AFAIK ptx produira déjà une liste triée de caractères que vous pouvez alimenter directement dans "uniq -c"
zeppelin
@zeppelin un peu googler confirme ce que vous avez dit
Pureferret
3

Java 8, 273 253 249 246 239 200 octets

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 octets grâce à @Poke .
-7 octets grâce à @ OlivierGrégoire .

Explication:

Essayez-le ici.

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
la source
249 octetsimport 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);au lieu d' m.put(c,m.get(c‌​)!=null?(int)m.get(c‌​)+1:1);enregistrer 3 octets.
Olivier Grégoire
2

Powershell, 63

$a=@{};[char[]](read-host)|%{$a[$_]++};$a.Keys|%{"$_ :"+$a[$_]}
Danko Durbić
la source
2
Chaque clé d'un hachage est accessible en tant que propriété sur ce hachage, vous pouvez donc raser deux caractères en remplaçant chaque instance de $a[$_]par $a.$_. Voirhelp about_hash_tables
goric
2

Script de commande Windows - 72 octets

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

Les sorties:

\=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
la source
Agréable! Il plie cependant, mais il est toujours étonnant de voir l'habileté réelle dans la programmation de fichiers batch.
Brian Minton
2

J, 23 caractères

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

Format de sortie légèrement différent (la ligne 2 est stdin):

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

J, 22 caractères

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

Exemple:

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

Dans notre cas, si l'entrée sera " La définition de la folie cite la même phrase encore et encore et ne s'attend pas au désespoir. "

La sortie sera:

  : 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
la source
1
La question demande l'entrée du clavier, donc la première ligne devrait être string str = Console.ReadLine();. Mais c'est du code-golf donc ça devrait l'être var str=Console.ReadLine();. Les autres commentaires que je voudrais faire doivent être suspendus jusqu'à ce que OP améliore la question.
Peter Taylor
Vous avez raison, j'ai modifié ma réponse.
Aviv
2

C #: 129

C'est la réponse d'Aviv mais plus courte:

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'est à moi:

C #: 103

foreach(var g in Console.ReadLine().OrderBy(o=>o).GroupBy(c=>c))Console.WriteLine(g.Key+":"+g.Count());
Abbas
la source
Ne compile pas, il faut ajouter environ 50 caractères pour les définitions des usages / espaces de noms / classes / méthodes.
Pierre-Luc Pineault du
Oh, je ne savais pas que c'était obligatoire, je suis désolé.
Abbas
2

Python 2 (90 caractères)

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

Sortie lorsqu'il est exécuté sur sa propre source:

  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
la source