From 4ecfe6624434f15f3ac00142f7a3c4d78bfab3a1 Mon Sep 17 00:00:00 2001 From: Tomasz Chojnacki Date: Wed, 5 Apr 2023 21:07:23 +0200 Subject: Finish day 10 --- aoc-2020-gleam/src/days/day10.gleam | 67 +++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 aoc-2020-gleam/src/days/day10.gleam (limited to 'aoc-2020-gleam/src/days/day10.gleam') diff --git a/aoc-2020-gleam/src/days/day10.gleam b/aoc-2020-gleam/src/days/day10.gleam new file mode 100644 index 0000000..ea97ed0 --- /dev/null +++ b/aoc-2020-gleam/src/days/day10.gleam @@ -0,0 +1,67 @@ +import gleam/io +import gleam/int +import gleam/list +import gleam/bool +import ext/listx +import ext/pairx +import ext/genericx as genx +import ext/resultx as resx +import util/input_util +import util/cache.{Cache} + +const outlet_joltage = 0 + +const max_increase = 3 + +fn process_adapters(numbers: List(Int)) -> List(Int) { + let numbers = list.sort(numbers, by: int.compare) + + let device_joltage = + numbers + |> list.last + |> resx.assert_unwrap + |> int.add(max_increase) + + list.flatten([[outlet_joltage], numbers, [device_joltage]]) +} + +fn part1(numbers: List(Int)) -> Int { + let adapters = process_adapters(numbers) + let diffs = + adapters + |> list.window_by_2 + |> list.map(with: pairx.difference) + + let ones = listx.count(diffs, satisfying: genx.equals(_, 1)) + let threes = listx.count(diffs, satisfying: genx.equals(_, 3)) + ones * threes +} + +fn arrangements(number: Int, adapters: List(Int), cache: Cache(Int, Int)) -> Int { + use <- bool.guard(when: number == 0, return: 1) + use <- bool.guard(when: !list.contains(adapters, number), return: 0) + use <- cache.memoize(with: cache, this: number) + + list.range(from: 1, to: max_increase) + |> list.map(with: fn(j) { arrangements(number - j, adapters, cache) }) + |> int.sum +} + +fn part2(numbers: List(Int)) -> Int { + let adapters = process_adapters(numbers) + let device_joltage = resx.assert_unwrap(list.last(adapters)) + use cache <- cache.create() + arrangements(device_joltage, adapters, cache) +} + +pub fn run() -> Nil { + let test = input_util.read_numbers("test10") + let assert 220 = part1(test) + let assert 19_208 = part2(test) + + let input = input_util.read_numbers("day10") + io.debug(part1(input)) + io.debug(part2(input)) + + Nil +} -- cgit v1.2.3