diff options
author | Tomasz Chojnacki <tomaszchojnacki2001@gmail.com> | 2023-12-23 14:13:37 +0100 |
---|---|---|
committer | Tomasz Chojnacki <tomaszchojnacki2001@gmail.com> | 2023-12-23 14:13:37 +0100 |
commit | d673400025f68968514cfec7205281745ea35667 (patch) | |
tree | 14f79bdf476e41da25567ae314a0ce3bddc04bb2 | |
parent | 8bafdaf384fd144a61a7d23661a6cc8d56b5d810 (diff) | |
download | gleam_aoc2020-d673400025f68968514cfec7205281745ea35667.tar.gz gleam_aoc2020-d673400025f68968514cfec7205281745ea35667.zip |
Finish day 25
-rw-r--r-- | aoc-2020-gleam/src/days/day25.gleam | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/aoc-2020-gleam/src/days/day25.gleam b/aoc-2020-gleam/src/days/day25.gleam new file mode 100644 index 0000000..b70d720 --- /dev/null +++ b/aoc-2020-gleam/src/days/day25.gleam @@ -0,0 +1,48 @@ +import gleam/io +import gleam/bool +import util/input_util + +const mod = 20_201_227 + +const init_subject = 7 + +fn forward_transform(value: Int, subject: Int, loop: Int) -> Int { + use <- bool.guard(when: loop == 0, return: value) + forward_transform({ value * subject } % mod, subject, loop - 1) +} + +fn backward_transform(value: Int, subject: Int, loop: Int, result: Int) -> Int { + use <- bool.guard(when: value == result, return: loop) + backward_transform({ value * subject } % mod, subject, loop + 1, result) +} + +fn find_result(subject: Int, loop: Int) -> Int { + forward_transform(1, subject, loop) +} + +fn find_loop(subject: Int, result: Int) -> Int { + backward_transform(1, subject, 0, result) +} + +fn part1(keys: List(Int)) -> Int { + let assert [card_key, door_key] = keys + + let card_loop = find_loop(init_subject, card_key) + let card_result = find_result(door_key, card_loop) + + let door_loop = find_loop(init_subject, door_key) + let door_result = find_result(card_key, door_loop) + + let assert True = card_result == door_result + card_result +} + +pub fn main() -> Nil { + let testing = input_util.read_numbers("test25") + let assert 14_897_079 = part1(testing) + + let input = input_util.read_numbers("day25") + io.debug(part1(input)) + + Nil +} |