Conversor numero decimal/romano, romano/decimal para shell script (Roman to arabic, arabic to roman number converter)

Hola a todxs de nuevo, hacía tiempo que no escribía nada por aquí pero esta ocasión lo merece, debido a que puede ayudar a mucha gente, en esta ocasión os traigo el código de shell script (Bash) para un convertor de numeros decimales a romanos y viceversa, espero que os sea útil ya bien sea en clase o fuera de ella, saludos y al lio!

#!/bin/bash

#SCRIPT CONVERSOR DECIMAL-ROMANO
#-----------------------------------------------------------------
#Descomentar la siguiente línea para ver por terminal la ejecución del script paso a paso
#set -x

#Definimos vectores que nos facilitarán la tarea
dec=( 1000 900 500 400 100 90 50 40 10 9 5 4 1 )
rom=( M CM D CD C XC L XL X IX V IV I )

#Función que pasa un número romano a decimal
function toDec (){

pos=`expr ${#num} - 1`
prev=0
result=0
while [ $pos -ge 0 ];do
case "${num:$pos:1}" in
M) factor=1000 ;;
D) factor=500 ;;
C) factor=100 ;;
L) factor=50 ;;
X) factor=10 ;;
V) factor=5 ;;
I) factor=1 ;;
esac

if [ $factor -lt $prev ];then
result=`expr $result - $factor`
else
result=`expr $result + $factor`
fi
prev=$factor
pos=`expr $pos - 1`
done
echo "El equivalente en decimal al año romano $num es $result"
}

#Función que pasa un número decimal a Romano
function toRom (){

aux=$num
pos=0

for item in ${dec[@]};do
valor=`expr $aux / $item`
resto=`expr $aux % $item`
cont=0
while [ $cont -lt $valor ];do
result=`echo $result${rom[$pos]}`
cont=`expr $cont + 1`
done
pos=`expr $pos + 1`
aux=$resto
done
echo "El equivalente en números romanos al año decimal $num es $result"
}

#Comprueba que se reciba el parámetro
if [[ -n $1 ]]; then
echo "Parámetro recibido"
num=$1

#Comprueba si es un número decimal
validate='^-?[0-9]+([.][0-9]+)?$'
if [[ $num =~ $validate ]]; then
echo Es entero

#Si es un número entero comprobamos que esté entre el rango solicitado
if [[ ($num -ge 1) && (num -le 1999) ]]; then
echo El número está dentro del rango 0-1999
toRom

else
echo El número está fuera del rango 0-1999. No se realiza conversión
fi
else
echo No es un entero.

#Si no es un número entero comprobamos que sea un número romano
if [ ${num:0:1} == "M" ] || [ ${num:0:1} == "D" ] || [ ${num:0:1} == "C" ] || [ ${num:0:1} == "V" ] || [ ${num:0:1} == "X" ] || [ ${num:0:1} == "I" ];then
echo Es un número romano
#LLamamos a la función para convertir a número decimal
toDec
else
echo No es un número romano bien formado
fi
fi

else
echo "No se ha recibido ningún parámetro válido"
fi

Espero os sirva tanto como a mi en su momento y si os gusta ya sabeis, compartid, que es gratis!

Si te gusta, compártelo.

Deja un comentario

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies