Wyświetl liczbę wystąpień każdego znaku w ciągu wejściowym


21

Kod powinien pobierać ciąg znaków jako dane wejściowe z klawiatury:

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

Dane wyjściowe powinny wyglądać następująco (nie posortowane w określonej kolejności):

  :  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

Wszystkie znaki ASCII liczą się jako Unicode, spacje, cudzysłowy itp., A dane wejściowe powinny pochodzić z klawiatury / nie stałych, atrybutów, dane wyjściowe powinny być drukowane z nowym wierszem po każdym znaku, jak w powyższym przykładzie, nie należy zwracać go jako łańcucha lub składować jako HashMap / słownik etc, tak x : 1i x: 1są ok, ale {'x':1,...i x:1nie są.

P: Funkcja lub pełny program przyjmuje standardowe wejście i pisze standardowe wyjście?
Odp .: Kod musi być programem pobierającym dane wejściowe przy użyciu standardowego wejścia i wyświetlać wynik poprzez standardowe wyjście.

Tablica wyników:

Najkrótszy ogólnie : 5 bajtów

Najkrótszy ogólnie : 7 bajtów


3
Wszystkie znaki ascii jako dane wejściowe? A może po prostu do wydruku? A może do Unicode? Czy pojawią się nowe linie?
Justin

2
Czy mogę utworzyć funkcję lub czy potrzebny jest cały program? Czy mogę wypisać wszystkie znaki ascii i wydrukować 0jako liczbę wystąpień?
Justin

16
Czy format wyjściowy jest ścisły, czy wystarczy, aby zachować znaczenie?
John Dvorak

Twoja edycja nie rozwiązała mojego pytania.
Justin

5
Nie powiedziałeś, czy dane wyjściowe muszą być sortowane alfabetycznie. Nie powiedziałeś, czy separator musi być " : "(zwróć uwagę na dwie spacje po :) lub czy inne (krótsze) separatory są w porządku. Nie rozwiązałeś problemu z kodowaniem Unicode.
CodesInChaos

Odpowiedzi:


2

APL (Dyalog Unicode) , 5 bajtów SBCS

Pełna treść programu. Monituje o ciąg znaków ze STDIN i drukuje tabelę oddzieloną znakiem nowej linii do STDOUT. Kolumna najbardziej po lewej to znaki wejściowe, a liczby są wyrównane do prawej, a największa liczba oddzielona jest od znaku pojedynczą spacją.

,∘≢⌸⍞

Wypróbuj online!

 monit o wprowadzenie tekstu z STDIN

 utwórz tabelę kluczy składającą się z
, unikalnego elementu, po
 którym
 następuje suma wskaźników jego występowania (tj. ile razy występuje)


Wygląda na :to, że jest niestety wymagane w danych wyjściowych (nie można usunąć tej odpowiedzi).
Erik the Outgolfer

@EriktheOutgolfer Jak to wywnioskować? Najwyraźniej OP uznał tę odpowiedź za akceptowalną, zgodnie ze starym komentarzem .
Adám

Kolejny powód, dla którego specyfikacja ma znajdować się w samym pytaniu ...
Erik Outgolfer

15

PHP - 68 (lub 39) bajtów

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

Dane wyjściowe dla przykładowego tekstu:

  : 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

Jeśli dokładne dane wyjściowe nie są wymagane, działałoby to dla 39 bajtów :

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

Przykładowe dane wyjściowe:

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
)

gdzie każdy indeks liczbowy odnosi się do wartości porządkowej znaku, który reprezentuje.

Podejrzewam bardzo mocno, że użycie wbudowanej funkcji, która robi dokładnie to, co stany problemowe, wkrótce zostanie niedozwolone.


$argv[1]zamiast fgets(STDIN)zapisuje 4 bajty.
Tytus

14

k ( 8 7)

#:'=0:0

Przykład

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

edycja: Do siedmiu, H / T Aaron Davies

Wyjaśnienie

Weź ciąg z klawiatury:

k)0:0
text
"text"

Pogrupuj różne elementy i zwróć mapę zawierającą klucz, ponieważ różne znaki i wartości to wskaźniki, w których występują różne elementy.

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

Teraz policz wartości każdego wpisu na mapie.

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

Całkiem niewiarygodne.
Pureferret

:w =:jest zbędny; k)#:'=0:0działa dobrze (7 znaków). (premia za znajomość 0:0, nie miałem pojęcia!)
Aaron Davies

Szczegółowe wyjaśnienie byłoby naprawdę fajne :)
Timwi

