aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTomasz Chojnacki <tomaszchojnacki2001@gmail.com>2023-12-23 14:13:37 +0100
committerTomasz Chojnacki <tomaszchojnacki2001@gmail.com>2023-12-23 14:13:37 +0100
commitd673400025f68968514cfec7205281745ea35667 (patch)
tree14f79bdf476e41da25567ae314a0ce3bddc04bb2
parent8bafdaf384fd144a61a7d23661a6cc8d56b5d810 (diff)
downloadgleam_aoc2020-d673400025f68968514cfec7205281745ea35667.tar.gz
gleam_aoc2020-d673400025f68968514cfec7205281745ea35667.zip
Finish day 25
-rw-r--r--aoc-2020-gleam/src/days/day25.gleam48
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
+}