From ac605225d5405120d1f8b89290fec5662f1dbb4d Mon Sep 17 00:00:00 2001 From: dece Date: Mon, 8 Nov 2021 20:54:57 +0100 Subject: [PATCH] 2015 day 12 --- 2015/Cargo.lock | 32 ++++++++++++++++++++++++++++++++ 2015/Cargo.toml | 1 + 2015/src/bin/day12.rs | 40 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 73 insertions(+) create mode 100644 2015/src/bin/day12.rs diff --git a/2015/Cargo.lock b/2015/Cargo.lock index 5889f29..7997ea9 100644 --- a/2015/Cargo.lock +++ b/2015/Cargo.lock @@ -1,14 +1,46 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +version = 3 + [[package]] name = "aoc2015" version = "0.1.0" dependencies = [ "md5", + "serde_json", ] +[[package]] +name = "itoa" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" + [[package]] name = "md5" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "490cc448043f947bae3cbee9c203358d62dbee0db12107a74be5c30ccfd09771" + +[[package]] +name = "ryu" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" + +[[package]] +name = "serde" +version = "1.0.130" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f12d06de37cf59146fbdecab66aa99f9fe4f78722e3607577a5375d66bd0c913" + +[[package]] +name = "serde_json" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e466864e431129c7e0d3476b92f20458e5879919a0596c6472738d9fa2d342f8" +dependencies = [ + "itoa", + "ryu", + "serde", +] diff --git a/2015/Cargo.toml b/2015/Cargo.toml index b0adb2c..2bf4f84 100644 --- a/2015/Cargo.toml +++ b/2015/Cargo.toml @@ -9,3 +9,4 @@ name = "aoc" [dependencies] md5 = "0.7.0" +serde_json = "1.0.69" diff --git a/2015/src/bin/day12.rs b/2015/src/bin/day12.rs new file mode 100644 index 0000000..b494698 --- /dev/null +++ b/2015/src/bin/day12.rs @@ -0,0 +1,40 @@ +use serde_json::{self, Value}; + +use aoc::input; + +fn main() { + let json: Value = serde_json::from_str(&input::read_chars()).unwrap(); + + // Part 1 + let sum_num = sum_numbers(&json); + println!("Sum of numbers: {}", sum_num); + + // Part 2 + let sum_num_2 = sum_numbers_2(&json); + println!("Sum of un-red numbers: {}", sum_num_2); +} + +fn sum_numbers(value: &Value) -> i64 { + match value { + Value::Number(number) => number.as_i64().unwrap(), + Value::Array(array) => array.iter().map(|v| sum_numbers(v)).sum(), + Value::Object(map) => map.values().map(|v| sum_numbers(v)).sum(), + _ => 0, + } +} + +fn sum_numbers_2(value: &Value) -> i64 { + match value { + Value::Number(number) => number.as_i64().unwrap(), + Value::Array(array) => array.iter().map(|v| sum_numbers_2(v)).sum(), + Value::Object(map) => { + for str_prop in map.values().map(|p| p.as_str()) { + if str_prop == Some("red") { + return 0; + } + } + map.values().map(|v| sum_numbers_2(v)).sum() + } + _ => 0, + } +}