From 3d53a0ab2b548fed32f6a0a79283c486949163d9 Mon Sep 17 00:00:00 2001 From: Bert Peters Date: Sat, 10 Dec 2016 00:21:55 +0100 Subject: [PATCH] Solution for day 9 part 2. --- 2016/day-09/Cargo.toml | 1 + 2016/day-09/src/main.rs | 63 ++++++++++++++++++++++++++--------------- 2 files changed, 41 insertions(+), 23 deletions(-) diff --git a/2016/day-09/Cargo.toml b/2016/day-09/Cargo.toml index d04ea18..4c7781f 100644 --- a/2016/day-09/Cargo.toml +++ b/2016/day-09/Cargo.toml @@ -5,3 +5,4 @@ authors = ["Bert Peters "] [dependencies] regex = "^0.1" +lazy_static = "^0.2" diff --git a/2016/day-09/src/main.rs b/2016/day-09/src/main.rs index c4a4ce2..b789949 100644 --- a/2016/day-09/src/main.rs +++ b/2016/day-09/src/main.rs @@ -1,3 +1,4 @@ +#[macro_use] extern crate lazy_static; extern crate regex; use regex::Regex; @@ -5,6 +6,43 @@ use std::env; use std::io::prelude::*; use std::fs::File; +fn decoded_len(content: &str, recurse: bool) -> i64 +{ + lazy_static!{ + static ref R: Regex = Regex::new(r"\((\d+)x(\d+)\)").expect("Failed to compile regex"); + } + + let mut len = 0; + let mut pos = 0; + + loop { + let todo = &content[pos..]; + match R.captures(todo) { + Some(captures) => { + let start = todo.find(&captures[0]).unwrap(); + pos += start; + len += start as i64; + + let (length, amount) = (captures[1].parse::().unwrap(), captures[2].parse::().unwrap()); + + let part = &todo[start + captures[0].len()..start + captures[0].len() + length as usize]; + + let part_length = if recurse { decoded_len(part, true) } else { length }; + + pos += captures[0].len() as usize + length as usize; + len += part_length * amount; + }, + None => { + // No more markers remaining, just append the rest + len += content.len() as i64 - pos as i64; + break; + }, + } + } + + return len; +} + fn main() { let args: Vec = env::args().collect(); let mut f = File::open(&args[1]).expect("Could not open file"); @@ -14,28 +52,7 @@ fn main() { let content = data.trim(); - let r = Regex::new(r"\((\d+)x(\d+)\)").expect("Failed to compile regex"); - - let mut len = 0; - let mut pos = 0; - - loop { - let todo = &content[pos..]; - match r.captures(todo) { - Some(captures) => { - let (start, _) = r.find(todo).unwrap(); - let (length, amount) = (captures[1].parse::().unwrap(), captures[2].parse::().unwrap()); - pos += start + captures[0].len() as usize + length as usize; - len += start as i64 + length as i64 * amount; - }, - None => { - // No more markers remaining, just append the rest - len += content.len() as i64 - pos as i64; - break; - }, - } - } - - println!("Decoded text is {} long", len); + println!("Decoded v1 is {} long", decoded_len(content, false)); + println!("Decoded v2 is {} long", decoded_len(content, true)); }