Added Haskell Implementations and changed directory structure
This commit is contained in:
parent
9f40c27eb9
commit
cb9dee889b
14 changed files with 392 additions and 0 deletions
62
Haskell/2021/05/day5.hs
Normal file
62
Haskell/2021/05/day5.hs
Normal file
File diff suppressed because one or more lines are too long
38
Haskell/2021/05/day5_1.hs
Normal file
38
Haskell/2021/05/day5_1.hs
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
fand :: Bool -> Bool -> Bool
|
||||
fand a b
|
||||
| a == b = True
|
||||
| otherwise = false
|
||||
|
||||
numberIntersections :: ((Integer, Integer), (Integer, Integer)) -> ((Integer, Integer), (Integer, Integer)) -> Int
|
||||
numberIntersections ls1 ls2
|
||||
| fand (orien11 /= orien12) (orien21 /= orien22) = 1
|
||||
|
|
||||
where orien11 = orientation (fst ls1) (snd ls1) (fst ls2)
|
||||
orien12 = orientation (fst ls1) (snd ls1) (snd ls2)
|
||||
orien21 = orientation (fst ls2) (snd ls2) (fst ls1)
|
||||
orien22 = orientation (fst ls2) (snd ls2) (snd ls1)
|
||||
|
||||
onSegment :: (Integer, Integer) -> (Integer, Integer) -> (Integer, Integer) -> Int
|
||||
onSegment p q r =
|
||||
|
||||
onSegmentFst :: Integer -> Integer -> Integer -> Bool
|
||||
onSegmentFst p q r = fand (onSegmentLE (fst q) (fst p) (fst r)) (onSegmentGE (fst q) (fst p) (fst r))
|
||||
|
||||
onSegmentSnd :: Integer -> Integer -> Integer -> Bool
|
||||
onSegmentSnd p q r = fand (onSegmentLE (snd q) (snd p) (snd r)) (onSegmentGE (snd q) (snd p) (snd r))
|
||||
|
||||
onSegmentGE :: Integer -> Integer -> Integer -> Bool
|
||||
onSegmentGE a b c = a >= (min b c)
|
||||
|
||||
onSegmentLE :: Integer -> Integer -> Integer -> Bool
|
||||
onSegmentLE a b c = a <= (max b c)
|
||||
|
||||
orientation :: (Integer, Integer) -> (Integer, Integer) -> (Integer, Integer) -> Int
|
||||
orientation p q r
|
||||
| value == 0 = 0 -- Collinear
|
||||
| value > 0 = 1 -- Clockwise
|
||||
| otherwise = -1 -- CounterClockwise
|
||||
where value = ((snd q) - (snd p)) * ((fst r) - (fst q)) - ((fst q) - (fst p)) * ((snd r) - (snd q))
|
||||
|
||||
|
||||
dummyInput = [((0,9),(5,9)),((8,0),(0,8)),((9,4),(3,4)),((2,2),(2,1)),((7,0),(7,4)),((6,4),(2,0)),((0,9),(2,9)),((3,4),(1,4)),((0,0),(8,8)),((5,5),(8,2))]
|
||||
49
Haskell/2021/05/day5_2.hs
Normal file
49
Haskell/2021/05/day5_2.hs
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
fand :: Bool -> Bool -> Bool
|
||||
fand a b
|
||||
| a == b = a
|
||||
| otherwise = False
|
||||
|
||||
betweenxAndy :: Int -> Int -> Int -> Bool
|
||||
betweenxAndy x y n = fand (n >= x) (n <= y)
|
||||
|
||||
between0And1 :: Int -> Bool
|
||||
between0And1 = betweenxAndy 0 1
|
||||
|
||||
crossProduct :: (Integer, Integer) -> (Integer, Integer) -> Integer
|
||||
crossProduct (x1, y1) (x2, y2) = x1*y2 - x2*y1
|
||||
|
||||
dotProduct :: (Integer, Integer) -> (Integer, Integer) -> Integer
|
||||
dotProduct (x1, y1) (x2, y2) = x1*x2 + y1*y2
|
||||
|
||||
pointDifference :: (Integer, Integer) -> (Integer, Integer) -> (Integer, Integer)
|
||||
pointDifference (x1, y1) (x2, y2) = (x1-x2, y1-y2)
|
||||
|
||||
pointSum :: (Integer, Integer) -> (Integer, Integer) -> (Integer, Integer)
|
||||
pointSum (x1, y1) (x2, y2) = (x1+x2, y1+y2)
|
||||
|
||||
overlapNums :: ((Integer,Integer),(Integer,Integer)) -> ((Integer,Integer),(Integer,Integer)) -> Int
|
||||
overlapNums (p, r) (q, s)
|
||||
| collinear =
|
||||
| paraNonInter = 0
|
||||
| intersect = 1
|
||||
| otherwise = 0
|
||||
where bottom = crossProduct r s
|
||||
tTop = crossProduct (pointDifference q p) s
|
||||
top = crossProduct (pointDifference q p) r
|
||||
collinear = fand (bottom == 0) (top == 0)
|
||||
paraNonInter = fand (bottom == 0) (top /= 0)
|
||||
u = top / bottom
|
||||
t = tTop / bottom
|
||||
intersect = fand (bottom /= 0) (fand (between0And1 u) (between0And1 t))
|
||||
|
||||
collineComp :: ((Integer,Integer),(Integer,Integer)) -> ((Integer,Integer),(Integer,Integer)) -> Int
|
||||
collineComp (p, r) (q, s)
|
||||
| fand (t0' < 0) (t1 >= 0) = 0-- overlapping
|
||||
| fand (t0' >= 0) (t1 <= 1) = 0-- overlapping
|
||||
| otherwise = 0 -- Disjoint
|
||||
where t0 = (dotProduct (pointDifference p q) r) / dotProduct r r
|
||||
t1 = (dotProduct (pointDifference (pointSum q s) p) r) / dotProduct r r
|
||||
t0' = if t0 > t1 then t1 else t0
|
||||
t1' = if t0 > t1 then t0 else t1
|
||||
|
||||
collineComp :: ((Integer,Integer),(Integer,Integer)) -> ((Integer,Integer),(Integer,Integer)) -> Int
|
||||
Loading…
Add table
Add a link
Reference in a new issue