Day 11
Caved on the itertools crate smh
This commit is contained in:
parent
323afc1cbd
commit
0efc64a4ac
5 changed files with 138 additions and 3 deletions
16
Cargo.lock
generated
16
Cargo.lock
generated
|
@ -22,6 +22,7 @@ name = "advent"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"getrandom",
|
"getrandom",
|
||||||
|
"itertools",
|
||||||
"num-bigint",
|
"num-bigint",
|
||||||
"num-irrational",
|
"num-irrational",
|
||||||
"num-rational",
|
"num-rational",
|
||||||
|
@ -318,6 +319,12 @@ version = "0.6.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "3a68a4904193147e0a8dec3314640e6db742afd5f6e634f428a6af230d9b3591"
|
checksum = "3a68a4904193147e0a8dec3314640e6db742afd5f6e634f428a6af230d9b3591"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "either"
|
||||||
|
version = "1.9.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "encoding_rs"
|
name = "encoding_rs"
|
||||||
version = "0.8.33"
|
version = "0.8.33"
|
||||||
|
@ -613,6 +620,15 @@ version = "2.9.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3"
|
checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "itertools"
|
||||||
|
version = "0.12.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "25db6b064527c5d482d0423354fcd07a89a2dfe07b67892e62411946db7f07b0"
|
||||||
|
dependencies = [
|
||||||
|
"either",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "itoa"
|
name = "itoa"
|
||||||
version = "1.0.9"
|
version = "1.0.9"
|
||||||
|
|
|
@ -10,6 +10,7 @@ num-rational = { version = "0.4.1", features = ["num-bigint"] }
|
||||||
regex = "1.10.2"
|
regex = "1.10.2"
|
||||||
scraper = "0.18.1"
|
scraper = "0.18.1"
|
||||||
reqwest = "0.11.22"
|
reqwest = "0.11.22"
|
||||||
|
itertools = "0.12.0"
|
||||||
|
|
||||||
[dependencies.getrandom]
|
[dependencies.getrandom]
|
||||||
version = "0.2.11"
|
version = "0.2.11"
|
||||||
|
|
115
lib/src/day11/mod.rs
Normal file
115
lib/src/day11/mod.rs
Normal file
|
@ -0,0 +1,115 @@
|
||||||
|
use crate::utils::Day;
|
||||||
|
use itertools::Itertools as _;
|
||||||
|
|
||||||
|
#[derive(Debug, Default)]
|
||||||
|
pub struct Day11 {
|
||||||
|
pub input: String,
|
||||||
|
pub rows_expanded: Vec<usize>,
|
||||||
|
pub columns_expanded: Vec<usize>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Day for Day11 {
|
||||||
|
fn part1(&mut self) -> String {
|
||||||
|
let mut parsed: Vec<Vec<_>> = self
|
||||||
|
.input
|
||||||
|
.lines()
|
||||||
|
.map(|line| line.chars().collect())
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
for line in std::mem::take(&mut parsed).into_iter() {
|
||||||
|
if line.iter().all(|&c| c == '.') {
|
||||||
|
parsed.push(line.clone())
|
||||||
|
}
|
||||||
|
parsed.push(line)
|
||||||
|
}
|
||||||
|
|
||||||
|
let parsed_clone = parsed.clone();
|
||||||
|
let mut added = 0usize;
|
||||||
|
for column in 0..parsed[0].len() {
|
||||||
|
if (0..parsed.len()).all(|row| parsed_clone[row][column] == '.') {
|
||||||
|
parsed
|
||||||
|
.iter_mut()
|
||||||
|
.for_each(|line| line.insert(column + added, '.'));
|
||||||
|
added += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let galaxies: Vec<_> = parsed
|
||||||
|
.iter()
|
||||||
|
.enumerate()
|
||||||
|
.flat_map(|(i, line)| {
|
||||||
|
line.iter()
|
||||||
|
.enumerate()
|
||||||
|
.filter_map(move |(j, &c)| if c == '#' { Some((i as isize, j as isize)) } else { None })
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
let combinations = galaxies
|
||||||
|
.into_iter()
|
||||||
|
.combinations(2)
|
||||||
|
.map(|c| (c[0], c[1]))
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
|
||||||
|
let result = combinations.into_iter().map(
|
||||||
|
|(start, end)|
|
||||||
|
(end.0 - start.0).abs() + (end.1 - start.1).abs()
|
||||||
|
).sum::<isize>();
|
||||||
|
|
||||||
|
result.to_string()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn part2(&mut self) -> String {
|
||||||
|
let parsed: Vec<Vec<_>> = self
|
||||||
|
.input
|
||||||
|
.lines()
|
||||||
|
.map(|line| line.chars().collect())
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
for (i, line) in parsed.iter().enumerate() {
|
||||||
|
if line.iter().all(|&c| c == '.') {
|
||||||
|
self.rows_expanded.push(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let parsed_clone = parsed.clone();
|
||||||
|
for column in 0..parsed[0].len() {
|
||||||
|
if (0..parsed.len()).all(|row| parsed_clone[row][column] == '.') {
|
||||||
|
self.columns_expanded.push(column);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let galaxies: Vec<_> = parsed
|
||||||
|
.iter()
|
||||||
|
.enumerate()
|
||||||
|
.flat_map(|(i, line)| {
|
||||||
|
line.iter()
|
||||||
|
.enumerate()
|
||||||
|
.filter_map({
|
||||||
|
let rows_expanded = &self.rows_expanded;
|
||||||
|
let columns_expanded = &self.columns_expanded;
|
||||||
|
move |(j, &c)| {
|
||||||
|
if c == '#' {
|
||||||
|
Some((
|
||||||
|
i as i128 + (rows_expanded.iter().filter(|&&row| row < i).count() as i128 * 999999i128),
|
||||||
|
j as i128 + (columns_expanded.iter().filter(|&&column| column < j).count() as i128 * 999999i128)
|
||||||
|
))
|
||||||
|
} else { None }
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
let combinations = galaxies
|
||||||
|
.into_iter()
|
||||||
|
.combinations(2)
|
||||||
|
.map(|c| (c[0], c[1]))
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
|
||||||
|
let result = combinations.into_iter().map(
|
||||||
|
|(start, end)|
|
||||||
|
(end.0 - start.0).abs() + (end.1 - start.1).abs()
|
||||||
|
).sum::<i128>();
|
||||||
|
|
||||||
|
result.to_string()
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,6 +2,7 @@ use std::collections::HashMap;
|
||||||
|
|
||||||
use day1::Day1;
|
use day1::Day1;
|
||||||
use day10::Day10;
|
use day10::Day10;
|
||||||
|
use day11::Day11;
|
||||||
use day2::Day2;
|
use day2::Day2;
|
||||||
use day3::Day3;
|
use day3::Day3;
|
||||||
use day4::Day4;
|
use day4::Day4;
|
||||||
|
@ -17,6 +18,7 @@ pub mod utils;
|
||||||
|
|
||||||
pub mod day1;
|
pub mod day1;
|
||||||
pub mod day10;
|
pub mod day10;
|
||||||
|
pub mod day11;
|
||||||
pub mod day2;
|
pub mod day2;
|
||||||
pub mod day3;
|
pub mod day3;
|
||||||
pub mod day4;
|
pub mod day4;
|
||||||
|
@ -51,6 +53,7 @@ pub fn get_day(day: u8, input: String) -> Box<dyn Day> {
|
||||||
input,
|
input,
|
||||||
parsed: vec![],
|
parsed: vec![],
|
||||||
}),
|
}),
|
||||||
|
11 => Box::new(Day11 { input, rows_expanded: vec![], columns_expanded: vec![] }),
|
||||||
_ => panic!("Invalid day #"),
|
_ => panic!("Invalid day #"),
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in a new issue