WEB3DEV

Cover image for Convertendo Números Inteiros para Números Romanos na Blockchain com Solidity
Banana Labs
Banana Labs

Posted on

Convertendo Números Inteiros para Números Romanos na Blockchain com Solidity

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.

ethereum
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;
}
Enter fullscreen mode Exit fullscreen mode

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;
    }
Enter fullscreen mode Exit fullscreen mode

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;
    }

Enter fullscreen mode Exit fullscreen mode

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;
    }
}

Enter fullscreen mode Exit fullscreen mode

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

Top comments (0)