Hello all ,
I am trying to solve this problem [ hpaste.org/493021 ] .
Thank you
Mukesh Tiwari
iimport Data.List
import qualified Data.Sequence as DS
import Text.Printf
data Point a = P a a deriving ( Show , Eq , Ord )
data Turn = S | L | R deriving ( Show , Eq , Ord , Enum ) -- straight left right
compPoint :: ( Num a , Ord a ) => Point a -> Point a -> Ordering
compPoint ( P x1 y1 ) ( P x2 y2 )
| compare x1 x2 == EQ = compare y1 y2
| otherwise = compare x1 x2
findMinx :: ( Num a , Ord a ) => [ Point a ] -> [ Point a ]
findMinx xs = sortBy ( \x y -> compPoint x y ) xs
compAngle ::(Num a , Ord a ) => Point a -> Point a -> Point a -> Ordering
compAngle ( P x1 y1 ) ( P x2 y2 ) ( P x0 y0 ) = compare ( ( y1 - y0 ) * ( x2 - x0 ) ) ( ( y2 - y0) * ( x1 - x0 ) )
sortByangle :: ( Num a , Ord a ) => [ Point a ] -> [ Point a ]
sortByangle (z:xs) = z : sortBy ( \x y -> compAngle x y z ) xs
convexHull ::( Num a , Ord a ) => [ Point a ] -> [ Point a ]
convexHull xs = reverse . findHull [y,x] $ ys where
(x:y:ys) = sortByangle.findMinx $ xs
findTurn :: ( Num a , Ord a , Eq a ) => Point a -> Point a -> Point a -> Turn
findTurn ( P x0 y0 ) ( P x1 y1 ) ( P x2 y2 )
| ( y1 - y0 ) * ( x2- x0 ) < ( y2 - y0 ) * ( x1 - x0 ) = L
| ( y1 - y0 ) * ( x2- x0 ) == ( y2 - y0 ) * ( x1 - x0 ) = S
| otherwise = R
findHull :: ( Num a , Ord a ) => [ Point a ] -> [ Point a ] -> [ Point a ]
findHull [x] ( z : ys ) = findHull [ z , x ] ys --incase of second point on line from x to z
findHull xs [] = xs
findHull ( y : x : xs ) ( z:ys )
| findTurn x y z == R = findHull ( x : xs ) ( z:ys )
| findTurn x y z == S = findHull ( x : xs ) ( z:ys )
| otherwise = findHull ( z : y : x : xs ) ys
--from here on testing part for SPOJ
format::(Num a , Ord a ) => [[a]] -> [Point a]
format xs = map (\[x0 , y0] -> P x0 y0 ) xs
helpSqrt :: ( Floating a ) => Point a -> Point a -> a
helpSqrt ( P x0 y0 ) ( P x1 y1 ) = sqrt $ ( x0 - x1 ) ^ 2 + ( y0 - y1 ) ^ 2
solve :: ( Num a , RealFrac a , Floating a ) => [ Point a ] -> a
solve xs = snd . foldl ( \( P x0 y0 , s ) ( P x1 y1 ) -> ( P x0 y0 , max s $ 2.0 * helpSqrt ( P x0 y0 ) ( P x1 y1 ) ) ) ( P x y , 0 ) $ xs where
( P x y ) = cMass xs
cMass :: ( Num a , RealFrac a , Floating a ) => [ Point a ] -> Point a
cMass xs = P x y where
( P x0 y0 ) = foldl ( \( P x1 y1 ) (P x2 y2 ) -> P ( x1 + x2 ) ( y1 + y2 ) ) ( P 0 0 ) xs
n = genericLength xs
x = x0 / n
y = x0 / n
readInt ::( Num a , Read a ) => String -> a
readInt = read
main = interact $ ( printf "%.2f\n" :: Double -> String ) . solve . convexHull . format . map ( map readInt . words ) . tail . lines
off topic : I saw some guys are posting code which show language is Haskell and its indentation is fine . I tried [code="Haskell"] [/code] but its not working . Could some one please tell me the tag for Haskell.
created
last reply
- 6
replies
- 872
views
- 2
users
- 4
links