2022 rust day 13

This commit is contained in:
Maciej Jur 2022-12-13 11:51:08 +01:00
parent 6367c5d015
commit 3d8dc083d7

View file

@ -1,4 +1,6 @@
#![allow(dead_code)]
use std::cmp::Ordering; use std::cmp::Ordering;
use std::collections::BinaryHeap;
use crate::utils; use crate::utils;
@ -54,15 +56,30 @@ impl PartialOrd for Packet {
fn solve1(data: &[(Packet, Packet)]) -> usize { fn solve1(data: &[(Packet, Packet)]) -> usize {
data.iter() data.iter()
.enumerate() .enumerate()
.flat_map(|(index, (left, right))| match left.cmp(right) { .flat_map(|(index, (left, right))| match left < right {
Ordering::Less => Some(index + 1), true => Some(index + 1),
_ => None false => None
}) })
.sum() .sum()
} }
fn solve2(data: &[(Packet, Packet)]) -> i32 { fn solve2(data: &[(Packet, Packet)]) -> usize {
2 let dividers: &[Packet] = &[
recursive_parse("[[2]]"),
recursive_parse("[[6]]"),
];
let sorted = data.iter()
.fold(BinaryHeap::from_iter(dividers.iter()), |mut acc, (left, right)| {
acc.push(left);
acc.push(right);
acc
})
.into_sorted_vec();
let d1 = sorted.binary_search(&&dividers[0]).unwrap() + 1;
let d2 = sorted.binary_search(&&dividers[1]).unwrap() + 1;
d1 * d2
} }
@ -96,9 +113,7 @@ fn find_tokens(s: &str) -> Vec<String> {
fn recursive_parse(s: &str) -> Packet { fn recursive_parse(s: &str) -> Packet {
match s.starts_with("[") { match s.starts_with("[") {
true => { true => Packet::List(find_tokens(s).into_iter().map(|t| recursive_parse(&t)).collect()),
Packet::List(find_tokens(s).into_iter().map(|t| recursive_parse(&t)).collect())
},
false => Packet::Integer(s.parse().unwrap()) false => Packet::Integer(s.parse().unwrap())
} }
} }
@ -135,6 +150,6 @@ mod tests {
#[test] #[test]
fn part2() { fn part2() {
assert_eq!(2, solve2(&parse_data(DATA))); assert_eq!(140, solve2(&parse_data(DATA)));
} }
} }