From fd5af9245bfc4596a39936b1f40d74441d44350f Mon Sep 17 00:00:00 2001 From: Bert Peters Date: Sun, 2 Dec 2018 10:36:45 +0100 Subject: [PATCH] Implement day 2. Part two was weird. --- 2018/inputs/02 | 250 ++++++++++++++++++++++++++++++++++++++++++++++ 2018/src/day02.rs | 107 ++++++++++++++++++++ 2018/src/main.rs | 8 +- 3 files changed, 362 insertions(+), 3 deletions(-) create mode 100644 2018/inputs/02 create mode 100644 2018/src/day02.rs diff --git a/2018/inputs/02 b/2018/inputs/02 new file mode 100644 index 0000000..65ade4b --- /dev/null +++ b/2018/inputs/02 @@ -0,0 +1,250 @@ +cvfueihajytpmrdkgsxfqplbxn +cbzueihajytnmrdkgtxfqplbwn +cvzucihajytomrdkgstfqplqwn +cvzueilajytomrdkgsxfqwnbwn +cvzueihajytomrdkgsgwqphbwn +wuzuerhajytomrdkgsxfqplbwn +cyzueifajybomrdkgsxfqplbwn +cvzueihajxtomrdkgpxfqplmwn +ivzfevhajytomrdkgsxfqplbwn +cvzueihajytomrdlgsxfqphbbn +uvzueihajjtomrdkgsxfqpobwn +cvzupihajytomrdkgsxfqplpwe +cvzueihajyvomrdkgsxfqplbrl +cczueihajytomrdkgsnfqpxbwn +cvzueigajytdmrdkgsxyqplbwn +cvzujihljytomrdkgsxuqplbwn +cvzueisajytomrddgsxkqplbwn +cvzneihajytomrdkgsgaqplbwn +cvzueihajytomrdkgsinmplbwn +cveueihajyromrdkgsxfqplown +cypueihajytotrdkgzxfqplbwn +cvzuoihajytomvdqgsxfqplbwn +cvzuekhejytwmrdkgsxfqplbwn +cvzseihajytomrdkgsxfqgmbwn +cvfuhihajytomrdkgsxfqplbwi +cvzueihujxtomrdkgsufqplbwn +cvzueihdjytomrdogsxfqplbwh +cvzueihdjyfohrdkgsxfqplbwn +cvtudihajytolrdkgsxfqplbwn +cvzueihajytymrdkgshzqplbwn +cvzuebhajytomxdkgsxfqplbwt +cvzulihajyxomrdkgsbfqplbwn +cvzueihajywomrdkgsxfqplbts +cvzueihajytouodkdsxfqplbwn +cvzueihajytomgdkgqxfqklbwn +cvzubihajytomvdkgsxfqplmwn +cvhueihajyyocrdkgsxfqplbwn +zvzueihajytourdkgsxflplbwn +cvzbeihajytomadkgsxfoplbwn +cvzueihajytomrdkgnxfqplbsl +cvfueihajftkmrdkgsxfqplbwn +cvzuexhajytomryugsxfqplbwn +cvzueihajytomsckgsxfqalbwn +cvzuexhajytomrdkbsxfqpluwn +cvzueihajytbmrtkgsxwqplbwn +cvzueihajytomrdigsxfqqlbsn +cvzweihajytomydkgsxfmplbwn +bvzteihajytimrdkgsxfqplbwn +cvzueihajytpmrdkgsxfcpbbwn +cvzueigsjltomrdkgsxfqplbwn +cvzueihajytomrikgsxfopldwn +cvzueihajstomrdkgsxfqplgon +cvzueimajytomrnkxsxfqplbwn +cvzleihagatomrdkgsxfqplbwn +cvbueihajotomrdkgsxfqjlbwn +cvzueihajytomrdkgsxfqppnvn +hvzueihajytomrdkghxfkplbwn +cvzueigajytxmrdkgsxfqplbjn +cvzueihaaxtokrdkgsxfqplbwn +cvzueihajyeomrdkgujfqplbwn +cvzueiwajpoomrdkgsxfqplbwn +cvzieidtjytomrdkgsxfqplbwn +cvzueihalytomrakbsxfqplbwn +wtzueihajytomrdkgsxfqplbwq +cvzuelhaiytomrdkgsxfqplcwn +cvzueihajytomrdkgsxfqslswd +cvzueihajytomrykgssfqplbon +cvzueihfjytovrdegsxfqplbwn +cvzueihajytomldqgsxfqplbwy +cvzleihjjytomrtkgsxfqplbwn +cvzueihaldtomrdtgsxfqplbwn +cvzueihajytzmrdkgsxfeplqwn +cvzueihrjytomddkgsxfqpgbwn +cyzulihajytokrdkgsxfqplbwn +cvsueihajytoordfgsxfqplbwn +fvzueyhajytomrdkgaxfqplbwn +cczueihajytobrdkgsefqplbwn +cvzueihajytomcdrgscfqplbwn +cvzuexhajyvomrdkgssfqplbwn +cvzsmihajyiomrdkgsxfqplbwn +cvzzeihajttomrdkgsxzqplbwn +cvzseihajytomrdkgsxfqpebvn +cvzueihajgthmrdkgsbfqplbwn +ruzueihajytomrdkgsxfqphbwn +cvzueihajytofrdkgsnfrplbwn +cvzuetdajytojrdkgsxfqplbwn +fvzueihajytomrdkghxfqpobwn +cvzueihsjytomrdkgsxfqglbxn +cvzueihajytowrdkgsxfqpsbun +cvzteihaiytomrdkfsxfqplbwn +cvzueihajytkmrdkrsxfqplvwn +cvzueihajyoomrdkasxfqjlbwn +lvzurihajytkmrdkgsxfqplbwn +cvzueihajyyomrdagsxfqelbwn +cvfueihajytomrdkgsxfqplbbx +cvwueihajytommdkgkxfqplbwn +cvzucicajytomrdkgsxcqplbwn +dvzueihahytgmrdkgsxfqplbwn +cvzuechajytomrdkgsxfqelwwn +cvzuekhajytomrdkgsxknplbwn +cvtueihajytomphkgsxfqplbwn +cvzueihabytnzrdkgsxfqplbwn +cvzusihajytomrdkgfxfqplban +cvfueihajytomcdfgsxfqplbwn +mvzueihapytomrdkgsxfdplbwn +cvzueihajytomhdkgsxmqppbwn +jvsueihajytomrdkgsxfqplbln +cvzujihajybomrdkgsxtqplbwn +cvzuekhawytomrdkgsxfqplbwc +svzueihanytomrdogsxfqplbwn +cvzujihajytodrdkgslfqplbwn +cvgdeihajytorrdkgsxfqplbwn +cvzbeihajytoprdkgsxfqplbyn +cvzueihkyytomjdkgsxfqplbwn +cvzuelhojytomrdkgsxfqjlbwn +evzueihajytimrdkgsxfqpsbwn +cvzueihajydomrdkjsxfqplbjn +ovzteihajytosrdkgsxfqplbwn +cvzueihajyaomrdzgsxfqplbgn +cvzuewhajmtomrdkgsufqplbwn +cvzueihajqtomhukgsxfqplbwn +cvzueihajytomzqkgsxfqplbwk +cazuewhakytomrdkgsxfqplbwn +clzueihatytomrdkgzxfqplbwn +dvzueihajytomqdkgsxfqpnbwn +cvzueidajdtomrdkgsxtqplbwn +cvzueihabytowrdkgsxoqplbwn +cvzujihwjytomrdkgsxeqplbwn +cvtuedhajytomrdkgsxfqplbbn +cvzueihajcgomrdkgsxfqplswn +cvzuephajyiomrdngsxfqplbwn +cvzueihajythmqdkgsxfqplbwf +cvzueitajytomrdkgsxfepvbwn +cvzueihajytomydkgsxfqplvwb +dvzueshajytomrddgsxfqplbwn +cvzueihajytomrdkgvxfqpwben +cvzueihajytomrdkgvxfpplwwn +cvzuefhajftomrdkgsxfqrlbwn +cvzueihajytpmrvkgsxfqplbcn +cvzueihajytohrdkgsxfqxnbwn +cvzueihajytomrdposxfqulbwn +cozueihajytomrpkgsxfqrlbwn +cvzuuihaxytomrdkgsxfqplbtn +cvzueihajytomrbzgsxyqplbwn +cveueihajyxoqrdkgsxfqplbwn +cvzueihajytomrkkgsxfqptbrn +cvzuezhajatomrdkssxfqplbwn +cpzueihajytomrdkgsxfhplbwo +lviueihajytomrekgsxfqplbwn +cvzueihwjytomrdkusxfyplbwn +cvzgeihajytomwdkgsxfrplbwn +cvzsejhzjytomrdkgsxfqplbwn +cvzuuihajytomrdkgsxfqdlbwz +cvzjeihajytomrdugsxftplbwn +cvzueihaxytomrrkgsxfmplbwn +cvzueihajgtomrdhgsxfqplwwn +cvzulihajytomedkgsxfqplewn +cvzueivajytomrdkmsxfqplbwc +cvzuervajytomrdkgsxfwplbwn +cvzuemhcjytomrdkgslfqplbwn +cvzyerhauytomrdkgsxfqplbwn +cvzueihaoytomrdkgsyfqplewn +cvzueihanytomrdkgsafkplbwn +cvzueihajvtomrdugsxfqpcbwn +chzueihajytamrdxgsxfqplbwn +cvzueihalytomrdsgsxfqplbln +cvzueihajytoyaykgsxfqplbwn +tlzueihajyeomrdkgsxfqplbwn +cvpueihajytbmrdkgsxfxplbwn +cvzueihajytomjdkgsxuqplkwn +cvzueihajygomrdkgkxfqplbwg +cvzueihajhtomrdkgbxsqplbwn +cvzurihajytomrdkgsafqplbwx +cdzuezhajytomrdkgsxrqplbwn +cvbueihajytotrwkgsxfqplbwn +cwzkeihajytomrdkgsxfqplbwh +cvzheihajytolrikgsxfqplbwn +cozuevhajytomrdkgkxfqplbwn +chzueihajytomrjkgsxfqulbwn +cvzueihkjyromrdkgsxvqplbwn +cvzveihajytomrdkgsxpqplnwn +cvzueihajytoirdkgsxfqihbwn +cvoueihajytomrdkgsxfqpdawn +pvzueihajytomrdkgnxfqplbfn +cvzueihakytomxdkgssfqplbwn +cvzueivajytomrdbgsxaqplbwn +cvzueihajytokrdkgszrqplbwn +cvzuevhajytomrdkgsxgqplbwi +cvzueihajylomrdkgsxflplbpn +hvzueihajytomvdkgsxfqplgwn +cvzleihajytymrrkgsxfqplbwn +crzueieajytomrdkgsxfqplbon +cszueihajytomrdlgqxfqplbwn +cvzueihacytomrdkgsxfjblbwn +cvzreihajytomrdkgsxfqplzun +cvzurihajytomrdkgsxiqplawn +uvzueihajyhovrdkgsxfqplbwn +cvzueihajyqodrdkgssfqplbwn +cvzwiihrjytomrdkgsxfqplbwn +cqzueihajytomrdkgjxfqplban +cvmueihajytoordkgsxfqplbyn +cypueihajytomrdkgzxfqplbwn +cvzueihajykomrdkgsmfqplbtn +cvzueidajytimrdkgsxfqpdbwn +cvzheihajytomrdkgsxfqpfewn +dvzueihajytumrdzgsxfqplbwn +cvzueixajytomrdkgsvfqplgwn +cvzuevhzjyzomrdkgsxfqplbwn +cvyeeihajytomrdkgsxnqplbwn +cvzueihajytomrdkggtpqplbwn +cvzceiyajytomrdkgexfqplbwn +cvzuelhajyyomrdkzsxfqplbwn +cvzhzihajygomrdkgsxfqplbwn +cvzueihwjytomrdkgsgfqplbrn +cvzsevhajytomrdkgqxfqplbwn +cvzueiuajytomrdkgsxfppebwn +nvzueihajytemrdkgsxwqplbwn +cvzueihajytocgdkgsxfqvlbwn +cczusihajytomrdkgsxfqplbpn +cmzueihajytomrdkbsxwqplbwn +cvzumfdajytomrdkgsxfqplbwn +cvzueihcjytomrdkgsxfqplbkl +cvzueihajytomawknsxfqplbwn +kvzueihijytomrdkgsxdqplbwn +cdzutihajytomrdkgsxfkplbwn +cvzufihadylomrdkgsxfqplbwn +cvzueihajytomrgkxsxfqphbwn +cvzuewhajyzomrdkgsxfqelbwn +cvzueihajytomrdkgqxfqelbwc +cvzueshajyoomrdkgsxfqflbwn +cvzueihajyromrekgixfqplbwn +chzugihajytomrdkgsxfqplawn +cvzueihajytomrdkgsxfhpmbwy +cvzueihacytodxdkgsxfqplbwn +cvzurihajytourdkgsdfqplbwn +cvzzeihmjytomrddgsxfqplbwn +cvzucyhajygomrdkgsxfqplbwn +ckzueihzjytomrdkgsxwqplbwn +cvlueihajmtozrdkgsxfqplbwn +cvzkeihajytomrdkgsxfqclbwc +cvzueihajytomrdkgsxgdplbwa +cvzueihyjytoxrdkgcxfqplbwn +cvzueizavytomfdkgsxfqplbwn +cvzueihajwtosrdkgsxfqllbwn +cvzueihajytomrdaksxfqpllwn +cvzuuihojytombdkgsxfqplbwn +cvzuiibajytpmrdkgsxfqplbwn +cvzueihajyuomydkgsxfqplzwn +cvzueihajytimrmkgsxfqplfwn +cvzueihajytomrdkgzxfqpljwo diff --git a/2018/src/day02.rs b/2018/src/day02.rs new file mode 100644 index 0000000..2bede47 --- /dev/null +++ b/2018/src/day02.rs @@ -0,0 +1,107 @@ +use std::collections::HashMap; +use std::io; +use std::io::prelude::*; + +use common; + +/// Count the occurrence characters in a string. +fn count_chars(word: &str) -> HashMap { + let mut counts: HashMap = HashMap::new(); + + for c in word.chars() { + *counts.entry(c).or_insert(0) += 1; + } + + counts +} + +/// Compute the number of different positions between two strings. +fn distance(a: &str, b: &str) -> usize { + let mut dist = 0; + + for (a, b) in a.chars().zip(b.chars()) { + if a != b { + dist += 1; + } + } + + dist +} + +#[derive(Default)] +pub struct Day02 { +} + +impl Day02 { + pub fn new() -> Day02 { + Default::default() + } +} + +impl common::Solution for Day02 { + fn part1(&mut self, input: &mut io::Read) -> String { + let reader = io::BufReader::new(input); + let mut twos = 0; + let mut threes = 0; + + for line in reader.lines() { + let counts = count_chars(&line.unwrap()); + + if counts.values().any(|&x| x == 2) { + twos += 1; + } + + if counts.values().any(|&x| x == 3) { + threes += 1; + } + } + + return format!("{}", twos * threes); + } + + fn part2(&mut self, input: &mut io::Read) -> String { + let mut ids: Vec = io::BufReader::new(input) + .lines() + .map(|x| x.unwrap()).collect(); + ids.sort_unstable(); + + for id1 in &ids { + for id2 in &ids { + if id2 > id1 { + break; + } + + if distance(id1, id2) == 1 { + let mut answer = String::new(); + for (a, b) in id1.chars().zip(id2.chars()) { + if a == b { + answer.push(a); + } + } + return answer; + } + } + } + unreachable!("Input does not contain a valid solution."); + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_count_letters() { + let result = count_chars("abcaba"); + + assert_eq!(3, *result.get(&'a').unwrap()); + assert_eq!(2, *result.get(&'b').unwrap()); + assert_eq!(1, *result.get(&'c').unwrap()) + } + + #[test] + fn test_distance() { + assert_eq!(2, distance("abcde", "axcye")); + assert_eq!(1, distance("fghij", "fguij")); + } +} diff --git a/2018/src/main.rs b/2018/src/main.rs index 203bb46..3032044 100644 --- a/2018/src/main.rs +++ b/2018/src/main.rs @@ -5,10 +5,12 @@ use std::io; pub mod common; pub mod day01; +pub mod day02; fn get_impl(day: &str) -> Box { match day.parse() { - Ok(1) => { Box::new(day01::Day01::new()) } + Ok(1) => Box::new(day01::Day01::new()), + Ok(2) => Box::new(day02::Day02::new()), Ok(val) => panic!("Unimplemented day {}", val), _ => panic!("Invalid number"), } @@ -54,8 +56,8 @@ mod tests { #[test] fn test_get_impl() { // Verify that we can load all days - let last_implemented = 1; - for d in 1..(last_implemented + 1) { + let last_implemented = 2; + for d in 1..=last_implemented { get_impl(&format!("{}", d)); } }