# sortByFrequency — counts how often each letter appears and returns a sorted list
def sort_by_frequency(s)
# Create a frequency array for 26 lowercase letters, initialized to 0
freq = Array.new(26, 0)
# Iterate through the string and count only alphabetic characters
s.each_char do |c|
if c =~ /[A-Za-z]/
lower = c.downcase
index = lower.ord - 'a'.ord
freq[index] += 1
end
end
# Build an array of [letter, frequency] pairs
result = []
26.times do |i|
result << [("a".ord + i).chr, freq[i]]
end
# Sort pairs by frequency in descending order
result.sort_by! { |letter, count| -count }
result
end
# Build a string sorted by frequency: ddddddddddddccccccbbbbbaaaafffeehhgs
def build_sorted_string(sorted)
out = ""
sorted.each do |letter, count|
# append 'letter' repeated count times
out << letter * count if count > 0
end
out
end
# Input text to analyze
text = "bbcabddddccafffadbbcdccsedddddhhgade"
# Get sorted frequency list
sorted = sort_by_frequency(text)
# Print each letter and its frequency
sorted.each do |letter, count|
puts "#{letter}: #{count}" if count != 0
end
# Print the reconstructed sorted string
letters_sorted_by_frequency = build_sorted_string(sorted)
puts "\nSorted string: #{letters_sorted_by_frequency}"
=begin
run:
d: 12
c: 6
b: 5
a: 4
f: 3
e: 2
h: 2
g: 1
s: 1
Sorted string: ddddddddddddccccccbbbbbaaaafffeehhgs
=end