hmm
This commit is contained in:
parent
8a822167a3
commit
e7f87ee6d7
4 changed files with 64 additions and 5 deletions
16
Cargo.lock
generated
16
Cargo.lock
generated
|
|
@ -23,6 +23,7 @@ dependencies = [
|
|||
name = "aoc2023"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"itertools",
|
||||
"regex",
|
||||
"shared",
|
||||
"substring",
|
||||
|
|
@ -34,6 +35,21 @@ version = "1.1.0"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
|
||||
|
||||
[[package]]
|
||||
name = "either"
|
||||
version = "1.9.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07"
|
||||
|
||||
[[package]]
|
||||
name = "itertools"
|
||||
version = "0.12.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "25db6b064527c5d482d0423354fcd07a89a2dfe07b67892e62411946db7f07b0"
|
||||
dependencies = [
|
||||
"either",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "memchr"
|
||||
version = "2.6.4"
|
||||
|
|
|
|||
|
|
@ -6,4 +6,5 @@ edition = "2021"
|
|||
[dependencies]
|
||||
shared = { path = "../shared" }
|
||||
regex = "1.10.2"
|
||||
substring = "1.4.5"
|
||||
substring = "1.4.5"
|
||||
itertools = "0.12.0"
|
||||
|
|
@ -1,13 +1,55 @@
|
|||
use shared::{Solution, Answer};
|
||||
use itertools::Itertools;
|
||||
|
||||
pub struct Day11;
|
||||
|
||||
impl Solution for Day11 {
|
||||
fn part_1(&self, input: &str) -> Answer {
|
||||
Answer::Unimplemented
|
||||
Answer::from(solve(input, 2))
|
||||
}
|
||||
|
||||
fn part_2(&self, input: &str) -> Answer {
|
||||
Answer::Unimplemented
|
||||
Answer::from(solve(input, 1_000_000))
|
||||
}
|
||||
}
|
||||
|
||||
fn solve(input: &str, inflation_arg: usize) -> u64 {
|
||||
let grid = input.lines().map(|line| line.chars().map(|x| x == '#').collect::<Vec<bool>>()).collect::<Vec<_>>();
|
||||
|
||||
let mut distances = vec![vec![1; grid[0].len()]; grid.len()];
|
||||
|
||||
let mut empty_col = vec![true; grid[0].len()];
|
||||
for (i, line) in grid.iter().enumerate() {
|
||||
empty_col = empty_col.iter().enumerate().map(|(i, &l)| l && !line[i]).collect();
|
||||
if !line.iter().any(|&x| x) {
|
||||
distances[i] = vec![inflation_arg; line.len()];
|
||||
}
|
||||
}
|
||||
|
||||
for (i, &col) in empty_col.iter().enumerate() {
|
||||
if col {
|
||||
for j in 0..distances.len() {
|
||||
distances[j][i] = inflation_arg;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let galaxies: Vec<(usize, usize)> = grid.iter().
|
||||
enumerate().
|
||||
map(|(i, line)| line.iter()
|
||||
.enumerate()
|
||||
.filter_map(|(j, &x)| if x { Some((i, j)) } else { None })
|
||||
.collect::<Vec<_>>()
|
||||
).flatten().collect::<Vec<_>>();
|
||||
|
||||
galaxies.iter().permutations(2).map(|x| {
|
||||
let (x1, y1): (usize, usize) = *x[0];
|
||||
let (x2, y2): (usize, usize) = *x[1];
|
||||
let mut out = 0;
|
||||
let xrange = x1.min(x2)..x1.max(x2);
|
||||
let yrange = if y1 <= y2 { y1..y2 } else { (y2+1)..(y1+1) };
|
||||
for i in xrange { out += distances[i][if x1 <= x2 {y1} else {y2}] }
|
||||
for j in yrange { out += distances[x1.min(x2)][j] }
|
||||
out as u64
|
||||
} ).sum::<u64>() / 2
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,10 +8,10 @@ use std::time::Instant;
|
|||
fn main() {
|
||||
let now = Instant::now();
|
||||
|
||||
let Ok(data) = load_actual(2023, 10)
|
||||
let Ok(data) = load_actual(2023, 11)
|
||||
else { panic!("No Input Data"); };
|
||||
|
||||
let result = aoc2023::day10::Day10.part_2(&data);
|
||||
let result = aoc2023::day11::Day11.part_2(&data);
|
||||
|
||||
let elapsed = now.elapsed();
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue