Curso de Raku / Apéndice 🆕 / Poniéndolo todo junto / Miniproyectos variados / Exercises / Números romanos

Solución: Números romanos

Aquí tienes una posible solución para la tarea.

Código

my @table =
    1000 => 'M', 900 => 'CM', 500 => 'D', 400 => 'CD',
    100  => 'C', 90  => 'XC', 50  => 'L', 40  => 'XL',
    10   => 'X', 9   => 'IX', 5   => 'V', 4   => 'IV',
    1    => 'I';

my $n = 1994;
my $roman = '';

for @table -> $pair {
    while $n >= $pair.key {
        $roman ~= $pair.value;
        $n -= $pair.key;
    }
}

say $roman;

🦋 Puedes encontrar el código fuente en el archivo roman-numerals.raku.

Salida

MCMXCIV

Comentarios

  1. La tabla enumera todos los símbolos en orden descendente de valor, incluidas las formas sustractivas como CM (900) y IV (4), así que el algoritmo nunca tiene que tratarlas como casos especiales.

  2. Para cada entrada, el while añade el símbolo y resta su valor tantas veces como quepa, de modo que las piezas mayores se agotan primero.

Números romanos   |   Una calculadora en notación polaca inversa