day 13
parent
2b36afe92b
commit
ae7dae8b79
@ -0,0 +1,89 @@
|
||||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
version = 3
|
||||
|
||||
[[package]]
|
||||
name = "day13"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"serde",
|
||||
"serde_json",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "itoa"
|
||||
version = "1.0.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4217ad341ebadf8d8e724e264f13e593e0648f5b3e94b3896a5df283be015ecc"
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro2"
|
||||
version = "1.0.47"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5ea3d908b0e36316caf9e9e2c4625cdde190a7e6f440d794667ed17a1855e725"
|
||||
dependencies = [
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "quote"
|
||||
version = "1.0.21"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ryu"
|
||||
version = "1.0.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09"
|
||||
|
||||
[[package]]
|
||||
name = "serde"
|
||||
version = "1.0.150"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e326c9ec8042f1b5da33252c8a37e9ffbd2c9bef0155215b6e6c80c790e05f91"
|
||||
dependencies = [
|
||||
"serde_derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_derive"
|
||||
version = "1.0.150"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "42a3df25b0713732468deadad63ab9da1f1fd75a48a15024b50363f128db627e"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_json"
|
||||
version = "1.0.89"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "020ff22c755c2ed3f8cf162dbb41a7268d934702f3ed3631656ea597e08fc3db"
|
||||
dependencies = [
|
||||
"itoa",
|
||||
"ryu",
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "1.0.105"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "60b9b43d45702de4c839cb9b51d9f529c5dd26a4aff255b42b1ebc03e88ee908"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "unicode-ident"
|
||||
version = "1.0.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3"
|
@ -0,0 +1,10 @@
|
||||
[package]
|
||||
name = "day13"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
serde = { version = "1.0", features = ["derive"] }
|
||||
serde_json = "1.0"
|
@ -0,0 +1,97 @@
|
||||
#![feature(iter_array_chunks)]
|
||||
#![feature(is_some_and)]
|
||||
use std::cmp::Ordering;
|
||||
|
||||
fn main() {
|
||||
let json = std::fs::read_to_string("/dev/stdin").unwrap();
|
||||
let mut p1_tot = 0;
|
||||
let mut p2_tot = 1;
|
||||
|
||||
let starting_packet: serde_json::Value = serde_json::from_str("[[2]]").unwrap();
|
||||
let ending_packet: serde_json::Value = serde_json::from_str("[[6]]").unwrap();
|
||||
|
||||
for (i, [left, right]) in json
|
||||
.lines()
|
||||
.filter(|l| !l.is_empty())
|
||||
.array_chunks()
|
||||
.enumerate()
|
||||
{
|
||||
let left: serde_json::Value = serde_json::from_str(left).unwrap();
|
||||
let right: serde_json::Value = serde_json::from_str(right).unwrap();
|
||||
|
||||
let right_order = serde_cmp(Some(&left), Some(&right)).1;
|
||||
if right_order {
|
||||
p1_tot += i + 1;
|
||||
}
|
||||
}
|
||||
|
||||
let mut all = json
|
||||
.lines()
|
||||
.filter(|l| !l.is_empty())
|
||||
.map(|l| serde_json::from_str::<serde_json::Value>(l).unwrap())
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
all.push(starting_packet.clone());
|
||||
all.push(ending_packet.clone());
|
||||
|
||||
all.sort_by(|a, b| match serde_cmp(Some(a), Some(b)).1 {
|
||||
true => Ordering::Less,
|
||||
false => Ordering::Greater,
|
||||
});
|
||||
|
||||
for (idx, line) in all.iter().enumerate() {
|
||||
if *line == starting_packet || *line == ending_packet {
|
||||
p2_tot *= idx + 1;
|
||||
}
|
||||
}
|
||||
|
||||
println!("P1: {}, P2: {}", p1_tot, p2_tot);
|
||||
}
|
||||
|
||||
// cmp returns two bools: keep checking?, and current values in right order?
|
||||
fn serde_cmp(l: Option<&serde_json::Value>, r: Option<&serde_json::Value>) -> (bool, bool) {
|
||||
if l.is_none() && r.is_none() {
|
||||
panic!("both values are none");
|
||||
}
|
||||
|
||||
match (l, r) {
|
||||
(Some(_), None) => return (false, false),
|
||||
(None, Some(_)) => return (false, true),
|
||||
(None, None) => return (true, false),
|
||||
(_, _) => (),
|
||||
}
|
||||
|
||||
let (l, r) = (l.unwrap(), r.unwrap());
|
||||
|
||||
if l.is_number() && r.is_number() {
|
||||
let (ln, rn) = (l.as_i64().unwrap(), r.as_i64().unwrap());
|
||||
|
||||
match ln.cmp(&rn) {
|
||||
Ordering::Greater => return (false, false),
|
||||
Ordering::Equal => return (true, false),
|
||||
Ordering::Less => return (false, true),
|
||||
}
|
||||
}
|
||||
|
||||
let (fl, fr) = (to_flat_vec(l), to_flat_vec(r));
|
||||
for i in 0..std::cmp::max(fl.len(), fr.len()) {
|
||||
let (more, res) = serde_cmp(fl.get(i).copied(), fr.get(i).copied());
|
||||
if !more {
|
||||
return (more, res);
|
||||
}
|
||||
}
|
||||
|
||||
(true, true)
|
||||
}
|
||||
|
||||
fn to_flat_vec(val: &serde_json::Value) -> Vec<&serde_json::Value> {
|
||||
if val.is_number() {
|
||||
return vec![val];
|
||||
}
|
||||
|
||||
if val.is_array() {
|
||||
return val.as_array().unwrap().iter().collect::<Vec<_>>();
|
||||
}
|
||||
|
||||
panic!("val is neither array or num")
|
||||
}
|
Loading…
Reference in New Issue