qtłumaczenie jest łatwiejsze do zrozumienia -count each group read0 0
skeevey

13

Narzędzia podstawowe GNU - 29 22 20 znaków (53 z formatowaniem)

Ulepszenie Wumpusa (20 znaków):

fold -1|sort|uniq -c

Ulepszenie Firefly (22 znaki):

grep -o .|sort|uniq -c

oryginał joeytwiddle (29 znaków):

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

Pierwotnie zwykłem seddodawać nowy wiersz po każdym znaku. Firefly poprawił to grep -o ., ponieważ -owyświetla każdy dopasowany wzór na swojej linii. Wumpus wskazał na dalszą poprawę przy użyciu fold -1zamiast tego. Dobra robota!

uniq wykonuje prawdziwą pracę, chociaż dotyczy tylko posortowanych list.

Zauważ, że format wyjściowy nie pasuje dokładnie do przykładu w pytaniu. Wymaga to ostatniego przejścia seddo wymiany argumentów. (Czekam na odpowiedź na pytanie Jana Dvoraka, aby sprawdzić, czy jest to wymagane ...)

Ponowne formatowanie za pomocą sed to „tylko” kolejne 33 znaki! ( Łącznie 53 )

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

Awk może prawie wykonać zadanie, dodając tylko 25 znaków, ale ukrywa pierwsze miejsce. Głupi awk!

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

Zastanawiam się, czy można wprowadzić ulepszenia na etapie ponownego formatowania ...


2
W przypadku sed możesz użyć &zamiast tego „całego meczu” \0, choć grep -o .jest on jeszcze nieco krótszy. Warto wspomnieć, że wynik uniq -cróżni się nieznacznie od podanego w pytaniu.
FireFly

Och dziękuję! Zaktualizowano Nie powinienem zapomnieć grep -o; to jest przydatne.
joeytwiddle

2
fold -1robi to samo cogrep -o .

Wspaniale :) Ucz się nowych sztuczek!
joeytwiddle

1
ptx -S.robi tę samą sztuczkę .
Pureferret

7

Ruby 1.9.3: 53 znaków

(Na podstawie komentarzy @ shiva i @ daneiro.)

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

Przykładowy przebieg:

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 znaki

Nie przestrzegając formatu wyjściowego:

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

Przykładowy przebieg:

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

Dlaczego strip()? Pytanie brzmi: „wszystkie znaki się liczą”.
manatwork

Cóż, get wróci, \nnawet jeśli nie masz zamiaru
Siva

Nie. Zwraca tylko \nwtedy, gdy zostało naprawdę przekazane. Przekazywanie jest efektem ubocznym używania ciąg-tutaj. pastebin.com/gCrgk9m1
manatwork

1
Używanie $_i porzucanie ajest jednak nadal uzasadnione. I c+"...zamiast"#{c}...
daniero

7

Python 3: 76 znaków

76

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

44

(drukuj te same znaki wiele razy, zobacz poprawną wersję , patrz odpowiedź Wasi )

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

Wersja 45 znaków drukuje znaki więcej niż jeden raz.
ugoren

Racja ... Dzięki za zauważenie!
evuez

@evuez Właśnie naprawiłem twoją wersję 45 znaków. Ale usunąłeś go, więc przesłałem go jeszcze raz. Mają wygląd
Wasi

6

Perl 6: 21 znaków

.say for get.comb.Bag
(REPL)
> .powiedz o get.comb.Bag
Definicja szaleństwa wciąż powtarza to samo zdanie i nie należy oczekiwać rozpaczy.
„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←⍞

Jeśli naprawdę potrzebujesz :, jest 19 (ale są też inni, którzy tego nie uwzględniają):

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

Wydajność:

      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

Półpoważne pytanie - jak to jest zachować starszy kod APL?
Michael Stern

@MichaelStern: Nie mam pojęcia, nigdy nie musiałem tego robić. Ale sądzę, że nie jest to gorsze niż utrzymanie innego starszego kodu. APL jest dość łatwy do odczytania, gdy się do niego przyzwyczaisz.
marinus

5

R, 30 znaków

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

Przykładowe użycie:

> 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 

Dobry pomysł! Ale pytanie mówi, że kod musi wydrukować wynik. Twój kod po prostu zwraca wynik. Przypuszczam, że potrzebujesz cat.
Sven Hohenstein

