Отображение количества вхождений для каждого символа во входной строке


21

Код должен принимать строку как ввод с клавиатуры:

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

Все символы ASCII в Юникоде не обязательны, пробелы, кавычки и т. Д. Ввод должен осуществляться с клавиатуры / не констант, атрибутов, вывод должен быть напечатан с новой строкой после каждого символа, как в примере выше, он не должен возвращаться в виде строки или сбрасывается как hashmap / словарь и т. д., так что x : 1и x: 1все в порядке, но {'x':1,...и x:1нет.

В: Функция или полная программа, принимающая стандартный ввод и пишущая стандартный вывод?
A: Код должен быть программой, принимающей ввод с использованием стандартного входа и отображающей результат через стандартный вывод.

Табло:

Самый короткий общий : 5 байтов

Самый короткий общий : 7 байтов


3
Все символы ascii в качестве ввода? Или просто для печати? Или до юникода? Будут ли переводы строки?
Джастин

2
Могу ли я создать функцию или нужна целая программа? Могу ли я вывести все символы ascii и вывести их 0как количество вхождений?
Джастин

16
Является ли формат вывода строгим или достаточно сохранить значение?
Джон Дворак

Ваше изменение не решило мой вопрос.
Джастин

5
Вы не сказали, нужно ли сортировать вывод по алфавиту. Вы не сказали, должен ли быть разделитель " : "(обратите внимание на два пробела после :) или если другие (более короткие) разделители хороши. Вы не обращались к проблеме Unicode / кодирования.
CodesInChaos

Ответы:


2

APL (Dyalog Unicode) , 5 байтов SBCS

Полное тело программы. Запрашивает строку из STDIN и печатает таблицу, разделенную символом новой строки, в STDOUT. Крайний левый столбец - это вводимые символы, а счетчики выровнены по правому краю с наибольшим числом, отделенным от его символа одним пробелом.

,∘≢⌸⍞

Попробуйте онлайн!

 запрос на ввод текста из STDIN

 создать таблицу ключей, состоящую из
, уникального элемента, за
 которым следует
 подсчет индексов его появления (т. е. сколько раз это происходит)


Похоже, что к :сожалению требуется в выводе (вы не можете удалить этот ответ).
Эрик Outgolfer

@EriktheOutgolfer Как вы это выводите? Ясно, что ОП сочла этот ответ приемлемым в соответствии со старым комментарием .
Адам

Еще одна причина для спекуляции в самом вопросе ...
Эрик Outgolfer

15

PHP - 68 (или 39) байт

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

Вывод для примера текста:

  : 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

Если точный вывод не требуется, это будет работать для 39 байтов :

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

Пример вывода:

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
)

где каждый числовой индекс обозначает порядковый номер символа, который он представляет.

Я очень сильно подозреваю, что использование встроенной функции, которая делает именно то, что говорит о проблемной ситуации, вскоре будет запрещено.


$argv[1]вместо fgets(STDIN)сохранения 4 байта.
Тит

14

к ( 8 7)

#:'=0:0

пример

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

редактировать: до семи, H / T Аарон Дэвис

объяснение

Возьмите строку с клавиатуры:

k)0:0
text
"text"

Сгруппируйте отдельные элементы и верните карту, содержащую ключ, так как отдельные символы и значения являются индексами, где встречаются отдельные элементы.

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

Теперь посчитайте значения каждой записи на карте.

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

Довольно невероятно.
Pureferret

:в =:излишни; k)#:'=0:0работает отлично (7 символов). (бонус за знание 0:0, я понятия не имел!)
Аарон Дэвис

Подробное объяснение было бы действительно круто :)
Тимви

qперевод легче понять -count each group read0 0
skeevey

13

Утилиты ядра GNU - 29 22 20 символов (53 с форматированием)

Улучшение Wumpus (20 символов):

fold -1|sort|uniq -c

Улучшение светлячка (22 символа):

grep -o .|sort|uniq -c

оригинал Джоэйтвиддла (29 символов):

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

