Adam Groves wrote:
> Hi there,
>
> I'm trying to write a class which converts a number into letters like
> so:
> 0  => -
> 1  => A
> 10 => J
> 27 => AA
>
>
> .. ad infinitum. My class looks like this at the moment (please don't
> laugh!)
>
> def letter(number)
>   @index = number - 1
>   if @index == 0
>     return "-"
>   end
>   @index_string = ""
>   @index_array= []
>   while @index > 0 do
>     @remainder = @index%27
>     @index_array << @remainder
>     @index = @index/27
>   end
>   @index_array
>   @index_array.each do |i|
>   # I'm sure there's a better way to do this
>    @alphabet =
> ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"]
>     @index_string << @alphabet[i-1]
>   end
>   return @index_string.reverse!
> end
>
> This works fine for the first round: 26 returns "Z". But 27 returns "AZ"
> because @index_array is [0,1]. I'd appreciate any help (and tips on how
> to write tighter code!)
>
>
> --
> Posted via http://www.ruby-forum.com/.


def letter( n )
  return "-"   if n == 0

  result = n.to_s(27)
  i = 0
  while i < result.size - 1
    inc = result[-i-2,1].to_i(27)
    inc += 1   if inc + result[-1,1].to_i(27) > 26
    n += 27**i * inc
    result = n.to_s(27)
    i += 1
  end

  result.tr(((1..9).to_a + ('a'..'q').to_a).join,
             ('A'..'Z').to_a.join )
end