52 lines
1.2 KiB
Rust
52 lines
1.2 KiB
Rust
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::<i64>().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);
|
|
}
|
|
}
|