Первоначально я использовал sedпросто добавить новую строку после каждого символа. В Firefly это улучшилось благодаря тому grep -o ., что -oкаждый сопоставленный шаблон отображает свою собственную строку. Wumpus указал на дальнейшее улучшение, используя fold -1вместо этого. Хорошо сделано!

uniq делает реальную работу, хотя это относится только к отсортированным спискам.

Обратите внимание, что выходной формат не совсем соответствует примеру в вопросе. Это требует последнего прохода, sedчтобы поменять аргументы. (Ожидание ответа на вопрос Яна Дворака, чтобы узнать, требуется ли это ...)

Переформатирование с помощью sed - это «только» еще 33 символа! ( Всего 53 )

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

Awk может почти выполнить работу, добавив только 25 символов, но он скрывает первое место. Глупый awk!

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

Интересно, можно ли сделать улучшения на этапе переформатирования ...


2
Для sed вы можете использовать &для «целого матча» вместо \0, хотя grep -o .и немного короче. Стоит отметить, что вывод команды uniq -cнемного отличается от приведенного в вопросе.
FireFly

О, спасибо тебе! Обновлено. Я не должен забывать grep -o; это полезно.
joeytwiddle

2
fold -1делает то же самое,grep -o .

Круто :) Учимся новым трюкам!
joeytwiddle

1
ptx -S.делает тот же трюк .
Pureferret

7

Ruby 1.9.3: 53 символа

(Основано на комментариях @ shiva и @ daneiro.)

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

Образец прогона:

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

Рубин: 44 символа

Не соблюдая формат вывода:

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

Образец прогона:

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 символаa=gets.strip;a.split('').uniq.each{|x|puts"#{x} : #{a.count(x)}"}
Шива

Зачем strip()? Вопрос гласит: «все персонажи считаются».
manatwork

Ну, получает вернется, \nдаже если вы не собираетесь
Шива

Нет. Возвращается только в том \nслучае, если он действительно был пройден. Передача является побочным эффектом использования здесь-строки. pastebin.com/gCrgk9m1
manatwork

1
Использование $_и угробление aвсе еще хорошо. И c+"...вместо"#{c}...
Даниеро

7

Python 3: 76 символов

76

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

44

(печатать одни и те же символы много раз, см. ответ Васи для правильной версии)

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

45-символьная версия печатает символы более одного раза.
Угорен

Хорошо ... Спасибо, что заметили!
evuez

@evuez Я только что исправил твою версию на 45 символов. Но вы удалили его, поэтому я отправил его еще раз. Вы посмотрите
Васи

6

Perl 6: 21 символ

.say for get.comb.Bag
(РЕПЛ)
>. скажем для get.comb.Bag
Определение безумия цитирует одну и ту же фразу снова и снова и не ожидает отчаяния.
"T" => 1
"h" => 3
"е" => 8
"" => 15
"d" => 4
"f" => 2
"я" => 10
"n" => 10
"t" => 6
"o" => 4
"s" => 5
"а" => 10
"у" => 1
"q" => 1
"и" => 1
"g" => 3
"м" => 1
"p" => 3
"r" => 2
"х" => 1
"с" => 1
"" => 1

5

APL (15)

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

Если вам действительно нужно :, это 19 (но есть и другие, которые его не включают):

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

Выход:

      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

Полусерьезный вопрос - каково это поддерживать устаревший код APL?
Майкл Стерн

@MichaelStern: Понятия не имею, мне никогда не приходилось это делать. Но я предполагаю, что это не хуже, чем поддержание другого унаследованного кода. APL на самом деле довольно легко читать, когда вы к нему привыкли.
Marinus

5

R, 30 символов

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

Пример использования:

> 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 

Отличная идея! Но вопрос говорит, что код должен напечатать результат. Ваш код просто возвращает результат. Я полагаю, вам нужно cat.
Свен Хоэнштайн

