From 01ba0f9ffb7db6deb22a48e9d5cb76fca3029255 Mon Sep 17 00:00:00 2001 From: Tobias Berger Date: Sun, 3 Dec 2023 10:43:10 +0100 Subject: [PATCH] Rust Day 3 Part 1 --- rust/Cargo.lock | 2 +- rust/Cargo.toml | 8 +- rust/src/day03/input.txt | 140 ++++++++++++++++++++++++++++++++ rust/src/day03/main.rs | 11 +++ rust/src/day03/part_1.rs | 71 ++++++++++++++++ rust/src/day03/part_2.rs | 24 ++++++ rust/src/day03/sample_input.txt | 10 +++ 7 files changed, 263 insertions(+), 3 deletions(-) create mode 100644 rust/src/day03/input.txt create mode 100644 rust/src/day03/main.rs create mode 100644 rust/src/day03/part_1.rs create mode 100644 rust/src/day03/part_2.rs create mode 100644 rust/src/day03/sample_input.txt diff --git a/rust/Cargo.lock b/rust/Cargo.lock index 59e1219..7fa7307 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -4,4 +4,4 @@ version = 3 [[package]] name = "advent-of-code" -version = "23.2.2" +version = "23.3.1" diff --git a/rust/Cargo.toml b/rust/Cargo.toml index 9d21233..cb7b221 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "advent-of-code" -version = "23.2.2" +version = "23.3.1" edition = "2021" -default-run = "day02" +default-run = "day03" [profile.release] strip = "symbols" @@ -32,3 +32,7 @@ path = "src/day01/main.rs" [[bin]] name = "day02" path = "src/day02/main.rs" + +[[bin]] +name = "day03" +path = "src/day03/main.rs" diff --git a/rust/src/day03/input.txt b/rust/src/day03/input.txt new file mode 100644 index 0000000..94f0d8b --- /dev/null +++ b/rust/src/day03/input.txt @@ -0,0 +1,140 @@ +..224.....487...................718.....................378............................................284........310......313..........311. +....*..............................*744....486*485......*......741......@...359.#666...439................*925....*......$..+........@...... +.235................758..440...........................251....*......262.....*..........*......................752......774.......515....... +.........705%..@746........+..942*591.347.470...#..257.........637...........793.......299..../.....813....509......464......&.........688.. +.....82................................*.../..901.....*..................836.....&............814...*........*..............80...17*....*... +.../...*...679.661.....299...........222.............875.....213...161............964...894.........998.....310....258.85...........735.586. +.650..23..#......*.......................................760*........@./........................202...................*.....339............. +..............598......#.....536....702*.........705..........793......957............./........*...935...........965....................... +..................*.357...+.....@.......242.......*......283..*...=956.......118.......959...184...*..............*....401*527.....348...161 +.63=...955.523..77......978.846....849..........699..........790........=911.*.....87...............486.........914..............=.......... +.........*.........842......*.......*..................*127....................844...*....946.......................235...209@...710.735.... +...........@.........*.....144....226....298........560.....253.........431......*...586.......723..../...482.......&...................*... +...........871../918........................+....................329*......%.....906.............*...350.....@...............365.......361.. +......................536............................+..793..........664.....739................507......289.....256%...73..*............... +.356..834..............*.........96.939..............28.+....=..............*...........................*................$.553..........526. +...*...*.............501..746....*..-.......=.................890.....+...701..............807........447......97$..%...........58......$... +.891....346...699...........*.421......+....666......198*791......340.433............#...%...*.......................316........*.....%..... +..............%........81.984...........462....................../..........116...711....963...$................380.......745...85....224... +.........370......923..@.....................563...........188+.........326*...................67.815..............*582..................... +.........*........-........#530.........489........59...................................................#.....57.........100.*.......441*161 +.637*....961...........118...........21*...........@..216+.........................+....432*.*309..64....992.......81......=.781.644........ +.....324.........126......*166...............&...................385*..............233............*................*..436...........*517.... +.88*.........390*................355..335...372....+254..............294...$589........&..803/.....38..-...........56..$.................... +....235.-.........+196...948....*........-................359.........................398.............608..../.................145..346..... +........915.................-.485.945.................936*................114.............118...............490.536..............*.%........ +.663........61.......856..........+....343....859...............*345.......*...=862............711.............................313.....606.. +........23...$.....@..................*......................316.....529.362.............49......................307*791.................... +225...............281...#..222.....@..283..............675............*.........911*90..-.....914..%39....509............................... +.......797*....$........23..../...895.............67.......164.896.....554.....................*............=..............460........181... +...........211.474...............................@...........*....*201..........911.717.#....192.75..679...........$.........*.........=.... +....355.........................&.....................678.650......................*.....128.....*.....*.........925..230...105............. +....*.......409#.......*897.....698....427.........+....*.......*...............................313...670..521.......*....&.............*308 +...838..335.................367........-..........325....233...224...950......688.....199.774.........................793.108........501.... +...........*..102..924.349...+..595....................................*................&..............395+.....................753......... +.........318...*......*........*....676...759.154...................524...........908.........694.211................173...........*214..424 +....458........403...........958.98....*........*..............688......957...488..+...........*.../....................................*... +.......*.............591...............218.....203.....196$.......+....*........*......................765......971......./....927*741..227. +......592..%60.$.....*.....885/....287...............................474.........409......226.174.......@........*.....230.................. +...............162.169.................510..962..............17......................32@..*...*.................225....................-.... +.....880...................201.....823*........*...914.724.........89...&.......267=.....717.54.436..........60...............&.........69.. +710........601....306.287.....+.........65...308....&...=.../......*.....926..................................*........278.415......-....... +..............*..*......&..........241.%...................827../.265.............662.678......@...#......@.....$......-............734.144. +.............424..434.....701.....*........380*731.............24.................*...&........973..741....728..357......................... +........304.................*...881................238.....740.........947........587...22...........................271*........603....@... +...................266.....918....................*..........+.519.617..*...826..........*............./268..974.........486.376....*.295... +...939.........363.*...............378..........302....586........*....740...=..........380........931...........................12......... +...*..........-.....387...............*..588..............*..../...............315...................-...712..491.........956.....#......... +.180.454...................104..661...91...*.............811....370......471...-....419....804..........*...................*............... +.....*.......@../464........%..*............243.....578...................&..........*...........604..250.....784....750....998............. +.....245....165.................771...................&.......#.691...768....654....261.........................*.......*............566.... +441..................91.....194.......643...932*............379.#....$.......*.................86.............940..263.638...........*...... +...+.............%.../.......#.........*........344...795..................991..........544....*..................*..........767...266...... +.......-..708..727.....191$......*.....698....=...................990................+.....*....308.......@......325.........*.........44... +...18.397....=.....93.........649.900.........62....-........322.....*.......@......339....619..........404..........540........./....*..... +..../...............%............................742............*...........196................874.205........96#..............203.224...... +.........704...727.................496.......*........135....769........./.................%....&....*.../..=.........757................... +........*........*..424..........&........714.5........*...........@....884...............114.......674.144..83..........*302...........%... +........29....179..*............104..................531....629.455..................473......300....................254..............640... +..................296.......................................................1........*.......%..............548........*.....103............ +....381...........................365#..713.282.......%744....................../....709...#...=...431...$.*......*.....837.....*9.....*.... +......*.90.....347.179#...................%.......359..........92............304...*.....923.446.......385.699.....749..............193.206. +....922.+.......*.......-197.....................*.......128........273....@.....758..............439...................650*54.736#......... +................817..-..........152..594..949..807.......$...224...*.....124............889.......=...................................625... +....139....667......239........*...........*.......387........%..806........../...........*..788....632...........=8......584-......*.%..... +...........*.................280...........11.........*726............181......761..-....66.....%....-................64...........14....... +............742.736.725..........708.667..........332.......828*750......-.........425.......................944.....*...................926 +.719...110...........*.....348...=..........121......*........................................*.......961.....*.......971...........+....... +..../.....*629........830..*............91....&..241..491...930............561................889....*....710.333..............163...311.... +......%...................252.../..................*...........*270.......................165.....208.......*..................../.......694 +...914...126...267.183........952..$645......414.822................................69.......-..........=..112.464..267....359..........*... +.............7*..........................806.../.....931.....*.....355..............*....928...........854.........-..............*993...101 +439.897...........%...........8......381...*........*....748..987....*............437.......*....954.......................*................ +.......*595....783........49.....110.$...675...8...60.....=........981........&..........730....*.............336.......120.790..........386 +............90..............*212...*..........*.......985.....153........*..12...912*383......665.....754.....-.....................950..... +......790#.*........896@.........773....777..581..514*....910.....5.....579.............................=.......#.....................*..... +...&.......496...........347..............*...............*...................../............................790..............334......912.. +692............609....&.......694..........693...213....620......695......871..385.......82..........785.......................*..163....... +.........#....*......984.........*.................=............*.......................................*.545...-............978.....*...... +......971...477.............465......196*313..........447.......766......49.......126*480.............798......792..359*193...........837... +................157...........+..................773.=..............752$....................447*565..........................*53............ +.384%..........@.........449............470..749...@.........@792..............138..527.......................339.....299.505...........287. +......691........700........@......96..........*........721*.....................@....*...942......845........*......-.........713.......... +.....*......260/...*...........................491..452.....336.......................73....+..960..........238...........163$..&...=.@..... +....689.............831...282....709.960.............=.............204............................#..............59...97..........199..111.. +........................$........../........-....498......................557....&...........972............450............................. +.............653........476...398.........619...*.....*280..923..............*31..691.........*........=...*.....67......782................ +..............*....%..........*.........+......268...........&........428....................408....740....576....*.......*.........$....... +....-../...734......317.114.332...795...743.........................-..=..908...........381.......................914...420.*647....528..... +..284.825...............*......................721/.=929.........324.....*....167.561...*.....815*466....................................... +..............389..304.480.......851..@....585..............942%......#.496....*....-.53................170....938*..........518............ +........368..*.....@..............*....941..+.......*...............930.........364.......522......................59.........+....$....652. +...........+.963...................949...........828.784......860............*......420.....*..................*......548...........310.*... +.....476...............*...............=...94.+..................&........589.833....*..426.940.....&.....959.993.&88....................398 +.......*................624....917...838..*...664.......721........................833...$.......672......$............19................... +....350.......................&....=..............333.................707....................................240..336....=...746.263..$463.. +.........................-.........220.....663...../.............*849..#..631.....712....=.../...308.580.............*..........*........... +.78@......../..........422....444.............*...............281............*...*....447..37.......*................814.................... +........./...788...810.........&..............369..985....-................92................................684...............74........... +......279.........*......128/....464........#...../......944........978...............163..984*5.@............+.......165......*....285..... +..................889.............*.......969........................%.......5......&....$........272....................*......374......... +.........&..............@948..*..13.358........796.............632............*....789........91*..............*66........152............... +........508...+..............3...........544.....$.517.....703....*774.......434............/....794........932............................. +...$...........241.....74...........974..*...954............*.......................375..772...........218.........414...........*366....252 +.501..566...............*..........*....599.....#........256.....468@..942.101.........*..........156...*.............*.......998........... +...../.............263.312....+..767..............#.........................*...&95..838.162=.....+....130.........583..544.......176....... +............................936......826.......421.......-139.......982...893.......................*..................*........./.......... +.284.....=724...................661.$....694........85..........438.............51...............616.698.*36.....262......357+........224... +....@..........491........+........................@......193......*596...........%../844...387.................$.....132.........%......... +.......84..............362.................................*..98..........&................*....14....394..........$..............56........ +.........*432.....512................704......424.............*............74........196%..875...*.....*............132.......229........... +..............723*.........568........*..108........672......55.172...217.........................289.427........................*.......... +.........#795.........214....*.336...94....*....988................%..&.............*86......*...............838&.......540.......902....... +.922...........288........719.....*........845...&..558......#...................524......195.704.....................................77.... +...*....842....../...166........883...-................*503..451..305../....600............................900..280.....*169...586.......... +751....*.........../.*......944......116....416.........................877....*....418...194........644..*....=.....244..........#.....354. +.......118......208...................................788...................826........$....$...207.....@..152...........893*608.......&.... +..948.......................203../....206.............*....341./977.916.........49...#........@....-............+385........................ +...*......266.................*...607...@.990......964..............-..........*.....340...697........62..............526.....-............. +..675.....*..........612....604.............*..............492.884...........212...............*157....*...679.........*....706...716%.518.. +......103.749..989...*...................739..............$......=..=..................212..684.....35.......*.........785..............+... +..343*......../.......680.....................*423.................476....&....420..............241..*......532.....+.......864$.....&...... +..................826........403..311...60.451.............+...........562....../.......306.......*..............420..................321... +...241..............*...........+..=....@......*240.......845....@.........740.................968..389.177*...................640.......... +......*82...........963...211%...............38...............901.....404.........&..253..............-.....37.........218.501...*....320... +....*...........................#215...264......298........................*970..801....*....569...............3.......*......%..859.*...... +.136.818...212...........91*72........*.........-...750.....775*728.29.270...............984.&...371..........*.........639..........670.... +...........*.../959................438.....524......*...943.........*................755...................162.................446#......... +..........290.............751................*.....557..*...483.............421.........*............189.%................/................. +....................9.786..-......835.......978........445.%..........350........860..662.......#...*....354........*.....682............... +.117..57+....441...*....+............................................../............*.........88....142..........%.927...................... +...*...........*..402....................874.....734.926$../...............*633......219.84/............662...205...................334..... +...981........367........338...332/.........=......*......119....375#.334.......146..............%.....$................384.............-511 +........165................=....................666.....................#..614.....-..%744..617.887.......848*.............................. +...........*.203.593...158....*..........152..............+817.....866.......&...............*......../.......904........701.165.80......... +404..977.93..*....*....*...396.281......*....953....*................*.........116..97.70=..179....107..338................$...*....622..... +......=.....445........................382.....*...672................859......*...%....................&..........-.571......717....*...... +..................240............175..........808..............225..........988............/604..............232.448..*..651......769....... +.........569*....*........975*.....*....968..............585.....*................26.................................394....@.142........... +......*......498..969.........360.666...%.........................919.......360........-.*.........%...................................484.. +...407................886...................................84......................933...101....58........839..425......................... \ No newline at end of file diff --git a/rust/src/day03/main.rs b/rust/src/day03/main.rs new file mode 100644 index 0000000..333bf98 --- /dev/null +++ b/rust/src/day03/main.rs @@ -0,0 +1,11 @@ +const INPUT: &str = include_str!("input.txt"); + +mod part_1; +use part_1::part_1; +mod part_2; +use part_2::part_2; + +fn main() { + println!("{}", part_1(INPUT)); + println!("{}", part_2(INPUT)); +} diff --git a/rust/src/day03/part_1.rs b/rust/src/day03/part_1.rs new file mode 100644 index 0000000..f39bc28 --- /dev/null +++ b/rust/src/day03/part_1.rs @@ -0,0 +1,71 @@ +use std::iter::Sum; + +#[derive(Debug)] +struct PartNumber(u64); + +impl<'a> Sum<&'a PartNumber> for u64 { + fn sum>(iter: I) -> Self { + iter.fold(0, |acc, x| acc + x.0) + } +} + +pub(crate) fn part_1(input: &'static str) -> u64 { + let mut part_numbers = vec![]; + for (y, line) in input.lines().enumerate() { + let mut search_index = 0; + loop { + let search_line = &line[search_index..]; + if search_line.is_empty() { + break; + } + let Some(number_start) = search_line.find(|c| char::is_ascii_digit(&c)) else { + break; + }; + let number_end = search_line[number_start..] + .find(|c| !char::is_ascii_digit(&c)) + .unwrap_or(search_line.len() - number_start) + + number_start; + + let number = search_line[number_start..number_end] + .parse() + .expect("Should be a valid number"); + + // This `line.len()` assumes the input is square + let mut has_symbol_neighbor = false; + 'symbol_search_loop: for y in y.saturating_sub(1)..=usize::min(y + 1, line.len() - 1) { + for x in (search_index + number_start).saturating_sub(1) + ..=usize::min(search_index + number_end, line.len()) + { + let idx = y * (line.len() + 1) + x; + let char = input.as_bytes()[idx] as char; + if !matches!(char, '0'..='9' | '.' | '\n') { + has_symbol_neighbor = true; + break 'symbol_search_loop; + } + } + } + + if has_symbol_neighbor { + part_numbers.push(PartNumber(number)); + } + search_index += number_end; + } + } + + part_numbers.iter().sum() +} + +#[cfg(test)] +mod tests { + const SAMPLE_INPUT: &str = include_str!("sample_input.txt"); + + #[test] + fn test_with_sample_solution() { + assert_eq!(super::part_1(SAMPLE_INPUT), 4361) + } + + #[test] + fn test_with_solution() { + assert_eq!(super::part_1(crate::INPUT), 539590); + } +} diff --git a/rust/src/day03/part_2.rs b/rust/src/day03/part_2.rs new file mode 100644 index 0000000..928ee24 --- /dev/null +++ b/rust/src/day03/part_2.rs @@ -0,0 +1,24 @@ +pub(crate) fn part_2(_input: &'static str) -> u64 { + todo!("Part 2") +} + +#[cfg(test)] +mod tests { + const SAMPLE_INPUT: &str = include_str!("sample_input.txt"); + + #[test] + fn test_with_sample_solution() { + assert_eq!( + super::part_2(SAMPLE_INPUT), + todo!("Add result from example part 2") + ); + } + + #[test] + fn test_with_solution() { + assert_eq!( + super::part_2(crate::INPUT), + todo!("Add result for solved part 2") + ); + } +} diff --git a/rust/src/day03/sample_input.txt b/rust/src/day03/sample_input.txt new file mode 100644 index 0000000..624ea4f --- /dev/null +++ b/rust/src/day03/sample_input.txt @@ -0,0 +1,10 @@ +467..114.. +...*...... +..35..633. +......#... +617*...... +.....+.58. +..592..... +......755. +...$.*.... +.664.598.. \ No newline at end of file