adventofcode

git clone https://git.ce9e.org/adventofcode.git

commit
e49df461ecca8aeb51f36498bd6ea6a90c7ce92f
parent
6d82bb5b76f5e11f770d9751b9b7d15a98411ae9
Author
Tobias Bengfort <tobias.bengfort@posteo.de>
Date
2023-12-03 10:21
2023-12-03

Diffstat

A 2023/03/input.txt 140 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A 2023/03/solution.rs 103 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A 2023/03/test.txt 10 ++++++++++

3 files changed, 253 insertions, 0 deletions


diff --git a/2023/03/input.txt b/2023/03/input.txt

@@ -0,0 +1,140 @@
   -1     1 ...........................775.651...............887....79...946...921...493.....942..942.....151....155....................................
   -1     2 ......240...................*.....-......................$..*...................*.......%.....+....................956.549.*290.......834...
   -1     3 .485...+............437......906......%..608.805.725..72.....242....745..61......440................................*..*.........515...*....
   -1     4 ..........917.......&....146........790.....*......*....*..........*.....*...............207*......................796..116......../...924..
   -1     5 722...323.-................./...410.............72..748.442............384.708...............849..%............................470..........
   -1     6 .....*..........................*.....271..691....-...............4*...........388.................448......&........*....848&......751.....
   -1     7 ....370..$....639.748.......*...467....*.....*........921*909.....................*...32.....................165..452.30....................
   -1     8 ........984....*.....*...782........711.....50.172...............61&..........415.803.*.........524.......................203.......106*643.
   -1     9 ...............57..433.........390....................&../.............*122...........674.........*.........................................
   -1    10 379..................../.........*........908..477...305.876..*..............297.415*......+.......94........../.....@378.......226..56*....
   -1    11 ...*..-......82.......167...936.17..958...=....*...............196......+......*.......-...380.992.............989.........29......*....301.
   -1    12 ..124..317.....*....................*..........839.......................191.882......231.........+......976.................+......469.....
   -1    13 ............643................*........778............541........655..............*............*........./............*.................515
   -1    14 .....&............498#...&....726.774..............111....*378..................723.221.......473............752....523.638.......789...*...
   -1    15 .....353................518..........-.........../....*...............*88.........................*..@280..=..-....................-..297...
   -1    16 ...........279...........................*816.....286.975.&319.....614......694.......799.......503.......861...569.............+...........
   -1    17 ..474........*.228..............308......................................................*............207........................838..408...
   -1    18 ...........226./....*................82.........................268/......814.........640.............../..489........719..=..........*.....
   -1    19 ....83............88.544....250.......=...87..............199.........115*....................................*...377.@.....643........658..
   -1    20 ........-...651.............*................&..............................*379.....411...686.397............202.*....../........217.......
   -1    21 .....781.......*897......630................330.....117.961..........61..543.....#...*.....*.......323.............996.603.......*..........
   -1    22 .......................................................*........473....*.....739.184.511..........+......43.833.................953...@.....
   -1    23 ....110......@471...........*464....@.347......779................/.....205.*.......................681.....@.........................694...
   -1    24 .........................203......158.-....310./...449...726*982.............437.....+....259...................185......940*702............
   -1    25 .....465....*.......747....................*..........*...............................238..&......./..963...755....*........................
   -1    26 .....*....687..104..%.........645........959..497..732........988........733.....12...........417.176....$..........176.323....657..........
   -1    27 ...566........*...........938*......418......*............925....*28..............-.156........*................................*..#........
   -1    28 .............933.......................*....988........../............................*........813.................868*674...375...839......
   -1    29 .....................804.......464..452...................................47......324.789..........692*288..................................
   -1    30 ...959...........792....*10.....=......................*455.77...827.99....*.........................................166.......8...586......
   -1    31 .....*...607......*..............................12.764......*.......*..905....590.236...#.677...823......972..204............*......*......
   -1    32 ..661....*........776....938..901.............@.*.........$...216...995...........*....382..*....#....546*.....#...........564........707...
   -1    33 ......755................*.......*698......315..291.......964................-.......=.....865........................521........150........
   -1    34 ........................323............./............973.........*35..........318.....204...........546..+667....214%..*..............973...
   -1    35 ........143......&725...........619....149..............*235..650.........604..........................*..............195..............*....
   -1    36 ................................*.................................926...................@240......+...433..302..672.........977....149..335.
   -1    37 .......880.......&...............301.512.$.....876......331.897...#..............#...............464......+...........938.........*.........
   -1    38 ......@....942...603....&....879..........117..........*.....*.............562..905....377*862..............*56.........%........352..*165..
   -1    39 .726......*..........239....*.....915..............@...661...905..............*...................466....223.................730............
   -1    40 ....*......97..839.......308.........*....115....512..........................497.392.....563........=...............448...........462*884..
   -1    41 ....122.........*...471*...........52...&..=...................=..................@.........*...............................531.............
   -1    42 .........*..522...&.....274...........116......*572...........907..........................161..670@..@....................=........57*.....
   -1    43 .........28.*.....606.......................925...............................908...86...............78..............712.....813*......16...
   -1    44 ....549.....512....................................825.....797.......224..660*........@.425*656.........=536..256.......*........599........
   -1    45 ...*.............963..................842..704.............+....425..*..............................102.......$....565.179..774/........576.
   -1    46 ...................*..........................*..............=...*....922........50...262....%............603......*........................
   -1    47 .......636.......349...&...224...$............899.........983..319.............#........&...663....*575..%.......95.....383*................
   -1    48 ......=...............928........218................84.............964.........953..+...........212.........................857.............
   -1    49 ............................179.......68......................&....*.................787.............92&.72....455..969...........846..40...
   -1    50 .993=..../..........110.407*...........%.............164..#....306.215...................552..............*....=...#.....69.602...#...*.....
   -1    51 ......322..........#...........561..............968..*....913............%..........@586...=.330...........166.............*........863.....
   -1    52 ............810...........157.*....557.....30.*.....774...................968.601*...........*....491..........557.....83*..................
   -1    53 .......*368.*.......842...*...435.-...........65.-................................680.....913....#.......793....*.........87.262....34.-....
   -1    54 ....896......875.....*...........................581.957..758............$................................@..981..............#......*.844..
   -1    55 ..................957...150.......503................@....*......89....59......261..........653....................................372......
   -1    56 ...731...-129..+........*........-......................718.713....*.......197..*......30......+...476............872.......................
   -1    57 ....*...........671....917.......................800.&......=....197..763....*...96......#.........*......%......*..........739......290....
   -1    58 .....234..............................814*251....../.755.............../...375.....................309.914..816...877..=.......$......$.....
   -1    59 .........543.378.....74.%608.25...755..........237..............834..................431..................../..........585..................
   -1    60 ....408...&...*..............*................*.............214*.....................*.........89.475*.......................@..939..824....
   -1    61 ...*..........526..........713..&.....132...899..108.75..#..................521....428....97../.......603.....248.........878...&...*.......
   -1    62 ....383...............873......1....................*....850....862....%......#.=................533.........*.......................863....
   -1    63 .............852.........*................578%....................*..492.........905.145.927........*........437.107.....@....29............
   -1    64 ......604.......#./531.179..&........56.........921..233.......943......................*..........174...........*.......271.*...32.........
   -1    65 ........*..619.............588......*............*...*..............918*837.....120.128......508...........536...............558...*638.....
   -1    66 523....794...-....................451..544....648..365.778.....@.............@.....*............$..%414...*............453#.................
   -1    67 ..................&......124*...........*...............*...259........696...424...........*...............322..534................*519.....
   -1    68 ........201*.30...474........567.526..363............%.963......287+......*.........939.964.....994.............*.....-........287.......657
   -1    69 ........................709*......=.........854...527................50..591...859....%..........*....196.......188..395..157...*...........
   -1    70 .281*....878................354.......*221...*............308....309...*.........$..@...72#......577.........................*...734.....481
   -1    71 .....9....*.............658........235......767..12..548...=...#.......585..830....609........................603.130.....884...........*...
   -1    72 ........324........@...*........................*....*........628.............................................*...$...........=......658....
   -1    73 ..................139.206....$.....768*........986....311..........967...15...174....100-.....7$..............962....=.........561..........
   -1    74 ......521.....154.............318......622...................-.............%...@.................856.......60.........24..481.......520.772.
   -1    75 .825..#.......*.............................180.............228.11.....173.......128......428.........405.+...68...........=..882......*....
   -1    76 ....*.......657...........27....798*460...................@............-..............31.*.....840...........*................@.............
   -1    77 .965...931............974...*...........................798.................455*.........856......*...809...97..934.740$..570...............
   -1    78 ........*..511.$427....../..652..-297............296........$........552..........884..................*........%........*........128.......
   -1    79 ..........-..........207............................=....641.........+..........-..*....43..........329................990...........*......
   -1    80 .10...................=..11....&............................./.143........875..732....&.......&............................349.....265...858
   -1    81 ...*......222....495%...*...618..322.......%.........116...833....*........*.........776....288....760.........-............-...............
   -1    82 ....291......*..........453.........*...811...398..............515........365..445....................*.....961.........433......743...$....
   -1    83 .............33..................543.........@..........................=...../.....793*...........266..............668...........#.....804.
   -1    84 ................701....................17*.................449*741.....961......814..........................*245......*...809*.............
   -1    85 .......206......*....668..728$............529..........*93........................-...833.713..............69.......292........157...224*...
   -1    86 ..........*585...969............810..522............866..............254.....570........*....*.....588..................+113.......-.....752
   -1    87 ................................/......../......257.............119...-..844...*..979..442....169.....=.259......+.............752..401.....
   -1    88 ...726...967........&.234.................326.....*....590*636...*............130.../.........................933.....652*439...*...........
   -1    89 .....*......*12..332...-...........500#..........944..............747.......$.....................203....513.......................%864.....
   -1    90 ....389.&....................*...............938.......893....970.........864........538.755&.258..*........#...............717.96......+...
   -1    91 .65.....180...&.............864.....169.........*................*...390............*.........*....904.........................*...354...478
   -1    92 ....620......472.726.931...............*.......150../.......@....960....................*928.812...........................428......*.......
   -1    93 ...*................*.................463..........323.....478..........964..........175.........324%........=827......66.......193..303....
   -1    94 313.......................@...705.214.....174&........................-.....271........................818...............*.........+........
   -1    95 ........171+..830...328..158...*..%..................17....721.....568......../...........949.............*.............608.....90......570.
   -1    96 ....327..........*....*.......44......................*..................193-.......67.................970......966.503................#....
   -1    97 669*..........386..306....+............105............443...........................*........490..130...........*....$..........$62.........
   -1    98 ......454...............&..954...38....*..........229....................643......388.671....@.......*...8......506....66*148.........$.....
   -1    99 ......*................259.........*.................*756.......596.........*........................638..+....................%....854.....
   -1   100 ...700......895..............................757................*.........847..............630*612..................854..606....38..........
   -1   101 ...............*.....93.....573......274........*...952..336...................562..................+...637............*.*..................
   -1   102 945........../.814..=..........*....*...........38..=............-....&........*..................118......*.........745..855.........367...
   -1   103 ......676..688..................604..153...............671......513...690....891.%.....101.728..........767......28...................../...
   -1   104 .........=.......700..222.443............114.....................................458...../....#...................*.........=...............
   -1   105 ...........660.%...&.....*.....98.232.......*............308.......650..267/..........$............................417.....806.....502......
   -1   106 .......276*....500............@.............63.......621*.....520...-........913.....225.........620.597...709*632.............663*.........
   -1   107 ...................232...149............65.......................&........................228.....%.....-................467............800.
   -1   108 ..........118........+....*....@.........-.458...737.....-247.........425................/..................574......424*.........421..*....
   -1   109 ......158.-....*........564.599......128......*...#..........................419.............764*156.............................*......996.
   -1   110 ............577.563.....................*...777.......................508..............*827............................*465.....306.........
   -1   111 .........................*..............848......996*......688....154...*.......%...780......51...410......357.148..856.....................
   -1   112 ...648.............835.713....*...609.......................&........*..885....494..........*..........661....*.............................
   -1   113 ...-.....477./693..*........938.....*./...........642..149......465.502......$............=.523.........#.......892................=824.....
   -1   114 ....................296...........44...707..........+.....*...................462......476........@...............*..........388............
   -1   115 .....58...321..............127................................446...............................965....446........114.........*.............
   -1   116 .........*........951...3....*.................623.263.............=.-....122..........................=....519*...........692.......%313...
   -1   117 ........943.......*......$....990.......795..../......*..135.....815.483....*..937*.............................634..............771........
   -1   118 ............460....757.....@......511/..*............564..-..............340.......109.206.......%785..148...21....................*....&...
   -1   119 .47.........&...............102........265......555..................182......12*.........................*...%.................788..200....
   -1   120 .../............=..................#82..........$.......207.............*863.....751.........251.....641.702.......141..640.................
   -1   121 ..........23..902.......174...............*.............=.....314...........................*..........*.....*667...........*...............
   -1   122 .........*...............*.......*766..842.35.......243..........*......@..................57..435....501.285.............964.....*.........
   -1   123 ..165...100.@512.........292.......................%......79..@...726....341.511*.............*...................573..........602.74.......
   -1   124 ...*..................................596#...&...............769........................314.397..&31................%..855..................
   -1   125 ...6.....673....................898..........836.......827.......+.....-..............................133*766..........*..............290...
   -1   126 ..........*.........799........*.........629.......634........%.188.103.......594......464.799*295.............895...930.........-....$.....
   -1   127 .....908..504.......*......603..800..936...*......*.........768..........973...*.......*...............904*16.*................358..........
   -1   128 .....@............825..%......&.........*...963.294.74...........%........*....102...967...-343.................#..................94.698...
   -1   129 .810...................968..............429...........*....950..313..482..397...................33.........@..297..198...114.......*...*....
   -1   130 .....-............................554..................................-.......245.$...............991..282.........-...*....161..894..78...
   -1   131 ..705.....177.....*..872@.285........*.../813.........235....729..........*287..*...472.788.645........................144..................
   -1   132 .............*..984.......*........722............496*..........*990....79......715........*............456...................812..470......
   -1   133 ............518......@.....950.........712..............981...........................238....579.533........373.466...615/......$.....*907..
   -1   134 ..716..907.......761..471..............*......../...........823..+............978*......=.....*.....#......&....*...........................
   -1   135 ....*...............*........990.331...46....871...........*.....447.723...@...............594...............801......................#757..
   -1   136 ...312...*.........211..........*.................90.860...970.........*...375...........*.....-....*779.........&..........................
   -1   137 .......692..............602.............................*.............595.............841...166..327......-444....154.......................
   -1   138 ..............$....316..=.............+978.843........42....135/.+332.........454.........................................707.../......295..
   -1   139 .........$....743..../.......-................+........................*990..................343......#.....*...............*....684........
   -1   140 ......651.....................644....................887.812........187.................783........749...928.291...........131...........293

