Last active
September 1, 2019 04:18
-
-
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).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- 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