=begin
We want to sort characters in this strict order:
1. lowercase letters (a–z)
2. uppercase letters (A–Z)
3. odd digits (1,3,5,7,9)
4. even digits (0,2,4,6,8)
Strategy:
---------
Assign each character a "category rank" and sort by:
(category rank, natural character order)
Ruby's Array#sort with a custom block
is the idiomatic and efficient way to do this.
=end
# Returns category rank for sorting.
# Lower rank = comes earlier.
def category(c)
if c =~ /[a-z]/
0 # lowercase
elsif c =~ /[A-Z]/
1 # uppercase
elsif c =~ /\d/
d = c.to_i
d.odd? ? 2 : 3 # odd digits → 2, even digits → 3
else
4 # fallback (should not happen for alphanumeric input)
end
end
# Sort characters using a tuple key:
# [category rank, natural character order]
def sort_alphanumeric(s)
s.chars.sort_by { |ch| [category(ch), ch] }.join
end
# Usage
s = "a2B3cD8f1Z0"
result = sort_alphanumeric(s)
puts "Sorted result: #{result}"
=begin
run:
Sorted result: acfBDZ13028
=end