@ SvenHohenstein dobrze nie zostało określone, kiedy odpowiedziałem (odpowiedziałem przed wersją 4 pytania) ... ale w rzeczywistości catzwróci tylko wartości, a nie nazwy wartości (tj. Znaki). Potrzebowałoby to bardziej złożonego rozwiązania.
plannapus

5

Perl 5, 54 znaków

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

1
Bardzo fajne rozwiązanie, łatwe do odczytania. Ale tak musiało być sort keys%h.
primo

1
Hej @protist, wygląda dobrze! Zgadzam się z @primo! Możesz jednak zapisać dwa znaki przy użyciu $_=<>;s/./$h{$_}++/eg;lub map{$h{$_}++}<>=~/./g;zamiastmap{$h{$_}++}split//,<>;
Dom Hastings

1
@DomHastings lub $h{$_}++for<>=~/./g, które moim zdaniem mogą być optymalne. Dosłownie nowa linia zamiast \n.
primo

Ach miło, jeszcze lepiej! Tak, zapomniałem wspomnieć o dosłownym nowym wierszu, który stał się moim nowym ulubionym bajtem -1!
Dom Hastings

5

JavaScript

  1. 66 53 bajty:

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

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

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

Uwaga: We wszystkich przypadkach usunięta liczba bajtów odnosi się do dodatkowego console.log()wywołania, które nie ma sensu, jeśli jest uruchamiane w konsoli. Ogromne podziękowania dla @imma za wspaniały połów z -~a[b]i prompt(a={}). To zdecydowanie zaoszczędziło trochę więcej bajtów.


1
map zamiast pętli pomóż trochę również (a [b [i]] || 0) +1 można zmniejszyć do - ~ a [b [i]] i console.log prawdopodobnie pójdzie, po prostu zwracając ostatnią wartość, podając monit (a = {}). split (""). map (funkcja (c) {a [c] = - ~ a [c]}); a
imma

1
możesz zmienić forna for in- testowanie w pustej zakładce daje te same wyniki. Ostatni też ;nie jest potrzebny, dlatego:b=prompt(a={});for(i in b){a[b[i]]=-~a[b[i]]}a
wyjechał

1
nice :-) włóż b = ... do for & swop for for {} dla a; dla kolejnych 2 bajtów off: for (i in b = zachęta (a = {})) a [b [i]] = - ~ a [b [i]]; a
imma

chociaż mogą chcieć uzyskać dokładny tekst: - / co powoduje powrót do niego / mnie o 36 (do 79) bajtów: for (i in b = prompt (a = {})) a [b [i]] = - ~ a [b [i]]; for (n in a) console.log (n + ":" + a [n])
imma

1
@VisioN tylko wtedy, gdy prymitywy są przeciążone - for infaktycznie daje ci funkcje w SO, ale nie w pustej zakładce;)
wyszedł

5

Python 2, poprawnie (58)

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

Wydajność:

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, styl geparda (41)

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

Wydajność:

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}

Zapomniałem usunąć nawiasy po wydrukowaniu w drugim, co czyni go 41
ToonAlfrink

Można zejść do 52 znaków ze swojej pierwszej wersji: for l in set(s):print l,":",s.count(l). Po drugie, usunięcie niepotrzebnych spacji powoduje, że wygrywasz 2 znaki:print{l:s.count(l)for l in s}
evuez

5

Mathematica, 61 bajtów

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

Następnie pojawia się to okno dialogowe,

input

a dla przykładowego zdania tworzy jako wynik

output


4

python 3, 49

Kradzież pomysłu z evuez

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

wkład:

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

wydajność:

  :  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

niezła poprawa! dlaczego nie usuniesz sorted ()?
evuez

1
dobrze! tak czy inaczej, jeśli nie używasz rozumienia listy, to jest o 1 znak mniej:for i in sorted(set(t)):print(i,':',t.count(i))
evuez

@evuez Dzięki, miałem dodać go jako komentarz w twoim kodzie. Jeśli chcesz, możesz dodać go ponownie w swoim rozwiązaniu (chętnie go usunę): D
Wasi

To niesprawiedliwe, nie myślałem o tym set()! ;)
evuez

4

JavaScript (69 68 znaków):

Oczekuje, sże utrzyma ciąg.

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

Jest to zgodne z nowymi zasadami doskonale.

Uwaga: Zakłada to czyste środowisko, bez żadnych niestandardowych właściwości na standardowych prototypach obiektów.

Edycja: 1 postać mniej!

Dane wyjściowe konsoli:

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

Stara odpowiedź (44 znaki):

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

Było to ważne przed zmianą reguł.

