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
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).
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!
Neste exercício, vais precisar de suportar duas formas diferentes de chamar a palavra stringify:
roman (por exemplo, stringify.roman 3999)roman (por exemplo, stringify 3999)Para mais informações, consulta a documentação de atributos e também a documentação de attr.
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".
attrs esvazia explicitamente a tabela depois de obter os atributos.attr remove ("pops") o atributo da tabela.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.
Inscreve-te no Exercism para aprenderes e dominares Arturo com 79 exercícios, e mentoria humana real, tudo grátis.
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.