Skip to content

Instantly share code, notes, and snippets.

@fgaray
Created September 3, 2012 02:48
Show Gist options
  • Save fgaray/3606408 to your computer and use it in GitHub Desktop.
Save fgaray/3606408 to your computer and use it in GitHub Desktop.
Desafio #1
import Control.Monad (liftM)
-- Esto es simplemente una abreviación para no tener que escribir tanto
type Digito = [[Char]]
-- Estas funciones devuelven el esqueleto de un numero
cero = [ ['+', '-', '+']
, ['|', ' ', '|']
, ['|', ' ', '|']
, ['|', ' ', '|']
, ['+', '-', '+']
]
uno = [ [' ', ' ', '+']
, [' ', ' ', '|']
, [' ', ' ', '|']
, [' ', ' ', '|']
, [' ', ' ', '+']
]
dos = [ ['+', '-', '+']
, [' ', ' ', '|']
, ['+', '-', '+']
, ['|', ' ', ' ']
, ['+', '-', '+']
]
tres = [ ['+', '-', '+']
, [' ', ' ', '|']
, ['-', '-', '+']
, [' ', ' ', '|']
, ['-', '-', '+']
]
cuatro = [ ['+', ' ', '+']
, ['|', ' ', '|']
, ['+', '-', '+']
, [' ', ' ', '|']
, [' ', ' ', '+']
]
cinco = [ ['+', '-', '+']
, ['|', ' ', ' ']
, ['+', '-', '+']
, [' ', ' ', '|']
, ['+', '-', '+']
]
seis = [ ['+', '-', '+']
, ['|', ' ', ' ']
, ['+', '-', '+']
, ['|', ' ', '|']
, ['+', '-', '+']
]
siete = [ ['+', '-', '+']
, [' ', ' ', '|']
, [' ', ' ', '|']
, [' ', ' ', '|']
, [' ', ' ', '+']
]
ocho = [ ['+', '-', '+']
, ['|', ' ', '|']
, ['+', '-', '+']
, ['|', ' ', '|']
, ['+', '-', '+']
]
nueve = [ ['+', '-', '+']
, ['|', ' ', '|']
, ['+', '-', '+']
, [' ', ' ', '|']
, [' ', ' ', '+']
]
-- Repite el caracter del medio del numero cs segun el numero i dado. Con esto
-- podemos cumplir con el bonus del largo del numero que quiera el usuario
repetir :: Int -> [Char] -> String
repetir i cs = [cs !! 0] ++ replicate i (cs !! 1) ++ [cs !! 2]
-- Junta los Digitos dados linea por linea
juntar :: Int -> Int -> [Digito] -> String
juntar n i ns
| i < 5 = foldl (\acc x -> acc ++ repetir n (x !! i) ++ " ") "" ns ++ "\n" ++ juntar n (i+1) ns -- tomamos la linea que corresponde
| otherwise = ""
-- Segun el numero que sea es la representacion que debemos usar
evaluar :: Char -> Digito
evaluar '0' = cero
evaluar '1' = uno
evaluar '2' = dos
evaluar '3' = tres
evaluar '4' = cuatro
evaluar '5' = cinco
evaluar '6' = seis
evaluar '7' = siete
evaluar '8' = ocho
evaluar '9' = nueve
evaluar _ = cero -- por defecto usamos el cero
-- A partir de un string devuelve la representacion en ascii art que le
-- corresponde
convertir :: String -> [Digito]
convertir = map evaluar
-- Convierte un string en un int en la Monada
toInt = liftM (\x -> read x :: Int)
-- Funcion de entrada
main = do
n <- getLine --Numero a mostrar
s <- toInt getLine -- largo de la linea, BONUS!
putStrLn . juntar s 0 . convertir $ n
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment