2022 rust day 13
This commit is contained in:
parent
6367c5d015
commit
3d8dc083d7
|
@ -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(&÷rs[0]).unwrap() + 1;
|
||||||
|
let d2 = sorted.binary_search(&÷rs[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)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue