Improve code for Day 8

This commit is contained in:
daniele 2024-12-08 17:22:32 +01:00
parent 5f79e1b2f4
commit 90404a9085
Signed by: fuxino
GPG Key ID: 981A2B2A3BBF5514
2 changed files with 14 additions and 61 deletions

View File

@ -22,19 +22,9 @@ getAntinodes a b maxX maxY= let xa = fst $ coordinates a
ya = snd $ coordinates a
xb = fst $ coordinates b
yb = snd $ coordinates b
distX = abs $ xa - xb
distY = abs $ ya - yb
in if frequency a /= frequency b || coordinates a == coordinates b
then []
else if xa > xb && ya > yb
then filter (\c -> isInside c maxX maxY) [(xb - distX, yb - distY), (xa + distX, ya + distY)]
else if xa > xb && ya < yb
then filter (\c -> isInside c maxX maxY) [(xa + distX, ya - distY), (xb - distX, yb + distY)]
else if xa == xb && ya > yb
then filter (\c -> isInside c maxX maxY) [(xa, ya + distY), (xb, yb - distY)]
else if ya == yb && xa > xb
then filter (\c -> isInside c maxX maxY) [(xa + distX, ya), (xb - distX, yb)]
else getAntinodes b a maxX maxY
else filter (\c -> isInside c maxX maxY) [(2 * xa - xb, 2 * ya - yb), (2 * xb - xa, 2 * yb - ya)]
main = do
contents <- lines <$> readFile "day8.txt"

View File

@ -27,50 +27,13 @@ getAntinodes a b maxX maxY = let xa = fst $ coordinates a
ya = snd $ coordinates a
xb = fst $ coordinates b
yb = snd $ coordinates b
distX = abs $ xa - xb
distY = abs $ ya - yb
distX = xa - xb
distY = ya - yb
in if frequency a /= frequency b || coordinates a == coordinates b
then []
else if xa > xb && ya > yb
then filter (\c -> isInside c maxX maxY) [(xa + distX, ya + distY), (xb - distX, yb - distY)]
else filter (\c -> isInside c maxX maxY) [(2 * xa - xb, 2 * ya - yb), (2 * xb - xa, 2 * yb - ya)]
++ takeWhile (\c -> isInside c maxX maxY) (generateCoords (coordinates a) (distX, distY))
++ takeWhile (\c -> isInside c maxX maxY) (generateCoords (coordinates b) (-distX, -distY))
++ [coordinates a, coordinates b]
else if xa > xb && ya < yb
then filter (\c -> isInside c maxX maxY) [(xa + distX, ya - distY), (xb - distX, yb + distY)]
++ takeWhile (\c -> isInside c maxX maxY) (generateCoords (coordinates a) (distX, -distY))
++ takeWhile (\c -> isInside c maxX maxY) (generateCoords (coordinates b) (-distX, distY))
++ [coordinates a, coordinates b]
else if xa == xb && ya > yb
then filter (\c -> isInside c maxX maxY) [(xa, ya + distY), (xb, yb - distY)]
++ takeWhile (\c -> isInside c maxX maxY) (generateCoords (coordinates a) (0, distY))
++ takeWhile (\c -> isInside c maxX maxY) (generateCoords (coordinates b) (0, -distY))
++ [coordinates a, coordinates b]
else if xa == xb && ya < yb
then filter (\c -> isInside c maxX maxY) [(xa, ya - distY), (xb, yb + distY)]
++ takeWhile (\c -> isInside c maxX maxY) (generateCoords (coordinates a) (0, -distY))
++ takeWhile (\c -> isInside c maxX maxY) (generateCoords (coordinates b) (0, distY))
++ [coordinates a, coordinates b]
else if ya == yb && xa > xb
then filter (\c -> isInside c maxX maxY) [(xa + distX, ya), (xb - distX, yb)]
++ takeWhile (\c -> isInside c maxX maxY) (generateCoords (coordinates a) (distX, 0))
++ takeWhile (\c -> isInside c maxX maxY) (generateCoords (coordinates b) (-distX, 0))
++ [coordinates a, coordinates b]
else if ya == yb && xa < xb
then filter (\c -> isInside c maxX maxY) [(xa - distX, ya), (xb + distX, yb)]
++ takeWhile (\c -> isInside c maxX maxY) (generateCoords (coordinates a) (-distX, 0))
++ takeWhile (\c -> isInside c maxX maxY) (generateCoords (coordinates b) (distX, 0))
++ [coordinates a, coordinates b]
else if xa < xb && ya > yb
then filter (\c -> isInside c maxX maxY) [(xa - distX, ya + distY), (xb + distX, yb - distY)]
++ takeWhile (\c -> isInside c maxX maxY) (generateCoords (coordinates a) (-distX, distY))
++ takeWhile (\c -> isInside c maxX maxY) (generateCoords (coordinates b) (distX, -distY))
++ [coordinates a, coordinates b]
else filter (\c -> isInside c maxX maxY) [(xa - distX, ya - distY), (xb + distX, yb + distY)]
++ takeWhile (\c -> isInside c maxX maxY) (generateCoords (coordinates a) (-distX, -distY))
++ takeWhile (\c -> isInside c maxX maxY) (generateCoords (coordinates b) (distX, distY))
++ [coordinates a, coordinates b]
main = do
contents <- lines <$> readFile "day8.txt"