Os números romanos são um sistema numérico histórico que teve origem na Roma Antiga. Embora não sejam tão comuns hoje em dia, ainda têm significado cultural e histórico. Imagine que você recebeu a tarefa de criar um contrato inteligente que converta números inteiros em números romanos no contexto de uma blockchain. Vamos explorar como fazer isso usando Solidity, uma linguagem de programação para escrever contratos inteligentes na blockchain Ethereum.
Introdução
Neste post do blog, vamos explorar um contrato inteligente em Solidity que pode converter números inteiros para sua representação de números romanos correspondente. Este contrato utiliza um loop e um conjunto de valores predefinidos para realizar a conversão. Vamos discutir os principais componentes do contrato e explicar como ele funciona.
Foto de Jievani Weerasinghe em Unsplash
O Contrato Inteligente RomanNumber
O contrato inteligente RomanNumber
foi projetado para facilitar a conversão de números inteiros em números romanos. Vamos detalhar seus principais componentes:
Valores Predefinidos
O contrato começa definindo um conjunto de valores predefinidos para os números romanos, que vão de M (1000) a I (1). Esses valores são representados como constantes usando o tipo de dado uint256
.
contract RomanNumber {
uint256 M = 1000;
uint256 D = 500;
uint256 C = 100;
uint256 L = 50;
uint256 X = 10;
uint256 V = 5;
uint256 IV = 4;
uint256 IX = 9;
}
Função integerToRoman
A função principal do contrato é integerToRoman
, que recebe um número inteiro como entrada e retorna sua representação em números romanos como uma string. Veja como a função funciona:
Ela inicializa uma variável reminder
com o número inteiro de entrada e prepara as strings roman
e joinRoman
para construir o numeral romano final.
A função entra em um loop no qual itera pelos valores predefinidos, verificando se reminder
é maior ou igual a cada valor. Se for, a função de loop
é chamada para adicionar o numeral romano correspondente a joinRoman
, e reminder
é atualizado de acordo.
Para casos especiais, como 4 (IV) e 9 (IX), a função atribui diretamente os numerais romanos correspondentes e define reminder
como 0.
Se nenhum dos valores predefinidos corresponder a reminder
, a função adiciona o número apropriado de caracteres "I" a joinRoman
usando a função de loop
.
O joinRoman é concatenado
à string roman
.
Após a conclusão do loop, a função retorna a string roman
contendo a representação em números romanos do número inteiro de entrada.
function integerToRoman(uint256 _integer)
external
view
returns (string memory)
{
uint256 reminder = _integer;
string memory roman;
string memory joinRoman = "";
while (reminder != 0) {
if (reminder >= M) {
joinRoman = loop(reminder / M, "M");
reminder = reminder % M;
} else if (reminder >= D) {
joinRoman = loop(reminder / D, "D");
reminder = reminder % D;
} else if (reminder >= C) {
joinRoman = loop(reminder / C, "C");
reminder = reminder % C;
} else if (reminder >= L) {
joinRoman = loop(reminder / L, "L");
reminder = reminder % L;
} else if (reminder >= X) {
joinRoman = loop(reminder / X, "X");
reminder = reminder % X;
} else if (reminder == 4) {
joinRoman = "IV";
reminder = 0;
} else if (reminder == 9) {
joinRoman = "IX";
reminder = 0;
} else if (reminder >= V) {
joinRoman = loop(reminder / V, "V");
reminder = reminder % V;
} else {
joinRoman = loop(reminder, "I");
reminder = 0;
}
roman = string.concat(roman, joinRoman);
}
return roman;
}
Função loop
A função loop
é uma função auxiliar usada para concatenar um numeral romano dado um número específico de vezes com base no _number
fornecido. Esta função é essencial para a construção dos números romanos durante o processo de conversão.
O joinRoman é concatenado à string roman.
function loop(uint256 _number, string memory _roman)
internal
pure
returns (string memory)
{
string memory joinRoman;
for (uint256 i = 0; i < _number; i++) {
joinRoman = string.concat(joinRoman, _roman);
}
return joinRoman;
}
Código Completo
contract RomanNumber {
uint256 M = 1000;
uint256 D = 500;
uint256 C = 100;
uint256 L = 50;
uint256 X = 10;
uint256 V = 5;
uint256 IV = 4;
uint256 IX = 9;
function integerToRoman(uint256 _integer)
external
view
returns (string memory)
{
uint256 reminder = _integer;
string memory roman;
string memory joinRoman = "";
while (reminder != 0) {
if (reminder >= M) {
joinRoman = loop(reminder / M, "M");
reminder = reminder % M;
} else if (reminder >= D) {
joinRoman = loop(reminder / D, "D");
reminder = reminder % D;
} else if (reminder >= C) {
joinRoman = loop(reminder / C, "C");
reminder = reminder % C;
} else if (reminder >= L) {
joinRoman = loop(reminder / L, "L");
reminder = reminder % L;
} else if (reminder >= X) {
joinRoman = loop(reminder / X, "X");
reminder = reminder % X;
} else if (reminder == 4) {
joinRoman = "IV";
reminder = 0;
} else if (reminder == 9) {
joinRoman = "IX";
reminder = 0;
} else if (reminder >= V) {
joinRoman = loop(reminder / V, "V");
reminder = reminder % V;
} else {
joinRoman = loop(reminder, "I");
reminder = 0;
}
roman = string.concat(roman, joinRoman);
}
return roman;
}
function loop(uint256 _number, string memory _roman)
internal
pure
returns (string memory)
{
string memory joinRoman;
for (uint256 i = 0; i < _number; i++) {
joinRoman = string.concat(joinRoman, _roman);
}
return joinRoman;
}
}
Conclusão
O contrato inteligente RomanNumber
demonstra como o Solidity pode ser usado para criar um sistema simples, porém funcional, para converter números inteiros em números romanos. Ao aproveitar valores predefinidos e um loop, o contrato constrói eficientemente a representação em números romanos de um número inteiro de entrada.
Este exemplo também destaca a versatilidade do Solidity além das transações financeiras. Contratos inteligentes podem ser aplicados em várias situações, desde aplicativos descentralizados complexos até utilitários inovadores como este conversor de números romanos.
Lembre-se de que o exemplo fornecido é simplificado e não abrange todos os possíveis casos de borda. Ao desenvolver contratos inteligentes para ambientes de produção, testes completos e consideração de possíveis vulnerabilidades são cruciais.
Incorporar a conversão de números romanos em um ambiente de blockchain não apenas demonstra a flexibilidade dos contratos inteligentes, mas também adiciona um toque de estilo histórico ao mundo dos aplicativos descentralizados.
Esse artigo é uma tradução feita por @bananlabs. Você pode encontrar o artigo original aqui
Oldest comments (0)