mirror of
https://github.com/bertptrs/adventofcode.git
synced 2025-12-25 12:50:32 +01:00
Actually commit the implementation.
This commit is contained in:
88
2016/src/day16.rs
Normal file
88
2016/src/day16.rs
Normal file
@@ -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<bool> = 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<bool> {
|
||||
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<bool> {
|
||||
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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user