From 56f8c5bc1f7a276273a6ddbdb974d2a66d58932a Mon Sep 17 00:00:00 2001 From: Ishan Jain Date: Thu, 16 Dec 2021 16:16:37 +0530 Subject: [PATCH] Improved Day 16 Part 2 by replacing strings with bitvec --- src/main.rs | 56 +++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 44 insertions(+), 12 deletions(-) diff --git a/src/main.rs b/src/main.rs index 2012e37..154eee9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,9 +1,9 @@ #![feature(test)] extern crate test; -use bitvec::view::BitView; +use bitvec::{order::Msb0, view::BitView}; -type BitSlice<'a> = &'a bitvec::slice::BitSlice; +type BitSlice<'a> = &'a bitvec::slice::BitSlice; const INPUTS: [&'static str; 2] = [ include_str!("../inputs/sample.txt"), @@ -110,6 +110,47 @@ impl Packet { }; out } + + fn value(&self) -> u64 { + match self.header.type_id { + 0 => self.sub_packets.iter().fold(0, |a, x| a + x.value()), + 1 => self.sub_packets.iter().fold(1, |a, x| a * x.value()), + 2 => self.sub_packets.iter().map(|x| x.value()).min().unwrap(), + 3 => self.sub_packets.iter().map(|x| x.value()).max().unwrap(), + 4 => self.literal.unwrap(), + 5 => { + let value1 = self.sub_packets[0].value(); + let value2 = self.sub_packets[1].value(); + + if value1 > value2 { + 1 + } else { + 0 + } + } + 6 => { + let value1 = self.sub_packets[0].value(); + let value2 = self.sub_packets[1].value(); + + if value1 < value2 { + 1 + } else { + 0 + } + } + 7 => { + let value1 = self.sub_packets[0].value(); + let value2 = self.sub_packets[1].value(); + + if value1 == value2 { + 1 + } else { + 0 + } + } + _ => unreachable!(), + } + } } fn take_u8(ip: &mut BitSlice, offset: usize) -> u8 { @@ -149,16 +190,7 @@ fn read_as_u8(ip: BitSlice) -> u8 { fn solution(input: &'static str) -> u64 { let packet = Packet::new(input.trim()); - let mut stack = vec![packet]; - - let mut answer = 0; - while let Some(packet) = stack.pop() { - answer += packet.header.version as u64; - - stack.extend(packet.sub_packets); - } - - answer + packet.value() } fn main() {