@SvenHohenstein ну, это не было указано, когда я ответил (я отвечал до пересмотра 4 вопроса) ... но на самом деле catбудет возвращать только значения, а не имена значений (то есть символы). Так что для этого потребуется более сложное решение.
plannapus

5

Perl 5, 54 символа

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

1
Очень хорошее решение, легко читаемое. Это должно быть sort keys%h, хотя.
Примо

1
Эй, @protist, выглядит хорошо! Я согласен с @primo, хотя! Однако вы можете сохранить два символа, используя $_=<>;s/./$h{$_}++/eg;или map{$h{$_}++}<>=~/./g;вместо этогоmap{$h{$_}++}split//,<>;
Dom Hastings

1
@DomHastings или $h{$_}++for<>=~/./g, что я думаю, может быть оптимальным. Буквальный перевод строки вместо того, \nа также.
Примо

Ах, хорошо, даже лучше! Да, я забыл упомянуть буквальный перевод строки, который стал моим новым любимым -1 байтом!
Дом Гастингс

5

JavaScript

  1. 66 53 байта:

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

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

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

NB. Во всех случаях количество удаленных байтов относится к дополнительному console.log()вызову, который бессмыслен при запуске в консоли. Большое спасибо @imma за отличный улов с -~a[b]и prompt(a={}). Это определенно сэкономило еще несколько байтов.


1
Немного помогает также карта вместо цикла (a [b [i]] || 0) +1 можно уменьшить до - ~ a [b [i]] & console.log, вероятно, может пойти, просто возвращая последнее значение, выдача подсказки (a = {}). split (""). map (function (c) {a [c] = - ~ a [c]}); a
imma

1
Вы можете перейти forна for in- тестирование в пустой вкладке дает те же результаты. Также последнее ;не нужно, таким образом:b=prompt(a={});for(i in b){a[b[i]]=-~a[b[i]]}a
вышла

1
приятно :-) вставьте b = ... в for и смените for {} для a; еще на 2 байта выкл: for (i in b = prompt (a = {})) a [b [i]] = - ~ a [b [i]]; a
imma

хотя им может потребоваться точный вывод текста: - / который возвращает его / меня обратно на 36 (до 79) байт: for (i in b = prompt (a = {})) a [b [i]] = - ~ a [b [i]]; for (n in a) console.log (n + ":" + a [n])
imma

1
@VisioN, только если примитивы перегружены - for inдействительно дает вам функции в SO, но не в пустой вкладке;)
eit 22.01.14

5

Python 2, правильно (58)

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

Выход:

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

Питон 2, стиль гепарда (41)

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

Выход:

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}

Забыл снять скобки после печати во втором, что делает его 41
ToonAlfrink

Вы можете спуститься до 52 символов с первой версией: for l in set(s):print l,":",s.count(l). Для второго, удалив ненужные пробелы, вы выиграете 2 print{l:s.count(l)for l in s}
символа

5

Mathematica, 61 байт

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

Затем появляется это диалоговое окно,

вход

и для примера предложения, производит в качестве вывода

выход


4

питон 3, 49

Кража идеи от evuez

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

вход:

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

приятное улучшение! почему вы не удалите отсортированный ()?
Евес

1
правильно! Во всяком случае, если вы не используете понимание списка, это на 1 символ меньше:for i in sorted(set(t)):print(i,':',t.count(i))
evuez

@evuez Спасибо, я должен был добавить это как комментарий в ваш код. Если вам нравится, вы можете добавить его снова в свое решение (я с радостью удалю это): D
Wasi

Было бы нечестно, я не думал об этом set()! ;)
evuez

4

JavaScript (69 68 символов):

Ожидает sпровести строку.

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

Это отлично следует новым правилам.

Примечание: это предполагает чистую среду, без каких-либо пользовательских свойств на стандартных прототипах объектов.

Изменить: на 1 символ меньше!

Консольный вывод:

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

Старый ответ (44 символа):

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

Это было действительно до изменения правил.

r содержит вывод.


3

Хаскелл, 93

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


3

C # (178 220 символов)

