diff options
| -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"))      }  } | 
