diff options
author | tomsmeding <tom.smeding@gmail.com> | 2018-12-14 10:32:15 +0100 |
---|---|---|
committer | tomsmeding <tom.smeding@gmail.com> | 2018-12-14 10:32:15 +0100 |
commit | 8a2f05141568fd3a5b29bb6e0623f4d96fd4d43b (patch) | |
tree | 5a83e423df448a1fe67903d94646aa6f2f4d6c28 | |
parent | 17c7296e7aa5672e74aa41f6eb41cc09977d91e6 (diff) |
Day 14
-rw-r--r-- | 2018/input/14.txt | 1 | ||||
-rw-r--r-- | 2018/src/day14.rs | 46 | ||||
-rw-r--r-- | 2018/src/main.rs | 4 |
3 files changed, 50 insertions, 1 deletions
diff --git a/2018/input/14.txt b/2018/input/14.txt new file mode 100644 index 0000000..7157be5 --- /dev/null +++ b/2018/input/14.txt @@ -0,0 +1 @@ +409551 diff --git a/2018/src/day14.rs b/2018/src/day14.rs new file mode 100644 index 0000000..ed9bb74 --- /dev/null +++ b/2018/src/day14.rs @@ -0,0 +1,46 @@ +use std::io; +use std::io::BufRead; + +fn simulate(list: &mut Vec<u8>, ptr1: &mut usize, ptr2: &mut usize) { + let n1 = (list[*ptr1] + list[*ptr2]) / 10; + let n2 = (list[*ptr1] + list[*ptr2]) % 10; + + if n1 != 0 { list.push(n1); } + list.push(n2); + + *ptr1 = (*ptr1 + list[*ptr1] as usize + 1) % list.len(); + *ptr2 = (*ptr2 + list[*ptr2] as usize + 1) % list.len(); +} + +pub fn main<T: BufRead>(reader: T) -> io::Result<(String, String)> { + let basestr = reader.lines().next().unwrap().unwrap(); + let basenum = basestr.parse::<usize>().unwrap(); + + let mut list: Vec<u8> = Vec::with_capacity(basenum + 11); + list.push(3); + list.push(7); + let mut ptr1 = 0; + let mut ptr2 = 1; + + while list.len() < basenum + 10 { + simulate(&mut list, &mut ptr1, &mut ptr2); + } + + let part1 = String::from_utf8(list[basenum..basenum+10].iter().map(|n| n + 48).collect()).unwrap(); + + let mut part2 = 0; + + let needle: Vec<u8> = basestr.as_bytes().iter().map(|n| n - 48).collect(); + for i in 0.. { + if list.len() < i + needle.len() { + simulate(&mut list, &mut ptr1, &mut ptr2); + } + + if list[i..i+needle.len()] == *needle { + part2 = i; + break; + } + } + + Ok((part1, part2.to_string())) +} diff --git a/2018/src/main.rs b/2018/src/main.rs index 27125d3..447005e 100644 --- a/2018/src/main.rs +++ b/2018/src/main.rs @@ -18,8 +18,9 @@ mod day10; mod day11; mod day12; mod day13; +mod day14; -static NUM_DAYS: i32 = 13; +static NUM_DAYS: i32 = 14; fn day_switch<T: BufRead>(day: i32, reader: T) -> io::Result<(String, String)> { match day { @@ -36,6 +37,7 @@ fn day_switch<T: BufRead>(day: i32, reader: T) -> io::Result<(String, String)> { 11 => day11::main(reader), 12 => day12::main(reader), 13 => day13::main(reader), + 14 => day14::main(reader), _ => Err(Error::new(ErrorKind::Other, "Invalid day")) } } |