master
george 2 years ago
parent 2b36afe92b
commit ae7dae8b79

89
day13/Cargo.lock generated

@ -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…
Cancel
Save