15 de dezembro de 2006

Ubuntu Forums - desafio de programação semanal (15/12)

O desafio dessa semana promovido pelo Ubuntu Forums (aka fórum gringo) é um pouco mais complexo do que o passado, o problema dessa vez é escrever um programa que leia um número, por exemplo 12984 e imprima na tela twelve thousand nine hundred eighty-four.

O tempo foi passando e não apareceram muitas respostas, talvez por ser mais trabalhoso, não sei ao certo, mas dessa vez eu resolvi participar. As primeiras respostas foram em C++ e Python respectivamente, então para variar um pouco eu resolvi escrever um programa em Ruby para solucionar o desafio.

Minha solução para o problema foi a seguinte:

=begin
This program convert a number to words

Yuri Malheiros
December, 15th 2006
=end

class Number
def initialize(x)
@words = {
0 => 'zero', 1 => 'one', 2 => 'two', 3 => 'three',
4 => 'four', 5 => 'five', 6 => 'six', 7 => 'seven',
8 => 'eight', 9 => 'nine', 10 => 'ten', 11 => 'eleven',
12 => 'twelve', 13 => 'thirteen', 14 => 'fourteen', 15 => 'fifteen',
16 => 'sixteen', 17 => 'seventeen', 18 => 'eighteen', 19 => 'nineteen',
20 => 'twenty', 30 => 'thirty', 40 => 'forty', 50 => 'fifty',
60 => 'sixty', 70 => 'seventy', 80 => 'eighty', 90 => 'ninety',
}

@number = x
end

def string_hundred(x)
result = ''

if (x/100) >= 1 && (x/100) <= 9
result << @words[x/100] << ' hundred '
end

if (x % 100) >= 1 && (x % 100) <= 20
result << @words[x%100]
elsif (x%100/10*10) != 0
result << @words[x%100/10*10]
if (x%10) > 0
result << '-' << @words[x%10]
end
end

return result
end

def to_s
result = ''
thousands = @number % 10**6 / 1000
millions = @number % 10**9 / 10**6

if @number == 0
result << @words[0]
end

if millions >= 1 && millions <= 999
result << string_hundred(millions) << ' million '
end

if thousands >= 1 && thousands <= 999
result << string_hundred(thousands) << ' thousand '
end

result << string_hundred(@number % 1000)
end

end

print "Enter a number: "

number = gets.chomp.to_i

myNumber = Number.new(number)
puts myNumber

Esse problema poderia ser resolvido de inúmeras maneiras diferentes e provavelmente deve existir alguma com menos linhas de código, o que não necessariamente implica em um programa mais simples. Eu usei os conhecimentos que tinha sobre a linguagem e consegui um bom resultado em um tempo relativamente curto.

Quero ver agora a solução do pessoal para outras linguagens, tanto no fórum quanto nos comentários aqui do blog.

Nenhum comentário:

Postar um comentário