Skip to content

Instantly share code, notes, and snippets.

@hovsater
Last active December 4, 2022 08:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hovsater/f70c8f778759d8cfc797fdad614b1c80 to your computer and use it in GitHub Desktop.
Save hovsater/f70c8f778759d8cfc797fdad614b1c80 to your computer and use it in GitHub Desktop.
Solution to Advent of Code 2022, Day 4.
module Day04 exposing (partOne, partTwo)
import Parser exposing ((|.), (|=), Parser, Step(..), int, loop, map, oneOf, run, spaces, succeed, symbol)
type alias Range =
( Int, Int )
type alias RangePair =
( Range, Range )
rangePairContainment : RangePair -> Bool
rangePairContainment ( ( a1, a2 ), ( b1, b2 ) ) =
a1 >= b1 && a2 <= b2 || b1 >= a1 && b2 <= a2
rangePairOverlap : RangePair -> Bool
rangePairOverlap ( ( a1, a2 ), ( b1, b2 ) ) =
a1 >= b1 && a1 <= b2 || b1 >= a1 && b1 <= a2
parseInput : String -> List RangePair
parseInput input =
let
parseRange : Parser Range
parseRange =
succeed Tuple.pair
|= int
|. symbol "-"
|= int
parseRangePair : Parser RangePair
parseRangePair =
succeed Tuple.pair
|= parseRange
|. symbol ","
|= parseRange
|. spaces
parseRangePairs : Parser (List RangePair)
parseRangePairs =
loop []
(\rangePairs ->
oneOf
[ parseRangePair |> map (\rangePair -> Loop (rangePair :: rangePairs))
, succeed <| Done (List.reverse rangePairs)
]
)
in
run parseRangePairs input |> Result.withDefault []
partOne : String -> Int
partOne input =
input
|> parseInput
|> List.filter rangePairContainment
|> List.length
partTwo : String -> Int
partTwo input =
input
|> parseInput
|> List.filter rangePairOverlap
|> List.length
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment