Imprima os números de 1 a 100. Troque os números múltiplos de 5 por Peg, os múltiplos de 7 por car, e os múltiplos de 35 por Pegcar.
Em outras palavaras temos um lista de dados, que precisamos processar e gerar uma nova lista de dados, de acordo com a regra de negócio.
Um cenário ideal pra utilização do #map
então segue uma primeira solução para o exercício.
result_a =
(1..100).map{ |n|
('Pegcar' if (n % 35).zero?) || ('car' if (n % 7).zero?) || ('Peg' if (n % 5).zero?) || n
}.join(', ')
# resultado
# => "1, 2, 3, 4, Peg, 6, car, 8, 9, Peg, 11, 12, 13, car, Peg, 16, 17, 18, 19, Peg, car, 22, 23, 24, Peg, 26, 27, car, 29, Peg, 31, 32, 33, 34,
# Pegcar, 36, 37, 38, 39, Peg, 41, car, 43, 44, Peg, 46, 47, 48, car, Peg, 51, 52, 53, 54, Peg, car, 57, 58, 59, Peg, 61, 62, car, 64, Peg, 66, 67,
# 68, 69, Pegcar, 71, 72, 73, 74, Peg, 76, car, 78, 79, Peg, 81, 82, 83, car, Peg, 86, 87, 88, 89, Peg, car, 92, 93, 94, Peg, 96, 97, car, 99, Peg"
Aproveitando o conceito de classes abertas do ruby, podemos melhorar a expressividade dessa solução,
adicionando um novo método #is_multiple_of?
à classe Fixnum
.
class Fixnum
def is_multiple_of?(n)
n.nonzero? && (self % n).zero?
end
end
E atualizar a solução com o novo método, obtendo o mesmo resultado
result_b =
(1..100).map{ |n|
('Pegcar' if n.is_multiple_of? 35) || ('car' if n.is_multiple_of? 7) || ('Peg' if n.is_multiple_of? 5) || n
}.join(', ')
# resultado
# => "1, 2, 3, 4, Peg, 6, car, 8, 9, Peg, 11, 12, 13, car, Peg, 16, 17, 18, 19, Peg, car, 22, 23, 24, Peg, 26, 27, car, 29, Peg, 31, 32, 33, 34,
# Pegcar, 36, 37, 38, 39, Peg, 41, car, 43, 44, Peg, 46, 47, 48, car, Peg, 51, 52, 53, 54, Peg, car, 57, 58, 59, Peg, 61, 62, car, 64, Peg, 66, 67,
# 68, 69, Pegcar, 71, 72, 73, 74, Peg, 76, car, 78, 79, Peg, 81, 82, 83, car, Peg, 86, 87, 88, 89, Peg, car, 92, 93, 94, Peg, 96, 97, car, 99, Peg"