From 7a5f1983f9189422ad5e12afde11d11bec30a3f1 Mon Sep 17 00:00:00 2001 From: Tomasz Chojnacki Date: Fri, 22 Dec 2023 18:31:14 +0100 Subject: Solve part 1 of day 20 --- aoc-2020-gleam/src/ext/intx.gleam | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) (limited to 'aoc-2020-gleam/src/ext/intx.gleam') diff --git a/aoc-2020-gleam/src/ext/intx.gleam b/aoc-2020-gleam/src/ext/intx.gleam index 077b4f2..5c9bcc0 100644 --- a/aoc-2020-gleam/src/ext/intx.gleam +++ b/aoc-2020-gleam/src/ext/intx.gleam @@ -1,4 +1,5 @@ import gleam/int +import gleam/bool import gleam/order.{Eq, Gt, Lt} pub fn is_between(number: Int, min: Int, and max: Int) { @@ -9,7 +10,7 @@ pub fn ceil_divide(dividend: Int, by divisor: Int) -> Int { { dividend + divisor - 1 } / divisor } -fn gcd(a: Int, b: Int) -> Int { +pub fn gcd(a: Int, b: Int) -> Int { case b == 0 { True -> a False -> gcd(b, a % b) @@ -22,3 +23,15 @@ pub fn lcm(a: Int, b: Int) -> Int { Lt -> { b / gcd(a, b) } * a } } + +fn do_reverse_bits(val: Int, rev: Int, length: Int) -> Int { + use <- bool.guard(when: length == 0, return: rev) + let lsb = int.bitwise_and(val, 1) + let val = int.bitwise_shift_right(val, 1) + let rev = int.bitwise_shift_left(rev, 1) + do_reverse_bits(val, int.bitwise_or(rev, lsb), length - 1) +} + +pub fn reverse_bits(val: Int, length: Int) -> Int { + do_reverse_bits(val, 0, length) +} -- cgit v1.2.3