WEB3DEV Español

Cover image for Convirtiendo Números Enteros a Números Romanos en la Blockchain con Solidity
Juan José Gouvêa
Juan José Gouvêa

Posted on

Convirtiendo Números Enteros a Números Romanos en la Blockchain con Solidity

Los números romanos son un sistema numérico histórico que tuvo su origen en la Antigua Roma. Aunque no son tan comunes hoy en día, todavía tienen un significado cultural e histórico. Imagina que tienes la tarea de crear un contrato inteligente que convierta números enteros en números romanos en el contexto de una blockchain. Vamos a explorar cómo hacer esto usando Solidity, un lenguaje de programación para escribir contratos inteligentes en la blockchain Ethereum.

Introducción

En esta entrada del blog, exploraremos un contrato inteligente en Solidity que puede convertir números enteros en su representación en números romanos correspondiente. Este contrato utiliza un loop y un conjunto de valores predefinidos para llevar a cabo la conversión. Discutiremos los componentes principales del contrato y explicaremos cómo funciona.

IMG1

Foto de Jievani Weerasinghe en Unsplash

El Contrato Inteligente RomanNumber

El contrato inteligente RomanNumber fue diseñado para facilitar la conversión de números enteros en números romanos. Vamos a detallar sus componentes principales:

Valores Predefinidos

El contrato comienza definiendo un conjunto de valores predefinidos para los números romanos, que van desde M (1000) hasta I (1). Estos valores están representados como constantes usando el tipo de dato 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

Función integerToRoman

La función principal del contrato es integerToRoman, el cual toma un número entero como entrada y devuelve su representación en números romanos como una cadena. Así es cómo funciona la función:

Inicia una variable llamada reminder con el número entero ingresado y prepara las cadenas roman y joinRoman para construir el numeral romano final.

La función entra en un loop en el que itera por los valores predefinidos, verificando si reminder es mayor o igual a cada valor. Si lo es, el loop llama a una función para agregar el numeral romano correspondiente a joinRoman, y reminder se actualiza en consecuencia.

Para casos especiales, como 4 (IV) y 9 (IX), la función asigna directamente los numerales romanos correspondientes y establece reminder en 0.

Si ninguno de los valores predefinidos coincide con reminder, la función añade el número apropiado de caracteres "I" a joinRoman usando la función de loop.

JoinRoman se concatena a la cadena roman.

Después de completar el loop, la función devuelve la cadena roman que contiene la representación en números romanos del número entero ingresado.

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

Función loop

La función loop es una función auxiliar utilizada para concatenar un numeral romano dado un número específico de veces basado en el _number proporcionado. Esta función es esencial para construir los números romanos durante el proceso de conversión.

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

Conclusión

El contrato inteligente RomanNumber demuestra cómo Solidity puede ser usado para crear un sistema simple pero funcional para convertir números enteros en números romanos. Utilizando valores predefinidos y un loop, el contrato construye de manera eficiente la representación en números romanos de un número entero ingresado.

Este ejemplo también resalta la versatilidad de Solidity más allá de las transacciones financieras. Los contratos inteligentes pueden ser aplicados en diversas situaciones, desde aplicaciones descentralizadas complejas hasta utilidades innovadoras como este convertidor de números romanos.

Recuerda que el ejemplo proporcionado es simplificado y no cubre todos los posibles casos límite. Al desarrollar contratos inteligentes para entornos de producción, es crucial realizar pruebas completas y considerar posibles vulnerabilidades.

Incorporar la conversión de números romanos en un ambiente de blockchain no sólo demuestra la flexibilidad de los contratos inteligentes, sino que también añade un toque histórico al mundo de las aplicaciones descentralizadas.

Este artículo es una traducción realizada por @junowoz. Puedes encontrar el artículo original aquí.

Discussion (0)