From 1d6edda98bd072271fa2baf8485563bedaf16b37 Mon Sep 17 00:00:00 2001 From: Bert Peters Date: Tue, 13 Nov 2018 11:54:56 +0100 Subject: [PATCH] Actually commit the implementation. --- 2016/src/day16.rs | 88 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 2016/src/day16.rs diff --git a/2016/src/day16.rs b/2016/src/day16.rs new file mode 100644 index 0000000..8b13d79 --- /dev/null +++ b/2016/src/day16.rs @@ -0,0 +1,88 @@ +use std::io; +use std::io::prelude::*; +use itertools::Itertools; +use common; + + +#[derive(Default)] +pub struct Day16 { +} + +impl Day16 { + pub fn new() -> Day16 { + Default::default() + } + + fn solve(&self, input: &mut io::Read, target_size: usize) -> String { + let mut reader = io::BufReader::new(input); + let mut line = String::new(); + reader.read_line(&mut line).expect("No input!"); + + let data: Vec = line.trim().chars().map(|x| x == '1').collect(); + let filled = fill(&data, target_size); + let sum = checksum(&filled); + + sum.iter().map(|b| if *b { '1' } else { '0' }).collect() + } +} + + +impl common::Solution for Day16 { + + fn part1(&mut self, input: &mut io::Read) -> String { + self.solve(input, 272) + } + + fn part2(&mut self, input: &mut io::Read) -> String { + self.solve(input, 35651584) + } +} + + +fn fill(initial: &[bool], size: usize) -> Vec { + let mut a = initial.to_vec(); + while a.len() < size { + let mut b = a.clone(); + a.push(false); + b.reverse(); + a.extend(b.iter().map(|x| !x)); + } + + a.truncate(size); + a +} + +fn checksum(initial: &[bool]) -> Vec { + let mut checksum = initial.to_vec(); + while checksum.len() % 2 == 0 { + let mut new_checksum = Vec::new(); + for (a, b) in checksum.into_iter().tuples() { + new_checksum.push(a == b); + } + checksum = new_checksum; + } + checksum +} + + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_fill() { + assert_eq!(vec![true, false, false, false, false, + false, true, true, true, true, + false, false, true, false, false, + false, false, true, true, true], fill(&[true, false, false, false, false], 20)); + } + + #[test] + fn test_checksum() { + let result = checksum(&[true, false, false, false, false, + false, true, true, true, true, + false, false, true, false, false, + false, false, true, true, true]); + assert_eq!(vec![false, true, true, false, false], result); + } +}