start work on day 5

This commit is contained in:
Joseph Montanaro 2021-12-08 14:53:33 -08:00
parent 2fbc98de3d
commit 444a7f6e47
3 changed files with 156 additions and 1 deletions

77
2021/Cargo.lock generated
View File

@ -22,6 +22,7 @@ name = "advent-2021"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"color-eyre", "color-eyre",
"num",
] ]
[[package]] [[package]]
@ -134,6 +135,82 @@ dependencies = [
"autocfg", "autocfg",
] ]
[[package]]
name = "num"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "43db66d1170d347f9a065114077f7dccb00c1b9478c89384490a3425279a4606"
dependencies = [
"num-bigint",
"num-complex",
"num-integer",
"num-iter",
"num-rational",
"num-traits",
]
[[package]]
name = "num-bigint"
version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f"
dependencies = [
"autocfg",
"num-integer",
"num-traits",
]
[[package]]
name = "num-complex"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "26873667bbbb7c5182d4a37c1add32cdf09f841af72da53318fdb81543c15085"
dependencies = [
"num-traits",
]
[[package]]
name = "num-integer"
version = "0.1.44"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db"
dependencies = [
"autocfg",
"num-traits",
]
[[package]]
name = "num-iter"
version = "0.1.42"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b2021c8337a54d21aca0d59a92577a029af9431cb59b909b03252b9c164fad59"
dependencies = [
"autocfg",
"num-integer",
"num-traits",
]
[[package]]
name = "num-rational"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d41702bd167c2df5520b384281bc111a4b5efcf7fbc4c9c222c815b07e0a6a6a"
dependencies = [
"autocfg",
"num-bigint",
"num-integer",
"num-traits",
]
[[package]]
name = "num-traits"
version = "0.2.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290"
dependencies = [
"autocfg",
]
[[package]] [[package]]
name = "object" name = "object"
version = "0.27.1" version = "0.27.1"

View File

@ -8,3 +8,4 @@ edition = "2021"
[dependencies] [dependencies]
color-eyre = "^0.5.11" color-eyre = "^0.5.11"
num = "^0.4.0"

77
2021/src/day5.rs Normal file
View File

@ -0,0 +1,77 @@
use color_eyre::eyre;
use num::{Integer, integer::gcd};
#[derive(Copy, Clone)]
struct Point {
x: isize,
y: isize,
}
#[derive(Copy, Clone)]
struct Line {
start: Point,
end: Point,
}
#[derive(Copy, Clone)]
struct Slope {
rise: isize,
run: isize,
}
impl Line {
fn slope(&self) -> Slope {
let mut rise = self.end.y - self.start.y;
let mut run = self.end.x - self.start.x;
if rise != 0 && run != 0 {
let divisor = gcd(rise, run);
rise /= divisor;
run /= divisor;
}
Slope {rise, run}
}
}
struct PointsIter<'a> {
line: &'a Line,
pos: Point,
slope: Slope,
}
impl PointsIter<'_> {
fn from(line: &Line) -> Self {
PointsIter {
line,
pos: line.start,
slope: line.slope(),
}
}
}
impl Iterator for PointsIter {
type Item = Point;
fn next(&mut self) -> Option<Self::Item> {
if self.pos.x = self.line.start.x && self.pos.y == self.line.start.y {
return Some(self.pos);
}
if self.pos.x != self.line.end.x && self.pos.y != self.line.end.y {
self.pos.y += self.slope.rise;
self.pos.x += self.slope.run;
return Some(self.pos);
}
else {
return None;
}
}
}
struct GridCounter<const W: usize, const H: usize> {
rows: [[usize; W]; H],
}