Percursos
/
Arturo
Arturo
/
Exercícios
/
Números romanos
Números romanos

Números romanos

Médio

Introdução

Hoje em dia, a maioria das pessoas no mundo usa algarismos árabes (0–9). Mas se recuasses dois mil anos, verias que a maioria dos europeus usava algarismos romanos.

Para escrever um número romano, usamos as seguintes letras latinas, cada uma com um valor:

M D C L X V I
1000 500 100 50 10 5 1

Um número romano é uma sequência destas letras, e o seu valor é a soma dos valores das letras. Por exemplo, XVIII tem o valor 18 (10 + 5 + 1 + 1 + 1 = 18).

Há, no entanto, uma regra que torna tudo mais complicado: a mesma letra não pode ser usada mais de três vezes seguidas. Isso significa que não podemos representar números como o 4 com o aparentemente natural IIII. Em vez disso, para esses números, usamos um método de subtração entre duas letras. Por isso, pensamos no 4 não como 1 + 1 + 1 + 1, mas sim como 5 - 1. E, de forma um pouco confusa para o nosso pensamento moderno, escrevemos primeiro o número menor. Isto aplica-se apenas nos seguintes casos: 4 (IV), 9 (IX), 40 (XL), 90 (XC), 400 (CD) e 900 (CM).

A ordem é importante nos números romanos! As letras (e os compostos especiais acima) têm de estar ordenadas por valor decrescente, da esquerda para a direita.

Aqui estão alguns exemplos:

 105 => CV
---- => --
 100 => C
+  5 =>  V
 106 => CVI
---- => --
 100 => C
+  5 =>  V
+  1 =>   I
 104 => CIV
---- => ---
 100 => C
+  4 =>  IV

E um último exemplo mais complexo:

 1996 => MCMXCVI
----- => -------
 1000 => M
+ 900 =>  CM
+  90 =>    XC
+   5 =>      V
+   1 =>       I

Instruções

A tua tarefa é converter um número de algarismos árabes para algarismos romanos.

Neste exercício, só nos interessam os algarismos romanos tradicionais, em que o número mais alto é MMMCMXCIX (ou 3 999).

Note

Há muitas formas diferentes de converter entre algarismos árabes e algarismos romanos. Recomendamos que comeces por uma abordagem simples, para te familiarizares com o conceito de algarismos romanos, e que só depois procures métodos mais eficientes.

Certifica-te de que vês o nosso vídeo Deep Dive no final, para explorares as diferentes abordagens que podes seguir!

Instruções de Arturo

Neste exercício, vais precisar de suportar duas formas diferentes de chamar a palavra stringify:

  1. Com o atributo roman (por exemplo, stringify.roman 3999)
  2. Sem o atributo roman (por exemplo, stringify 3999)

Para mais informações, consulta a documentação de atributos e também a documentação de attr.

Caution

Além de attr, a função attrs é útil: devolve todos os atributos da chamada da função como um dicionário.

Tem cuidado: estas duas funções são destrutivas!

A implementação do Arturo usa uma "tabela de atributos".

Um exemplo:

showAttributes: function [x][
    print attr 'question
    print attrs
    print attrs
]

showAttributes .question:"6 * 9" .answer:42 'arg

produz

6 * 9
[answer:42]
[]

A cada passo, vemos o dicionário de atributos a encolher.

Conclusão: tem em atenção que só podes obter os atributos uma vez. Se precisares de voltar a consultar os atributos, captura-os no início das tuas funções.

Editar via GitHub A ligação abre numa nova janela ou separador
Arturo Exercism

Estás pronto para começar Números romanos?

Inscreve-te no Exercism para aprenderes e dominares Arturo com 79 exercícios, e mentoria humana real, tudo grátis.

Mergulha a fundo em Números romanos!

Explora várias soluções diferentes para este exercício complicado, desde a recursão a consultas baseadas em tabelas, passando por uma solução que recorre a números de base mista e por alguns truques simplistas em Common Lisp.