Відобразити кількість входів для кожного символу у рядок введення


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 підраховуються unicode - це не вимога, пробіли, лапки та ін., А вхід повинен надходити з клавіатури / не констант, атрибутів, вихідних даних слід друкувати новим рядком після кожного символу, як у наведеному вище прикладі, він не повинен повертатися як рядок або скидали в HashMap / словник і т.д., так x : 1і x: 1в порядку, але {'x':1,...і x:1не є.

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

Табло:

Найкоротший загальний : 5 байт

Найкоротший загальний : 7 байт


3
Всі символи ascii як вхідні дані? Або просто для друку? Або до unicode? Чи будуть нові лінії?
Джастін

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

16
Чи чіткий формат виводу, чи достатньо для збереження сенсу?
Джон Дворак

Ваша редакція не стосувалася мого питання.
Джастін

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

Відповіді:


2

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

Повний орган програми. Запрошує рядок з STDIN і друкує таблицю, відокремлену в новому рядку, на STDOUT. Найменше лівий стовпець - це вхідні символи, і підрахунки вирівнюються правою мірою, найбільша кількість відокремлена від його символу одним пробілом.

,∘≢⌸⍞

Спробуйте в Інтернеті!

 запит на введення тексту з STDIN

 Таблиця створити " ключі , що складається з
, унікального елемента з подальшим
 шляхом
 підведення підсумків показників його виникнення (тобто скільки разів це відбувається)


Схоже, :на виході потрібен висновок (цю відповідь ви не можете видалити).
Ерік Аутгольфер

@EriktheOutgolfer Як це зробити? Очевидно, що ОП визнала цю відповідь прийнятною відповідно до старого коментаря .
Адам

Ще одна причина для специфіки - у самому питанні ...
Ерік Попечитель

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

k ( 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 Aaron Davies

Пояснення

Візьміть рядок з клавіатури:

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, що я про це знав , я не мав уявлення!)
Аарон Девіс

Детальне пояснення було б дуже класно :)
Timwi

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

оригінал joeytwiddle (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 '{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

Рубін 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

Ruby: 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()? У запитанні сказано: "всі символи рахуються".
манатурка

Ну, повернеться, \nнавіть якщо ви цього не збираєтесь
Сіва

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

1
Використання $_та вибивання aвсе ще звучать. І c+"...замість цього"#{c}...
daniero

7

Пітон 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
(REPL)
>. Скажіть для get.comb.Bag
Визначення божевілля цитує одну і ту ж фразу знову і знову і не очікує відчаю.
"T" => 1
"h" => 3
"е" => 8
"" => 15
"d" => 4
"f" => 2
"i" => 10
"n" => 10
"t" => 6
"o" => 4
"s" => 5
"a" => 10
"у" => 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←⍞

Якщо вам справді потрібен :, це 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поверне значення лише не іменам значень (тобто символам). Тож знадобиться більш складне рішення.
планнапус

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},{})
    

Примітка: У всіх випадках видалене число байтів стосується додаткового 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
eithed

1
приємно :-) вставте b = ... у & для перестановки для {} s для; ще 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, але не в порожній вкладці;)
eithed

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

Математика, 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

приємного поліпшення! чому ви не видалите сортовану ()?
evuez

1
правильно! у будь-якому випадку, якщо ви не використовуєте розуміння списку, це на 1 char менше: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 {статичний недійсний Main () {C.WriteLine (string.Join ("\ n", C.ReadLine (). GroupBy (c => c). Виберіть ( g => g.Key + ":" + g.Count ()). OrderBy (s => s)));}}
Spongman

168: використання C = System.Console; використання System.Linq; клас F {статичний недійсний 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 {статична порожнеча 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")
goric

3

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

Не впевнений, чому інша відповідь Mathematica настільки складна ...;)

Grid@Tally@Characters@Input[]

3

Bash ( 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 тепер підтримується

Bash (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

Ява 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));}}}
Poke

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
goric

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 / space names / 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.