Google Code Jam/Triangle Dilemma

From HaskellWiki
Jump to navigation Jump to search

import Prelude hiding (Right) import Data.Ratio import Data.List import Data.Char type F = Ratio Int type Point = (F, F) type Triangle = (Point,Point,Point) type Sides = [F] data Angle= Right | Obtuse | Acute deriving Show angleclass :: Sides -> Angle angleclass [f1,f2,f3] = case compare f3 (f2 + f1) of EQ -> Right GT -> Obtuse LT -> Acute data Length = Equilater | Isosceles | Scalene deriving (Show,Enum) lengthclass :: Sides -> Length lengthclass = toEnum . (subtract 1). length . group test :: Triangle -> String test t | allineamento t = "not a triangle" | otherwise = shlow (lengthclass ss) ++ shlow (angleclass ss) ++ "triangle" where shlow y = (toLower x:xs) ++ " " where x:xs = show y ss = sides t allineamento :: Triangle -> Bool allineamento ((x1,y1),(x2,y2),(x3,y3)) = (x3-x1) * (y2-y1) == (y3-y1) * (x2-x1) sides :: Triangle -> [F] sides (p1,p2,p3) = sort . map (uncurry dist) $ zip ps (tail . cycle $ ps) where ps = [p1,p2,p3] dist (x1,y1) (x2,y2) = (x2 - x1) ^ 2 + (y2 - y1) ^ 2 parseTriangle :: String -> Triangle parseTriangle x = let [x1,y1,x2,y2,x3,y3] = map read . map ( ++ "%1") . words $ x in ((x1,y1),(x2,y2),(x3,y3)) parseCases :: String -> [Triangle] parseCases x = let (n:ts) = lines x in take (read n) . map parseTriangle $ ts main = do ts <- parseCases `fmap` getContents flip mapM_ (zip [1..] ts) $ \(i,t) -> do putStr $ "Case #" ++ show i ++ ": " putStrLn $ test t