diff --git a/2023/03/solution.rs b/2023/03/solution.rs

@@ -0,0 +1,103 @@
   -1     1 #[path = "../lib.rs"]
   -1     2 mod lib;
   -1     3 
   -1     4 fn parse(line: &str) -> (Vec<(u32, usize, usize)>, Vec<usize>, Vec<usize>) {
   -1     5     let mut numbers = vec![];
   -1     6     let mut symbols = vec![];
   -1     7     let mut gears = vec![];
   -1     8     let mut number = 0;
   -1     9     let mut number_len = 0;
   -1    10 
   -1    11     for (x, c) in line.chars().enumerate() {
   -1    12         if let Some(i) = c.to_digit(10) {
   -1    13             number = number * 10 + i;
   -1    14             number_len += 1;
   -1    15         } else {
   -1    16             if number > 0 {
   -1    17                 numbers.push((number, x - number_len, x));
   -1    18                 number = 0;
   -1    19                 number_len = 0;
   -1    20             }
   -1    21             if c != '.' {
   -1    22                 symbols.push(x);
   -1    23             }
   -1    24             if c == '*' {
   -1    25                 gears.push(x);
   -1    26             }
   -1    27         }
   -1    28     }
   -1    29 
   -1    30     if number > 0 {
   -1    31         let x = line.len();
   -1    32         numbers.push((number, x - number_len, x));
   -1    33     }
   -1    34 
   -1    35     return (numbers, symbols, gears);
   -1    36 }
   -1    37 
   -1    38 fn part1(numbers: &Vec<(u32, usize, usize)>, symbols: Vec<&Vec<usize>>) -> u32 {
   -1    39     let mut sum = 0;
   -1    40 
   -1    41     for (number, start, end) in numbers.iter() {
   -1    42         let s = if *start > 1 { *start - 1 } else { *start };
   -1    43         for x in (s)..(*end + 1) {
   -1    44             if symbols.iter().any(|s| s.contains(&x)) {
   -1    45                 sum += number;
   -1    46                 break;
   -1    47             }
   -1    48         }
   -1    49     }
   -1    50 
   -1    51     return sum;
   -1    52 }
   -1    53 
   -1    54 fn part2(gears: &Vec<usize>, numbers: Vec<&Vec<(u32, usize, usize)>>) -> u32 {
   -1    55     let mut sum = 0;
   -1    56 
   -1    57     for gear in gears.iter() {
   -1    58         let mut neighbors = vec![];
   -1    59         for n in numbers.iter() {
   -1    60             for (number, start, end) in n.iter() {
   -1    61                 if *gear + 1 >= *start && *gear < *end + 1 {
   -1    62                     neighbors.push(*number);
   -1    63                 }
   -1    64             }
   -1    65         }
   -1    66         if neighbors.len() == 2 {
   -1    67             sum += neighbors.iter().product::<u32>();
   -1    68         }
   -1    69     }
   -1    70 
   -1    71     return sum;
   -1    72 }
   -1    73 
   -1    74 fn main() {
   -1    75     let mut sum1 = 0;
   -1    76     let mut sum2 = 0;
   -1    77 
   -1    78     let mut prev_symbols;
   -1    79     let mut curr_symbols = vec![];
   -1    80     let mut next_symbols = vec![];
   -1    81 
   -1    82     let mut prev_numbers;
   -1    83     let mut curr_numbers = vec![];
   -1    84     let mut next_numbers = vec![];
   -1    85 
   -1    86     let mut curr_gears;
   -1    87     let mut next_gears = vec![];
   -1    88 
   -1    89     for line in lib::iter_input() {
   -1    90         (prev_symbols, prev_numbers) = (curr_symbols, curr_numbers);
   -1    91         (curr_symbols, curr_numbers, curr_gears) = (next_symbols, next_numbers, next_gears);
   -1    92         (next_numbers, next_symbols, next_gears) = parse(&line);
   -1    93 
   -1    94         sum1 += part1(&curr_numbers, vec![&prev_symbols, &curr_symbols, &next_symbols]);
   -1    95         sum2 += part2(&curr_gears, vec![&prev_numbers, &curr_numbers, &next_numbers]);
   -1    96     }
   -1    97 
   -1    98     sum1 += part1(&next_numbers, vec![&curr_symbols, &next_symbols]);
   -1    99     sum2 += part2(&next_gears, vec![&curr_numbers, &next_numbers]);
   -1   100 
   -1   101     println!("part1: {}", sum1);
   -1   102     println!("part2: {}", sum2);
   -1   103 }

diff --git a/2023/03/test.txt b/2023/03/test.txt

@@ -0,0 +1,10 @@
   -1     1 467..114..
   -1     2 ...*......
   -1     3 ..35..633.
   -1     4 ......#...
   -1     5 617*......
   -1     6 .....+.58.
   -1     7 ..592.....
   -1     8 ......755.
   -1     9 ...$.*....
   -1    10 .664.598..