r zawiera wynik.


3

Haskell, 93

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


3

C # (178 220 znaków)

Na podstawie komentarza @ Spongeman nieco go zmieniłem:

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

nie kompiluje się. ten robi: 178 znaków. using System.Linq; using C = System.Console; klasa F {static void Main () {C.WriteLine (string.Join ("\ n", C.ReadLine (). GroupBy (c => c). Wybierz ( g => g.Key + ":" + g.Count ()). OrderBy (s => s)));}}
Spongman

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

najwyraźniej sortowanie nie jest konieczne, 150: użycie C = System.Console; użycie System.Linq; klasa F {static void Main () {foreach (var g w C.ReadLine (). GroupBy (c => c)) C.WriteLine (g.Key + ":" + g.Count ());}}
Spongman

Łał. Szybki czy zbieg okoliczności? Odpowiedziałeś sekundę po tym, jak zaktualizowałem moją odpowiedź: D Właśnie zauważyłem, że sortowanie nie zostało wyraźnie wymienione!
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 znaków

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

Wydajność

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

Jeśli chcesz spacje wokół :, zmień na 긃똠, tworząc 20 znaków.

Wyjaśnienie

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 z przepisanym formatowaniem)

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

Wydajność:

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

Przy przepisanym formatowaniu staje się:

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

Możesz upuścić postać, wyłączając potokową składnię dla kilku wywołań funkcji:let f s=Seq.countBy id (Seq.sort s)|>Seq.iter(printfn"%A")
goric

W rzeczywistości, po co w ogóle sortować? let f s=Seq.countBy id s|>Seq.iter(printfn"%A")
goric

3

Matematyka, 34 29 bajtów

Nie jestem pewien, dlaczego inna odpowiedź Mathematica jest tak skomplikowana ...;)

Grid@Tally@Characters@Input[]

3

Bash ( 20 15 znaków)

 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

Obsługiwane jest teraz kodowanie ASCII

Bash (23 znaki):

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

Formatowanie ASCII nie jest obsługiwane


tylko z ciekawości, czy naprawdę potrzebujesz | sortować | tutaj AFAIK ptx utworzy już posortowaną listę znaków, które możesz podać bezpośrednio do „uniq -c”
zeppelin

@zeppelin trochę googlujących potwierdzających to, co powiedziałeś
Pureferret,

3

Java 8, 273 253 249 246 239 200 bajtów

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 bajty dzięki @Poke .
-7 bajtów dzięki @ OlivierGrégoire .

Wyjaśnienie:

Wypróbuj tutaj.

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 bajtówimport 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);zamiast m.put(c,m.get(c‌​)!=null?(int)m.get(c‌​)+1:1);zapisać 3 bajty.
Olivier Grégoire

2

PowerShell, 63

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

2
Każdy klucz w hash mogą być dostępne jako własność na tym hash, więc można golić dwa znaki zastępując każde wystąpienie $a[$_]z $a.$_. Zobaczhelp about_hash_tables
goric

2

Skrypt poleceń systemu Windows - 72 bajty

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

Wyjścia:

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

Miły! Jednak rozkłada wielkość liter, ale zawsze niesamowite jest sprytne programowanie plików wsadowych.
Brian Minton

2

J, 23 znaki

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

Nieco inny format wyjściowy (wiersz 2 to stdin):

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

2

J, 22 znaki

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

Przykład:

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

DO#

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.

W naszym przypadku, jeśli wejście będzie „ Definicja szaleństwa powtarza to samo zdanie wielokrotnie i nie oczekuje rozpaczy. ”.

Wyjście będzie:

  : 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
Pytanie wymaga wprowadzenia danych z klawiatury, więc pierwszy wiersz powinien być string str = Console.ReadLine();. Ale to jest golf golfowy, więc tak powinno być var str=Console.ReadLine();. Pozostałe komentarze, które chciałbym przedstawić, muszą zostać zawieszone, dopóki OP nie poprawi pytania.
Peter Taylor

Masz rację, zredagowałem moją odpowiedź.
Aviv

2

C #: 129

To jest odpowiedź Avivs, ale krótsza:

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

To jest moje:

C #: 103

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

Nie kompiluje się, trzeba dodać około 50 znaków dla definicji usings / namespace / class / method.
Pierre-Luc Pineault

Och, nie wiedziałem, że to obowiązkowe, przepraszam.
Abbas,

2

Python 2 (90 znaków)

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

Dane wyjściowe po uruchomieniu na własnym źródle:

  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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.