From b519e0bad2f6b79d3e5bb0d705388a4dec0e3ce8 Mon Sep 17 00:00:00 2001 From: Joseph Montanaro Date: Fri, 3 Dec 2021 14:08:03 -0800 Subject: [PATCH] day 3 part 1 --- 2021/src/day3.rs | 36 ++++++++++++++++++++++++++++++++++++ 2021/src/main.rs | 6 +++--- 2 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 2021/src/day3.rs diff --git a/2021/src/day3.rs b/2021/src/day3.rs new file mode 100644 index 0000000..4902b93 --- /dev/null +++ b/2021/src/day3.rs @@ -0,0 +1,36 @@ +use color_eyre::eyre; + + +pub fn part1(numbers: &Vec) -> u64 { + let mut bit_diffs: [isize; 12] = [0; 12]; + for num in numbers { + for i in 0..11 { + if num & (1 << i) > 0 { + bit_diffs[i] += 1 + } + else { + bit_diffs[i] -= 1 + } + } + } + + let mut gamma = 0u16; + for (i, sum) in bit_diffs.iter().enumerate() { + let bit = if *sum >= 0 {1} else {0}; + gamma |= bit << i; + } + + let epsilon = !gamma & (65535 >> 4); // since these are really only 12-bit numbers we have to clear the 4 spurious 1's that come from inverting epsilon + epsilon as u64 * gamma as u64 +} + + +pub fn run(data: &str) -> eyre::Result<()> { + let mut nums = Vec::new(); + for line in data.lines() { + nums.push(u16::from_str_radix(line, 2)?); + } + + println!("One: {}", part1(&nums)); + Ok(()) +} \ No newline at end of file diff --git a/2021/src/main.rs b/2021/src/main.rs index 0405bb6..da91b81 100644 --- a/2021/src/main.rs +++ b/2021/src/main.rs @@ -4,13 +4,13 @@ use color_eyre::eyre; mod lib; use lib::load; -mod day2; +mod day3; fn main() -> eyre::Result<()> { - let data = load("data/02.txt")?; + let data = load("data/03.txt")?; let start = Instant::now(); - day2::run(&data)?; + day3::run(&data)?; let (dur, unit) = format_ns(start.elapsed().as_nanos()); println!("Completed in {}{}", dur, unit); Ok(())