Recently Google has announced an Android event, oriented to Developers. They have made a small quiz with few questions, and I’ve solved that Quiz in Haskell just for fun. Probably I can do it in Python, but this time I prefer to solve it in Haskell. Let’s see some questions:
question a
What does the following program (given in pseudo-code) print?
The pseudo-code for this question was as follows:
x = 6 y = 2 if y > 1, then y = y * 2 else x = x * 2 print (x + y)
And the solution in Haskell:
module Main where simple :: Int -> Int -> Int simple x y = if x > 1 then y * 2 + x else x * 2 + y main :: IO () main = do let x :: Int y :: Int z :: Int x = 6 y = 2 z = simple x y in putStrLn (show z)
question b
How many times does the following program print ‘hello’? (note: the for loop in our pseudo-language includes the endpoints, so, for example, 1 to 4 means 1, 2, 3, 4.)
The pseudo-code for this question is as follows:
for i = 1 to 7 if i != 7, then for j = 1 to 8 print 'hello'
module Main where main :: IO () main = do let r :: String i :: Int s :: String h :: String h = "hellon" i = ( (last (filter (x -> x /= 7) [1..7])) * 8 ) r = ( show i ) s = concat (take i (repeat h)) in putStrLn (s ++ "n" ++ r)
question c
Between 1945 and 5403 (inclusive), how many numbers are even and also divisible by 7? (Hint: you can write a program to help you calculate)
module Main where main :: IO () main = do let r :: String i :: Int i = length ( filter ( x -> x `mod` 2 == 0 && x `mod` 7 == 0 ) [1945..5403] ) r = (show i) in putStrLn r
question d
In the little-known nation of Undeclaredvariablestan, all phone numbers have 6 digits. The phone company imposes these rules on numbers: There cannot be two consecutive identical digits, because that’s lame; The sum of the digits must be even, because that’s cool; The last digit can’t be the same as the first, because that’s unlucky. So, given these very reasonable, mature and well-designed rules, how many phone numbers in the list below are valid?
module Main where import Data.Char numbers :: [String] numbers = ["215887", -- a long list of numbers "694419"] chk_sum :: String -> Bool chk_sum s = (((sum (map digitToInt s)) `mod` 2) == 0) chk_fl :: String -> Bool chk_fl s = ((head s) /= (last s)) chk_seq :: String -> Bool chk_seq s = do let m :: [Int] m = (map digitToInt s) in ((length (filter (x -> x) (zipWith (==) m (tail m)))) == 0) chk_all :: String -> Bool chk_all s = ((chk_sum s) && (chk_fl s) && (chk_seq s)) main :: IO () main = do let b1 :: Int b1 = length (filter (x -> (chk_all x)) numbers) in putStrLn (show b1)