This commit is contained in:
timeshifter
2024-02-02 15:14:46 +01:00
parent d49022f310
commit 331f16786c
6 changed files with 428 additions and 0 deletions
Generated
+30
View File
@@ -0,0 +1,30 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3
[[package]]
name = "aoc"
version = "0.1.0"
[[package]]
name = "aoc2024-03"
version = "0.1.0"
dependencies = [
"aoc",
"itertools",
]
[[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.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569"
dependencies = [
"either",
]
+10
View File
@@ -0,0 +1,10 @@
[package]
name = "aoc2024-03"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
aoc = {version = "*", path = "../lib/aoc"}
itertools = "0.12.1"
+10
View File
@@ -0,0 +1,10 @@
467..114..
...*......
..35..633.
......#...
617*......
.....+.58.
..592.....
......755.
...$.*....
.664.598..
+140
View File
@@ -0,0 +1,140 @@
.......497...........................858...923...128..................227..801........487.....664...........................................
436........765..............140.......+....................859.............*.........+.................960........668.......................
...*982...........=..........=....203......266.263...375*....=...402....691..-....................*..........575....................13......
.............114...588...............*............*......631........*.......952...463..14.......661..........=...706......*333.........595..
...194.........*..............743...917.&......375.....................................*...............544*.......*....664..................
...*.....807..452....81..........*......969..#......309*................/....873....941...828.197..........427.728...............566...13...
.243........*.....80.......329....470.......145.475.....111........*659..259....+........*....%........569..............%.....*....*....*...
.........130......*....385*............123......................199.......................640.....463..%.........978....920...266..380.83...
.....323........870.........+...........$.........466......453........................297...........*............*..........................
........*.=..............588.....*786......$.........*........*.......390*.....886...*....227...728..852.......606....*863.......916..396...
.....538...287................301........133.....539..........33.537......466..$...793..+..........*...............218.....721........*.....
...............986.........=.......................................*...%...............222..-.......701.271...............#.........437.....
......*3.........*.626.68...419...740...........................806...976.......875.........174..............735.............=488...........
...790.........487....*................./532..13............................*....-.....503..........*11..734..........978.19......622.......
...................&....712.68=.619+.........*.......................863...596.....2.....*.......160.....+...&659........*.........-....-757
437*.......#........520...*..........304....568.974.255.318.183.........*.......&.....675......................................849..........
....161.....687.710.....854.............*.......*......*....&...441......891.....476..........616.......$........235..434.880...*..673+.....
..................*...............683.....800.120..............*....807..................................707.....*....-....*...74........562
....@...#988...487..#685..........-......*..............251.146.............................142@....74...........398....769..........238*...
....848....../................-.$.....662.........773..*...........895.......591...........................233..............................
797.........611..........@.186...429..........304*....468.....554....*..........*...960......82.......*810...+.534..660....645...313./......
......239..............509...............720*......................844..939=..508......*...........401............*.......*.......*...649...
........=........158.......$.....=...........200......409....982.....................46................126.....517....303.647.660...........
...530....=......*..........704.69...................*.......*..................@879........589..131.................*........*.............
......*..871...672....................611*........415.......283.569.21....842/........-109.&.......*.......157$...719.......679.$...........
....664..............664......668.........203....................&...%............................14..................427.......833..484....
....................*........*.......434.......796...........65............................................-479.126..*..............+.......
.....382..........121.....836.........*........@...............*789.......624........350&..........*544............$.6.........882....513...
....%.....406.........................848........625...%...88.........382..+..971.................5......*622...........914....*....%.......
..............627....816........641..............*.....373./.............*..../...912..651.162........557........901...&.....503.337....59..
...357...........*.........552...*..816..........240......................636.....*...*.....*.............@..993....*.......................
......*934....961...=..43..*...324.....@...............726.888....370...........170.805...517........639.389....*..929.................953..
.16...............408.*...94..................................*......&..............................*......../...9........605...............
.......571....13......512........591+.......976.......895....489...........751.......474.760.........240.....931............*...............
...464../..................608..............*........*................$.94*........................................486.......172............
...*......121........=.....*.......$......909.......583............128........929...................765.............*............+....24....
.............*.......762....230..422..285.....434......................390.....=.....921.................261....#...949.....382...903.*.....
............595........................*.......*...................833*..............%.......973..$....@...*.268........506*..........251...
967...................................25....234...........................306....281..........=..36..918.432....../406........344...$.......
.....700*610.......=...839......917......33......610@................537....=....@............................%........20.402.@.....926.....
..............%.768...*....................*...@............93..161.%...............74$......%.........96..298..........%..+............+519
...........925.......586...................264..85...721....*...*.............................371.................822.=.....................
...............540...........-....447....................987.....305.............379@.707..............670...397...*..842....552.464........
.....666......*....844....515.......*..............+114..............977...............&...393........*.........$.800...........*...........
.....*...647...696..*..............203....................418.....19............522........*.......462................57...786..........561.
....691.....$.......756...165.....................596.32...%........#..280.259$..........398..............425.............*....719..796.....
.............../.........=........1/..305............*.........451......&..........332.......706............&.......327.841...........*.....
.74..........791.............=........+.....................+...-..................+..........*.....................*...............419..371
...*927..........352.......148..........401....459...+....998......$783........@............444..$.......959..106.366.......................
............190..........*......385.............*....846......................907.826..585.......447.441..*..*............7......871........
.................142....944....$.................634.............587..@..930..........*......935.....*...819.29.....3......*35..............
......967....415*......................=980.....................%....58.-......317..74......../.....922..............-.207........../.......
.........................................................................................................175....................369.233.....
.........................+....645.$........%.....620.+429....951......616.................................*............524$.................
....799...551*602........920..+....503..654....-...*............*....=......395.........451....263.......897..................370...........
......-.......................................409......970....661.............*............+...*....48...................475..$........839..
..97...................../.....@497....%..........446$...*...............533..794.....432-.....167...*.....722...486........*...500...*.....
..............459......540.............110................569............&..................#.....................#........785.*.......455..
........815....*...........................*452......./......................365.........929....*978.=................709........+..84......
....427*......466.............608*796..............680......................*......&.........142.....603.................#......621..*......
.........635............@....................302..................296-.....679...801..290..................464..............980......627....
....../.../........%...850.......*108....513*........656...*739........715...............@.......713.......*...................*............
354+..245.......629...........995.....................$..41.....=.....@.....................45..........840......506+...$.....148...........
..........995.................................&541............914.510.....950...../...........*53..28...................275........138......
.............*812..665...../.........................101.308..............*......691.482.............*........902.585.......@.......*.......
.........../........./...292...............#..........-....*....@307......661..........*.210......135....932%...........992..54..191..931...
...400..649...............................504.196.........88........................581.............................743*.............&......
...*.........140..............642....891.............309...............................................695......361..............603........
....170.643#..*.................*....*.......*24.....*....................932.291.....538....461.........*........*..275............&.......
.............725......494......23...279...713..../....449............*........*...../...=......*..........434..............785..............
.....991..........946.............................830.........136.439.24...519......289.......408...579........708.650*......*.370.13....410
......*..887........#..688.673.........218......................-...............941....................$.......%.......927.722....*.........
....124....*...........*..../....427....*.............312................................................922...........................307..
...........706...16..934..*.......*......608....459..&..........761.....................647..641...........*.............242............*...
..5*715..-........+........122.....262........./...........928....%............728..610*......*..502.....222..40.....923..+...........540...
.........701.............=..............291...............*.........351.........*............141.%............*.../.....*....725............
..............314.......878....%.......*......=..820*.....988..204.....-.....889......119............797...........395....+.............287.
..................671........322....101......257.....733........@.....................=.............*..........544......600.......862.......
..421.......582...%..............................484...............565.....+...831...........695...384.#...592.=............240....../.904..
....*..........*........570...........&....=........*629......717&.*.......93......726../961....*......535..*........767../......715....*...
....439.....630............../..%...615...912......................777............*..............602.........567..3........107....$..77.....
....................914.....3...2.=.............763...&885......................185....182.......................*......-......+............
...372...383........*..............60.............*............&..38.681...............*.....459....../........117...504......358..480-.....
............+.990..33...........................834.......@..33......................494....*........181.66+................................
...............*......*...492..............176..........857...........376.315................954.....................*982.......763.........
329=..........179....245...*...61...........*...*................%......+....*.....352*509.........952#..69..620..423.............*.........
.........................131.....*17......191.33.306...../.....144..503......491.............................................298...415......
...................$...................................426.........*...............526.669.....&498..698...$............447.....+...........
.............575...142.617......890..............%...............212..730.519.971..&......*384.........@....18.219.........*................
.......*537..*.........*........*.........677...587..407...120*........./....*...................................+......334..........700....
....944......636..848........743.....388..*....................109..........................................................540.40..*.......
.................*....596............*....155..324...820.520.................=...............443...94...........621.276......*..+..910......
...............276.....-.........376...........*........*....................739......368....=..............428....*......434..........878..
932....28.....................-..=....207......959....................289.........196.*........................*...............-.......=....
...*........................172....#.#.....688.........25..944...725...&............*..110.....148...426.483..771../932......800............
.947............................457....931*.............-....*...#.......834......721.........*.........*.............................477...
.....*491......*.........*114.................191.....$...213........909*...................194............633....%...792..605.633...#......
.............108......611.....+719...........*.....696........865...............120................=724...%....950.../......*...../.........
...320............*.................260/...121.........338...*........719.180.........516.....*.............................649.............
.....#...643.......941......*160......................*......140...94....*...............*..39.789................*......&.........81...597.
............*..135.......532.................%90...608............*............+515....743.............+...194.993.669..259..+..............
.....%....948.....*............262..695.712....................623.....*...................473........602...*...............83......679.....
..259.............447.............%.*...............363.............105...................@........=......+.........................*.......
......957....659........299..........................%...599..898.+.................464.......606.237..768..416@....=...............228.....
.376..$.........*..........*..2.........@557......./.......*.*.....517..........859*.........*....................855...877.427.........*...
.........*468..535......500....$................117......726.381........428...$................@........43....472.......*...*...........476.
......517................................951........%............-..249..@.....920...........859........*........*....825.393...15..........
...........770.......&16.....278...417......$.....626...-23....954.....#..............................868.......502............*............
.....373..*...................%...*.....254................................................246.#530....................982....179....635....
......*...538.....................362...-...........162.........................180=........*..................278.......*............+.....
....138.......922..............................543................6....12....&.............92...150...............*.......994...............
................+.....+................388....*..........................*....788............../..................220.............834.......
.....................301.593.597.............500..603......928....966................/.............536.......768.............800............
................*64........*.../..&.....924.........*........-...$....................203.............-...+..../...............*..423.&451..
.............453....*......638.....314..*...896....459...............96...................186............581................846....*........
....&188.........624.400...............268....@...........................664...............*...12.943............#733......................
.............................597...765................388......149..468.....+............698......*....143........................426.......
.......................878...*.........875..............*..871*.....*..............929....................$.504*..............473.%.........
...245..........94.651..*.....915.........*.........40.440........236.................*511.45........994........753..................887....
...#..............*.....459............212...18*964.*.........=71..........768..827............./.....*......................567............
.....787.2..781*....................................827....................*...*..............437.....813.......317.....102.....*333........
..........*.....285............@..-...........304.......821.622.....953...377.997......320....................@./.....%....*..........254...
.......877..636.....42......772..419.....189..*................&....*.....................=.17......366*....563......228...153..............
...............*.....$................&....*...839......218.........449......................*..409.....69............................652...
.....576......255..............593...397............469..%......#.......+568.......374......499....*...........541..477.........%137..*.....
.......*............@319.................$.35..........*.....207...............808*.................933.737...........*.502............367..
.....807....219../.....................436......226@...266........215...................................*...................................
..............*...769.....41*....922............................$..*.......271.........350..........677.346......................662....725.
..............175............979.*...#........215..............652..39......$....=61......*..154...................................*........
...426..............335*.........487.194.........*42...................790.............+.750.@......&..............253...337....617..717....
...+....908.............489.................../............14...278.../....953.......316.......*856.44.50...../.......*................$....
.........%..90.................437..........848...........................*......714........708..........*223.588.....884....871.801........
494@..........*..33...........*.........779.....424.550....923............779.......*...340........738.......................*....*..131.603
.....50..481.........=.....643...........@......%............*.......815......681..263....*........*...5.....256*11.377$....872.903.*.......
.....*...............635.......698..........583...148........708........................323.243..201.....................*..........377.132.
...502........883............/..*..............$...*....994.........*....479@.................$......804.443..........584...................
.............*..............893..581..534........376..+..........174.119.........138............670...*....$.834............4...............
.....+....234...904.323..=..............&.894..........439.@838............*.....*........47........555........*............*........932....
...594............*...$.654.....+.........*........................84.*....7...231.$102.......286.......*760....817.......719.........*.....
..................620............806......866.................559......440...........................310...........................590..547.
+229
View File
@@ -0,0 +1,229 @@
use itertools::Itertools;
use aoc::read_grid;
const WIDTH: usize = 140;
const HEIGHT: usize = 140;
fn main() {
let content = read_grid("input.txt");
println!("{} x {}", content[0].len(), content.len());
part_a(&content);
part_b(&content);
}
fn part_a(grid: &[Vec<char>]) {
// let mut sum = 0;
let coordinates: Vec<_> = find_symbol_coordinates(grid)
.into_iter()
.flat_map(get_adjacent_coordinates)
.unique()
.collect();
let numbers = find_numbers_with_coordinates(grid);
let mut sum = 0;
for number in numbers {
'inner: for coordinate in &coordinates {
if number.contains(*coordinate) {
sum += number.value;
break 'inner;
}
}
}
println!("{sum}");
}
fn part_b(grid: &[Vec<char>]) {
let coordinates = find_star_coordinates(grid);
let numbers = find_numbers_with_coordinates(grid);
let mut result = 0;
let mut adjacent_numbers = vec![];
for coordinate in coordinates {
adjacent_numbers.clear();
let adjacent = get_adjacent_coordinates(coordinate);
for number in &numbers {
'outer: for coordinate in &adjacent {
if number.contains(*coordinate) {
adjacent_numbers.push(number);
break 'outer;
}
}
}
if adjacent_numbers.len() == 2 {
result += adjacent_numbers[0].value * adjacent_numbers[1].value;
}
}
println!("{result}");
}
fn is_symbol(c: char) -> bool {
!(c.is_ascii_digit() || c == '.')
}
fn find_symbol_coordinates(grid: &[Vec<char>]) -> Vec<(usize, usize)> {
let mut result = vec![];
for (y, line) in grid.iter().enumerate() {
for (x, character) in line.iter().enumerate() {
if is_symbol(*character) {
result.push((x, y));
}
}
}
result
}
#[derive(Debug)]
struct Number {
value: usize,
x_min: usize,
x_max: usize,
y: usize,
}
impl Number {
fn new(value: usize, x_min: usize, x_max: usize, y: usize) -> Self {
Self {
value,
x_min,
x_max,
y,
}
}
fn contains(&self, (x, y): (usize, usize)) -> bool {
self.y == y && self.x_min <= x && self.x_max + 1 > x
}
}
fn find_numbers_with_coordinates(grid: &[Vec<char>]) -> Vec<Number> {
let mut result = vec![];
let mut in_number;
let mut accum = vec![];
for (y, line) in grid.iter().enumerate() {
in_number = false;
accum.clear();
for (x, character) in line.iter().enumerate() {
if character.is_ascii_digit() {
in_number = true;
accum.push(character);
if last_digit_in_line(x) {
let number = build_number(&accum, x, y);
result.push(number);
}
} else if in_number {
in_number = false;
let number = build_number(&accum, x, y);
result.push(number);
accum.clear();
}
}
}
result
}
fn last_digit_in_line(x: usize) -> bool {
x == WIDTH - 1
}
fn build_number(accum: &Vec<&char>, x: usize, y: usize) -> Number {
Number::new(
accum.iter().cloned().collect::<String>().parse().unwrap(),
x - (accum.len()),
x - 1,
y,
)
}
#[rustfmt::skip]
fn get_adjacent_coordinates((x, y): (usize, usize)) -> Vec<(usize, usize)> {
if x == 0 {
vec![
(x , y - 1),
(x + 1, y - 1),
(x + 1, y ),
(x , y + 1),
(x + 1, y + 1),
]
} else if y == 0 {
vec![
(x - 1, y ),
(x + 1, y ),
(x - 1, y + 1),
(x , y + 1),
(x + 1, y + 1),
]
} else if x == 0 && y == 0 {
vec![
(x + 1, y ),
(x , y + 1),
(x + 1, y + 1),
]
} else if x == 0 && y-1 == HEIGHT {
vec![
(x , y - 1),
(x + 1, y - 1),
(x + 1, y ),
]
} else if x - 1 == WIDTH {
vec![
(x - 1, y - 1),
(x , y - 1),
(x - 1, y ),
(x - 1, y + 1),
(x , y + 1),
]
} else if x - 1 == WIDTH && y == 0 {
vec![
(x - 1, y ),
(x - 1, y + 1),
(x , y + 1),
]
} else if x - 1 == WIDTH && y - 1 == HEIGHT {
vec![
(x - 1, y - 1),
(x , y - 1),
(x - 1, y ),
]
} else if y - 1 == HEIGHT {
vec![
(x - 1, y - 1),
(x , y - 1),
(x + 1, y - 1),
(x - 1, y ),
(x + 1, y ),
]
} else {
vec![
(x - 1, y - 1),
(x , y - 1),
(x + 1, y - 1),
(x - 1, y ),
(x + 1, y ),
(x - 1, y + 1),
(x , y + 1),
(x + 1, y + 1),
]
}
}
fn find_star_coordinates(grid: &[Vec<char>]) -> Vec<(usize, usize)> {
let mut result = vec![];
for (y, line) in grid.iter().enumerate() {
for (x, character) in line.iter().enumerate() {
if *character == '*' {
result.push((x, y));
}
}
}
result
}
+9
View File
@@ -6,3 +6,12 @@ pub fn read_file(filename: &str) -> Vec<String> {
f.read_to_string(&mut buffer).unwrap();
buffer.lines().map(|s| s.to_owned()).collect()
}
pub fn read_grid(filename: &str) -> Vec<Vec<char>> {
let result = read_file(filename)
.into_iter()
.map(|line| line.chars().collect())
.collect();
result
}