Commit c809f3bb authored by Nicolas Lenz's avatar Nicolas Lenz ❄️
Browse files

Starting Day 6

parent 9372a0be
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -4,7 +4,7 @@ cabal-version: 1.12
--
-- see: https://github.com/sol/hpack
--
-- hash: 7f535108a3ad03db9bb5b3d1976f1e0422bbe0eddd7da2483c1581fa3dd7c089
-- hash: 75f48b18b69a82c9f1087410f03812dc6fc808bbb2528a2b9c06446be8979f29

name:           advent-of-code
version:        0.0.0
@@ -32,6 +32,7 @@ executable advent-of-code
      Day03
      Day04
      Day05
      Day06
      Paths_advent_of_code
  hs-source-dirs:
      src

input/day06

0 → 100644
+50 −0
Original line number Diff line number Diff line
357, 59
312, 283
130, 47
89, 87
87, 58
158, 169
182, 183
300, 318
82, 257
200, 194
71, 259
112, 67
82, 163
107, 302
58, 194
40, 88
288, 339
64, 245
243, 302
41, 43
147, 276
143, 116
103, 178
262, 226
253, 157
313, 71
202, 236
353, 192
96, 74
167, 50
125, 132
90, 315
174, 232
185, 237
126, 134
152, 191
104, 315
283, 90
95, 193
252, 286
48, 166
69, 75
48, 349
59, 124
334, 95
263, 134
50, 314
196, 66
342, 221
60, 217

src/Day06.hs

0 → 100644
+47 −0
Original line number Diff line number Diff line
module Day06 (part1, part2) where

import Text.Parsec
import Data.Maybe
import Data.Either
import Data.List

-- Reduces the input and returns the length.
part1 :: [String] -> String
part1 input = show $ "…"  where
    coords = rights $ map (parse parseCoord "input/day06") input

-- Reduces the input once with every character removed and returns the length of the shortest reduct.
part2 :: [String] -> String
part2 [input] = show $ "…"

example :: [String]
example = ["1, 1", "1, 6", "8, 3", "3, 4", "5, 5", "8, 9"]


-- |Checks whether the coordinate at the given index will is bounded, i.e. whether exists coordinates with bigger and smaller x- and y-values.
isBounded :: [(Int, Int)] -> Int -> Bool
isBounded coords i = existsSmallerX && existsBiggerX && existsSmallerY && existsBiggerY where
    from = coords !! i
    existsSmallerX = isJust $ find ((>(fst from)). fst) coords
    existsBiggerX = isJust $ find ((<(fst from)). fst) coords
    existsSmallerY = isJust $ find ((>(snd from)). snd) coords
    existsBiggerY = isJust $ find ((<(snd from)). snd) coords

nearestCoordIndex :: [(Int, Int)] -> (Int, Int) -> Maybe Int
nearestCoordIndex coords from = case findIndices distMinimal coords of
    [] -> Nothing
    [coord] -> Just coord
    _ -> Nothing
    where
        distMinimal :: (Int, Int) -> Bool
        distMinimal coord = all (\otherCoord -> from `distance` otherCoord >= from `distance` coord) coords

distance :: (Int, Int) -> (Int, Int) -> Int
distance (x1,y1) (x2,y2) = abs (x1 - x2) + abs (y1 - y2)

parseCoord :: Parsec String () (Int, Int)
parseCoord = do
    x <- many1 digit
    string ", "
    y <- many1 digit
    return (read x, read y)
+4 −1
Original line number Diff line number Diff line
@@ -4,6 +4,7 @@ import Day02
import Day03
import Day04
import Day05
import Day06


solutions :: [((String, String), [String] -> String)]
@@ -17,7 +18,9 @@ solutions = [
    (("04", "1"), Day04.part1),
    (("04", "2"), Day04.part2),
    (("05", "1"), Day05.part1),
    (("05", "2"), Day05.part2)]
    (("05", "2"), Day05.part2),
    (("06", "1"), Day06.part1),
    (("06", "2"), Day06.part2)]

main :: IO ()
main = do