How to sort a string in the order: lowercase letters - uppercase letters - odd digits - even digits in Ruby

1 Answer

0 votes
=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

 



answered Jul 14 by avibootz

Related questions

...