Основываясь на комментарии @ Spongeman, я немного его изменил:

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

не компилируется этот делает: 178 символов. используя System.Linq; используя C = System.Console; класс 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: использование C = System.Console; использование System.Linq; класс F {static void Main () {foreach (var g в C.ReadLine (). GroupBy (c => c) .OrderBy (g => g.Key )) C.WriteLine (g.Key + ":" + g.Count ());}}
Spongman

очевидно, сортировка не нужна, 150: использование C = System.Console; использование System.Linq; класс F {static void Main () {foreach (var g в C.ReadLine (). GroupBy (c => c)) C.WriteLine (g.Key + ":" + g.Count ());}}
Spongman

Вау. Быстрый или совпадение? Вы ответили через секунду после того, как я обновил свой ответ: D Просто заметил, что сортировка не была явно упомянута!
Гидеон

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());}}
Тимви

3

Скриптинг , 19 символов

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

Выход

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

Если вы хотите пробелы вокруг :, измените на 긃똠20 символов.

объяснение

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 с заданным форматированием)

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

Выход:

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

С заданным форматированием это становится:

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

Вы можете отбросить символ, переключившись с конвейерного синтаксиса на несколько вызовов функций:let f s=Seq.countBy id (Seq.sort s)|>Seq.iter(printfn"%A")
goric

На самом деле, зачем вообще сортировать в первую очередь? let f s=Seq.countBy id s|>Seq.iter(printfn"%A")
Горич

3

Математика, 34 29 байт

Не уверен, почему другой ответ Mathematica такой сложный ...;)

Grid@Tally@Characters@Input[]

3

Баш ( 20 15 символов)

 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

Кодировка ASCII теперь поддерживается

Баш (23 символа):

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

Форматирование ASCII не поддерживается


просто из любопытства, тебе действительно нужно | сортировать | здесь, AFAIK ptx уже создаст отсортированный список символов, которые вы можете передать непосредственно в "uniq -c"
zeppelin

@zeppelin немного погуглив, подтверждает, что ты сказал
Pureferret

3

Java 8, 273 253 249 246 239 200 байт

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 байта благодаря @Poke .
-7 байт благодаря @ OlivierGrégoire .

Объяснение:

Попробуй это здесь.

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 байтimport 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));}}}
тыкают

2
m.compute(c,(k,v)->v!=null?(int)v+1:1);вместо того, m.put(c,m.get(c‌​)!=null?(int)m.get(c‌​)+1:1);чтобы сохранить 3 байта.
Оливье Грегуар

2

Powershell, 63

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

2
Каждый ключ в хэш может быть доступен в качестве свойства на этой хэш, так что вы можете сбрить два символа, заменяя каждый экземпляр $a[$_]с $a.$_. Смотритеhelp about_hash_tables
горич

2

Командный скрипт Windows - 72 байта

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

Выходы:

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

Ницца! Хотя это действительно сложный случай, но всегда удивительно видеть фактический ум в программировании пакетных файлов.
Брайан Минтон

2

J, 23 знака

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

Немного другой формат вывода (строка 2 - stdin):

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

2

J, 22 символа

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

Пример:

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

В нашем случае, если вход будет " Определение безумия цитирует одну и ту же фразу снова и снова и не ожидает отчаяния. ».

Выход будет:

  : 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
Вопрос требует ввода с клавиатуры, поэтому первая строка должна быть string str = Console.ReadLine();. Но это код-гольф, так и должно быть var str=Console.ReadLine();. Другие комментарии, которые я хотел бы сделать, должны быть отложены до тех пор, пока ОП не улучшит вопрос.
Питер Тейлор

Вы правы, я отредактировал свой ответ.
Авив

2

C #: 129

Это ответ Авива, но короче:

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 #: 103

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

Не компилируется, нужно добавить около 50 символов для определений usings / namespace / class / method.
Пьер-Люк Пино

О, не знал, что это обязательно, извините.
Аббас

2

Python 2 (90 символов)

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

Вывод при запуске из собственного источника:

  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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.