Hoje, a maioria das pessoas no mundo usa algarismos arábicos (0–9). Mas se você voltasse dois mil anos no tempo, descobriria que a maioria dos europeus usava algarismos romanos.
Para escrever um algarismo 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 algarismo romano é uma sequência dessas letras, e o valor dele é a soma dos valores das letras.
Por exemplo, XVIII tem o valor 18 (10 + 5 + 1 + 1 + 1 = 18).
Mas há uma regra que complica um pouco as coisas: a mesma letra não pode ser usada mais de três vezes seguidas.
Isso significa que não conseguimos expressar números como 4 com o aparentemente natural IIII.
Em vez disso, para esses números, usamos um método de subtração entre duas letras.
Então pensamos no 4 não como 1 + 1 + 1 + 1, mas como 5 - 1.
E, um pouco confuso para o nosso pensamento moderno, escrevemos o número menor primeiro.
Isso se aplica apenas nos seguintes casos: 4 (IV), 9 (IX), 40 (XL), 90 (XC), 400 (CD) e 900 (CM).
A ordem importa nos algarismos romanos! As letras (e os compostos especiais acima) devem ser ordenadas por valor decrescente, da esquerda para a direita.
Veja 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
Sua tarefa é converter um número de algarismos arábicos para algarismos romanos.
Para este exercício, vamos considerar apenas os algarismos romanos tradicionais, em que o maior número é MMMCMXCIX (ou 3.999).
Há muitas maneiras diferentes de converter entre algarismos arábicos e romanos. Recomendamos adotar uma abordagem ingênua primeiro para se familiarizar com o conceito de algarismos romanos e depois buscar métodos mais eficientes.
Não deixe de conferir nosso vídeo Deep Dive no final para explorar as diferentes abordagens que você pode adotar!
Neste exercício, você vai precisar dar suporte a duas formas diferentes de chamar a palavra stringify:
roman (por exemplo, stringify.roman 3999)roman (por exemplo, stringify 3999)Para mais informações, consulte a documentação de attributes e também a documentação de attr.
Além de attr, a função attrs é útil: ela retorna todos os atributos da chamada da função como um dicionário.
Cuidado: essas duas funções são destrutivas!
A implementação do Arturo usa uma "tabela de atributos".
attrs esvazia explicitamente a tabela depois de recuperar os atributos.attr remove ("desempilha") o atributo da tabela.Um exemplo:
showAttributes: function [x][
print attr 'question
print attrs
print attrs
]
showAttributes .question:"6 * 9" .answer:42 'arg
produz a saída
6 * 9
[answer:42]
[]
A cada passo, vemos o dicionário de atributos encolher.
Conclusão: lembre-se de que você só pode obter os atributos uma vez. Se precisar consultar os atributos de novo, capture-os no início das suas funções.
Crie sua conta no Exercism para aprender e dominar Arturo com 79 exercícios e mentoria humana de verdade, tudo de graça.
Explore várias soluções diferentes para este exercício complicado, que vão da recursão a consultas em tabelas, passando por uma solução que usa números de base mista e uma trapaça simplista em Common Lisp.