diff options
Diffstat (limited to 'aoc2023/src/day6')
-rw-r--r-- | aoc2023/src/day6/.gitignore | 1 | ||||
-rw-r--r-- | aoc2023/src/day6/solve.gleam | 85 |
2 files changed, 86 insertions, 0 deletions
diff --git a/aoc2023/src/day6/.gitignore b/aoc2023/src/day6/.gitignore new file mode 100644 index 0000000..ae40cea --- /dev/null +++ b/aoc2023/src/day6/.gitignore @@ -0,0 +1 @@ +input.txt
\ No newline at end of file diff --git a/aoc2023/src/day6/solve.gleam b/aoc2023/src/day6/solve.gleam new file mode 100644 index 0000000..98f39a1 --- /dev/null +++ b/aoc2023/src/day6/solve.gleam @@ -0,0 +1,85 @@ +import adglent.{First, Second} +import gleam/io +import gleam/string +import gleam/int +import gleam/list +import gleam/result + +type Race { + Race(time: Int, distance: Int) +} + +fn parse_with_bad_kerning(input: String) { + input + |> string.split("\n") + |> list.map(fn(str) { + str + |> string.split(" ") + |> list.map(int.parse) + |> result.values + }) + |> list.transpose + |> list.map(fn(ns) { + let [t, d] = ns + Race(t, d) + }) +} + +fn find_bound(race: Race, button_time: Int, step: Int) { + let travel_time = race.time - button_time + case button_time * travel_time > race.distance { + True -> button_time + False -> find_bound(race, button_time + step, step) + } +} + +fn lower_bound(race: Race) { + find_bound(race, 1, 1) +} + +fn upper_bound(race: Race) { + find_bound(race, race.time, -1) +} + +pub fn part1(input: String) { + { + use acc, race <- list.fold(parse_with_bad_kerning(input), 1) + acc * { upper_bound(race) - lower_bound(race) + 1 } + } + |> string.inspect +} + +fn parse_properly(input: String) { + input + |> string.replace(" ", "") + |> string.split("\n") + |> list.flat_map(string.split(_, ":")) + |> list.map(int.parse) + |> result.values +} + +pub fn part2(input: String) { + let [time, distance] = + input + |> parse_properly + + let race = Race(time, distance) + + upper_bound(race) - lower_bound(race) + 1 + |> string.inspect +} + +pub fn main() { + let assert Ok(part) = adglent.get_part() + let assert Ok(input) = adglent.get_input("6") + case part { + First -> + part1(input) + |> adglent.inspect + |> io.println + Second -> + part2(input) + |> adglent.inspect + |> io.println + } +} |