use aoc_runner_derive::aoc; use json::{parse, JsonValue}; use regex::Regex; #[aoc(day12, part1)] fn part1(input: &str) -> i64 { Regex::new(r"-?\d+") .unwrap() .find_iter(input) .map(|m| m.as_str().parse::().unwrap()) .sum() } #[aoc(day12, part2)] fn part2(input: &str) -> i64 { let json = parse(input).unwrap(); sum(&json) } fn sum(json: &JsonValue) -> i64 { match json { JsonValue::Null => 0, JsonValue::Short(_) => 0, JsonValue::String(_) => 0, JsonValue::Number(_) => json.as_i64().unwrap(), JsonValue::Boolean(_) => 0, JsonValue::Object(o) => { if o.iter().any(|(_, value)| { value.is_string() && Some("red") == value.as_str() }) { 0 } else { o.iter().map(|(_key, value)| sum(value)).sum() } } JsonValue::Array(a) => a.iter().map(|e| sum(e)).sum(), } } #[cfg(test)] mod tests { use super::*; #[test] fn part1_example() { assert_eq!(part1("[1,2,3]"), 6); assert_eq!(part1("{\"a\":2,\"b\":4}"), 6); assert_eq!(part1(r"[[[3]]]"), 3); assert_eq!(part1(r#"{"a":{"b":4},"c":-1}"#), 3); } }