Я хочу создать def, который подсчитывает количество уникальных символов в строке [...]
Вы можете получить символы строки с помощью String#each_char
и иметь Enumerable#tally
подсчитывать вхождения: (tally
требуется Ruby 2,7)
alphabet.each_char.tally
#=> {
# "A"=>2, "B"=>3, "C"=>4, "D"=>5, "E"=>1, "F"=>1, "G"=>1,
# "H"=>1, "I"=>1, "J"=>1, "K"=>1, "L"=>1, "M"=>1, "N"=>1,
# "O"=>1, "P"=>1, "Q"=>1, "R"=>1, "S"=>1, "T"=>1, "U"=>1,
# "V"=>1, "W"=>1, "X"=>1, "Y"=>1, "Z"=>6
# }
Чтобы получить проценты, вы просто делите вхождения в символы на общее количество количество символов, например:
hash = alphabet.each_char.tally
hash.each do |char, count|
q = count.quo(hash.size)
puts format(" %s | %d | %4.1f%%", char, count, q * 100)
end
Вывод:
A | 2 | 7.7%
B | 3 | 11.5%
C | 4 | 15.4%
D | 5 | 19.2%
E | 1 | 3.8%
F | 1 | 3.8%
G | 1 | 3.8%
H | 1 | 3.8%
I | 1 | 3.8%
J | 1 | 3.8%
K | 1 | 3.8%
L | 1 | 3.8%
M | 1 | 3.8%
N | 1 | 3.8%
O | 1 | 3.8%
P | 1 | 3.8%
Q | 1 | 3.8%
R | 1 | 3.8%
S | 1 | 3.8%
T | 1 | 3.8%
U | 1 | 3.8%
V | 1 | 3.8%
W | 1 | 3.8%
X | 1 | 3.8%
Y | 1 | 3.8%
Z | 6 | 23.1%
Вместо hash.size
(количество уникальных символов) вы также можете разделить на alphabet.size
(количество символов в строка), в зависимости от того, что вы хотите.