Skip to content

Instantly share code, notes, and snippets.

@anscharivs
Last active September 1, 2019 04:18
Show Gist options
  • Save anscharivs/41c2e537dcc94b5e0360bbd0b217df57 to your computer and use it in GitHub Desktop.
Save anscharivs/41c2e537dcc94b5e0360bbd0b217df57 to your computer and use it in GitHub Desktop.
Este código (algo "hardcodeado") convierte un número del 0 al 1000 a su equivalente escrito en Español (p. ej. 253 es Doscientos Cincuenta y Tres).
-- Descompone un número en una lista con los números que lo componen
digs :: Integral x => x -> [x]
digs 0 = []
digs x = digs (div x 10) ++ [mod x 10]
-- Devuelve la longitud de un número entero
longitud m = length (show m)
-- Evaluador principal
pre n
| n == 0 = "Cero"
| n == 100 = "Cien"
| n == 1000 = "Mil"
| n <= 20 = base !! (n-1)
| longitud n == 2 = casodos (digs n)
| longitud n == 3 = casotres (digs n)
| otherwise = "Mayor de 1000"
-- Evalúa los números de tres cifras
casotres k
| (k !! 1 == 0) && (k !! 2 == 0) = loscienes k
| k !! 1 == 1 = cen k ++ dieces k
| k !! 1 == 0 = cen k ++ uniplus k
| k !! 2 == 0 = cen k ++ decplus2 k
| otherwise = cen k ++ decplus k ++ uniplus k
-- Evalúa los números de dos cifras
casodos d
| d !! 1 == 0 = decplusesp d
| otherwise = dec d ++ uni d
-- Devuelve los números de formato ?00 (excepto el 100) sin espacio al final
loscienes :: [Int] -> String
loscienes arr = base3esp !! ((arr !! 0)-2)
-- Devuelve los números del 10 al 19 para tres cifras
dieces :: [Int] -> String
dieces arr = base !! ((arr !! 2)+9)
-- Devuelve las unidades
uni :: [Int] -> String
uni arr = base !! ((arr !! 1)-1)
-- Devuelve las decenas
dec :: [Int] -> String
dec arr = base2 !! ((arr !! 0)-2)
-- Devuelve las centenas
cen :: [Int] -> String
cen arr = base3 !! ((arr !! 0)-1)
-- Devuelve las unidades para tres cifras
uniplus :: [Int] -> String
uniplus arr = base !! ((arr !! 2)-1)
-- Devuelve las decenas para tres cifras
decplus :: [Int] -> String
decplus arr = base2 !! ((arr !! 1)-2)
-- Devuelve las decenas divisibles entre 10 para tres cifras
decplus2 :: [Int] -> String
decplus2 arr = base2esp !! ((arr !! 1)-2)
-- Devuelve las decenas divisibles entre 10 para dos cifras
decplusesp :: [Int] -> String
decplusesp arr = base2esp !! ((arr !! 0)-2)
-- Devuelve los números de formato ?00 (excepto el 100) con espacio al final
censolo :: [Int] -> String
censolo arr = base3 !! ((arr !! 0)-1)
-- Listas
base = ["Uno", "Dos", "Tres", "Cuatro", "Cinco", "Seis", "Siete", "Ocho", "Nueve", "Diez", "Once", "Doce", "Trece", "Catorce", "Quince", "Dieciseis", "Diecisiete", "Dieciocho", "Diecinueve", "Veinte"]
base2 = ["Veinti", "Treinta y ", "Cuarenta y ", "Cincuenta y ", "Sesenta y ", "Setenta y ", "Ochenta y ", "Noventa y "]
base3 = ["Ciento ", "Doscientos ", "Trescientos ", "Cuatrocientos ", "Quinientos ", "Seicientos ", "Setecientos ", "Ochocientos ", "Novecientos "]
base2esp = ["Veinte", "Treinta", "Cuarenta", "Cincuenta", "Sesenta", "Setenta", "Ochenta", "Noventa"]
base3esp = ["Doscientos", "Trescientos", "Cuatrocientos", "Quinientos", "Seicientos", "Setecientos", "Ochocientos", "Novecientos"]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment