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!
Este exercício exige que você defina a coluna result da tabela roman-numerals com o valor correto, com base no número encontrado na coluna number.
CREATE TABLE "roman-numerals" ("number" INT, "result" TEXT);
Crie sua conta no Exercism para aprender e dominar SQLite com 81 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.