Adds day8
This commit is contained in:
parent
311cc0509a
commit
bc0aa70ac3
27
Cargo.lock
generated
27
Cargo.lock
generated
@ -26,6 +26,7 @@ name = "aoc-2024"
|
|||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"advent_derive",
|
"advent_derive",
|
||||||
|
"gcd",
|
||||||
"itertools",
|
"itertools",
|
||||||
"quote",
|
"quote",
|
||||||
"regex",
|
"regex",
|
||||||
@ -79,6 +80,12 @@ version = "1.0.7"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
|
checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "gcd"
|
||||||
|
version = "2.3.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "1d758ba1b47b00caf47f24925c0074ecb20d6dfcffe7f6d53395c0465674841a"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ident_case"
|
name = "ident_case"
|
||||||
version = "1.0.1"
|
version = "1.0.1"
|
||||||
@ -87,9 +94,9 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "itertools"
|
name = "itertools"
|
||||||
version = "0.13.0"
|
version = "0.14.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186"
|
checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"either",
|
"either",
|
||||||
]
|
]
|
||||||
@ -102,18 +109,18 @@ checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "proc-macro2"
|
name = "proc-macro2"
|
||||||
version = "1.0.92"
|
version = "1.0.93"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0"
|
checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"unicode-ident",
|
"unicode-ident",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "quote"
|
name = "quote"
|
||||||
version = "1.0.37"
|
version = "1.0.38"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af"
|
checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
]
|
]
|
||||||
@ -155,9 +162,9 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "syn"
|
name = "syn"
|
||||||
version = "2.0.90"
|
version = "2.0.98"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31"
|
checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
@ -166,6 +173,6 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "unicode-ident"
|
name = "unicode-ident"
|
||||||
version = "1.0.14"
|
version = "1.0.17"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83"
|
checksum = "00e2473a93778eb0bad35909dff6a10d28e63f792f16ed15e404fca9d5eeedbe"
|
||||||
|
@ -4,8 +4,9 @@ version = "0.1.0"
|
|||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
itertools = "0.13"
|
itertools = "0.14"
|
||||||
regex = "1.11"
|
regex = "1.11"
|
||||||
syn = "2.0"
|
syn = "2.0"
|
||||||
quote = "1.0"
|
quote = "1.0"
|
||||||
advent_derive = { path = "advent_derive/"}
|
advent_derive = { path = "advent_derive/"}
|
||||||
|
gcd = "2.3"
|
||||||
|
50
resources/input8.txt
Normal file
50
resources/input8.txt
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
........5..................................e..3...
|
||||||
|
.......q...........m................e.............
|
||||||
|
....m.......................................e.....
|
||||||
|
.........................................C........
|
||||||
|
.u.m........................8.....................
|
||||||
|
...........7......9.......8...........F...s.......
|
||||||
|
6...q..............................s..............
|
||||||
|
..................................................
|
||||||
|
..................................................
|
||||||
|
..................................................
|
||||||
|
..........9....................F..................
|
||||||
|
.................................M....D...........
|
||||||
|
.........U........................................
|
||||||
|
..q................................8..............
|
||||||
|
.......9..........................................
|
||||||
|
0....6.....................e..Qs...............F..
|
||||||
|
.................................Q...D............
|
||||||
|
.0.u....................................2.........
|
||||||
|
..................................................
|
||||||
|
........u................Q........................
|
||||||
|
.....E........1...................................
|
||||||
|
...n....v....................................3....
|
||||||
|
......u..0................N.......................
|
||||||
|
............................................z.....
|
||||||
|
.........7....U.........4.....Z...Q.....D.....V...
|
||||||
|
..............n1.........f.................2......
|
||||||
|
E.............................f..............z....
|
||||||
|
...E........1.Z.......U......................D....
|
||||||
|
.......n...v....7Z...N............................
|
||||||
|
..........7..N.....Zf...........................3.
|
||||||
|
................................b............V....
|
||||||
|
............4..................................9..
|
||||||
|
..n...v........................5................2.
|
||||||
|
.........v.................5.........S............
|
||||||
|
..........................s.......................
|
||||||
|
.....U.........4..C.....................S..V......
|
||||||
|
..................................................
|
||||||
|
......................c........b............M.....
|
||||||
|
...........4.Wc....d.......1.....b.....S..........
|
||||||
|
..E........c............................5......z..
|
||||||
|
..............w..C....................SM.2........
|
||||||
|
........................d.........................
|
||||||
|
...............c......C3..........................
|
||||||
|
...............w....W.............................
|
||||||
|
..................................................
|
||||||
|
.........d.......B....w...........................
|
||||||
|
....B.....W.......dw..........................M...
|
||||||
|
...............W......................N...V.......
|
||||||
|
.B................................................
|
||||||
|
....................B...............b.............
|
126
src/days/day8.rs
Normal file
126
src/days/day8.rs
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
use std::{collections::HashMap, path::Path};
|
||||||
|
|
||||||
|
use advent_derive::advent_day;
|
||||||
|
use itertools::Itertools;
|
||||||
|
use gcd::Gcd;
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
use crate::{error::AdventError, input::get_lines};
|
||||||
|
|
||||||
|
|
||||||
|
struct Part1{
|
||||||
|
antennas: HashMap<char, Vec<Coord>>,
|
||||||
|
width: i32,
|
||||||
|
height: i32,
|
||||||
|
}
|
||||||
|
type Part2 = Part1;
|
||||||
|
|
||||||
|
type Coord = (i32, i32);
|
||||||
|
|
||||||
|
impl Part1 {
|
||||||
|
fn new() -> Self {
|
||||||
|
Self{
|
||||||
|
antennas: HashMap::<char, Vec<Coord>>::new(),
|
||||||
|
width: 0,
|
||||||
|
height: 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Part2 {
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fn read_input_part1(part1: &mut Part1, path: &Path) -> Result<(), AdventError> {
|
||||||
|
for (y, line) in get_lines(path).enumerate() {
|
||||||
|
for (x, c) in line?.chars().enumerate() {
|
||||||
|
if c != '.' {
|
||||||
|
if part1.antennas.contains_key(&c) {
|
||||||
|
part1.antennas.get_mut(&c).expect("This should never happen").push((x as i32, y as i32));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
part1.antennas.insert(c, vec![(x as i32, y as i32)]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
part1.width = (x + 1) as i32;
|
||||||
|
}
|
||||||
|
part1.height = (y + 1) as i32;
|
||||||
|
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn add(left: &Coord, right: &Coord) -> Coord {
|
||||||
|
(left.0 + right.0, left.1 + right.1)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn sub(left: &Coord, right: &Coord) -> Coord {
|
||||||
|
(left.0 - right.0, left.1 - right.1)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn gen_anti_nodes(left: &Coord, right: &Coord) -> Vec<Coord> {
|
||||||
|
let diff = sub(left, right);
|
||||||
|
let mut antis = vec![sub(right, &diff), add(left, &diff)];
|
||||||
|
if diff.0.rem_euclid(3) == 0 && diff.1.rem_euclid(3) == 0 {
|
||||||
|
antis.push((left.0 - diff.0 / 3, left.1 - diff.1 / 3));
|
||||||
|
antis.push((left.0 - diff.0 / 3 * 2, left.1 - diff.1 / 3 * 2));
|
||||||
|
}
|
||||||
|
antis
|
||||||
|
}
|
||||||
|
|
||||||
|
fn gen_anti_nodes2(left: &Coord, right: &Coord, part2: &Part2) -> Vec<Coord> {
|
||||||
|
let diff = sub(left, right);
|
||||||
|
let gcd = diff.0.unsigned_abs().gcd(diff.1.unsigned_abs());
|
||||||
|
let node_distance = (diff.0 / (gcd as i32), diff.1 / (gcd as i32));
|
||||||
|
let mut antis = vec![*left];
|
||||||
|
for i in 1.. {
|
||||||
|
let d = (node_distance.0 * i, node_distance.1 * i);
|
||||||
|
let n1 = sub(left, &d);
|
||||||
|
let n2 = add(left, &d);
|
||||||
|
let b1 = in_bounds(&n1, part2);
|
||||||
|
let b2 = in_bounds(&n2, part2);
|
||||||
|
if b1 {
|
||||||
|
antis.push(n1);
|
||||||
|
}
|
||||||
|
if b2 {
|
||||||
|
antis.push(n2);
|
||||||
|
}
|
||||||
|
if !b1 && !b2 {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
antis
|
||||||
|
}
|
||||||
|
|
||||||
|
fn in_bounds(coord: &Coord, part1: &Part1) -> bool {
|
||||||
|
coord.0 >= 0 && coord.0 < part1.width && coord.1 >= 0 && coord.1 < part1.height
|
||||||
|
}
|
||||||
|
|
||||||
|
fn solve_part1(part1: &mut Part1) -> Result<String, AdventError> {
|
||||||
|
Ok(part1.antennas.iter().map(|(_, coords)| {
|
||||||
|
coords.iter().enumerate().map(|(i, coord1)| {
|
||||||
|
coords[i+1..].iter().map(|coord2| {
|
||||||
|
let antis = gen_anti_nodes(coord1, coord2);
|
||||||
|
antis
|
||||||
|
})
|
||||||
|
}).flatten().flatten().filter(|coord| in_bounds(coord, part1))
|
||||||
|
}).flatten().unique().count().to_string())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn read_input_part2(part2: &mut Part2, path: &Path) -> Result<(), AdventError> {
|
||||||
|
read_input_part1(part2, path)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn solve_part2(part2: &mut Part2) -> Result<String, AdventError> {
|
||||||
|
Ok(part2.antennas.iter().map(|(_, coords)| {
|
||||||
|
coords.iter().enumerate().map(|(i, coord1)| {
|
||||||
|
coords[i+1..].iter().map(|coord2| {
|
||||||
|
let antis = gen_anti_nodes2(coord1, coord2, part2);
|
||||||
|
antis
|
||||||
|
})
|
||||||
|
}).flatten().flatten()
|
||||||
|
}).flatten().collect::<Vec<Coord>>().iter().unique().count().to_string())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[advent_day(Part1, Part2)]
|
||||||
|
struct Day8;
|
@ -22,23 +22,48 @@ pub mod day4;
|
|||||||
pub mod day5;
|
pub mod day5;
|
||||||
pub mod day6;
|
pub mod day6;
|
||||||
pub mod day7;
|
pub mod day7;
|
||||||
|
pub mod day8;
|
||||||
|
|
||||||
pub mod day14;
|
pub mod day14;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
fn read_input_part1(part1: &mut Day5Part1, path: &Path) -> Result<(), AdventError> {
|
use std::path::Path;
|
||||||
|
|
||||||
|
use crate::error::AdventError;
|
||||||
|
|
||||||
|
|
||||||
|
struct Part1{}
|
||||||
|
struct Part2{}
|
||||||
|
|
||||||
|
impl Part1 {
|
||||||
|
fn new() -> Self {
|
||||||
|
Self{}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Part2 {
|
||||||
|
fn new() -> Self{
|
||||||
|
Self{}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fn read_input_part1(part1: &mut Part1, path: &Path) -> Result<(), AdventError> {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn solve_part1(part1: &mut Day5Part1) -> Result<u64, AdventError> {
|
fn solve_part1(part1: &mut Part1) -> Result<String, AdventError> {
|
||||||
Ok(0)
|
Ok("0".to_string())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn read_input_part2(part2: &mut Day5Part2, path: &Path) -> Result<(), AdventError> {
|
fn read_input_part2(part2: &mut Part2, path: &Path) -> Result<(), AdventError> {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn solve_part2(part2: &mut Day5Part2) -> Result<u64, AdventError> {
|
fn solve_part2(part2: &mut Part2) -> Result<String, AdventError> {
|
||||||
Ok(0)
|
Ok("0".to_string())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[advent_day(Part1, Part2)]
|
||||||
|
struct Day8;
|
||||||
*/
|
*/
|
@ -11,10 +11,12 @@ use day4::Day4;
|
|||||||
use day5::Day5;
|
use day5::Day5;
|
||||||
use day6::Day6;
|
use day6::Day6;
|
||||||
use day7::Day7;
|
use day7::Day7;
|
||||||
|
use day8::Day8;
|
||||||
use day14::Day14;
|
use day14::Day14;
|
||||||
|
|
||||||
|
|
||||||
use crate::error::AdventError;
|
use crate::error::AdventError;
|
||||||
use crate::days::*;
|
pub use crate::days::*;
|
||||||
|
|
||||||
struct DummyDay {
|
struct DummyDay {
|
||||||
|
|
||||||
@ -46,7 +48,7 @@ fn main() -> Result<(), AdventError> {
|
|||||||
Box::new(Day5::new()),
|
Box::new(Day5::new()),
|
||||||
Box::new(Day6::new()),
|
Box::new(Day6::new()),
|
||||||
Box::new(Day7::new()),
|
Box::new(Day7::new()),
|
||||||
Box::new(DummyDay::new()),
|
Box::new(Day8::new()),
|
||||||
Box::new(DummyDay::new()),
|
Box::new(DummyDay::new()),
|
||||||
Box::new(DummyDay::new()),
|
Box::new(DummyDay::new()),
|
||||||
Box::new(DummyDay::new()),
|
Box::new(DummyDay::new()),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user