adventofcode

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

commit
5427d198e5119c3279ef48950b13c31ef01337d9
parent
6536536674b6aec193c49279cf7196dd3365eadb
Author
Tobias Bengfort <tobias.bengfort@posteo.de>
Date
2023-12-05 09:56
2023-12-05

Diffstat

A 2023/05/input.txt 221 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A 2023/05/solution.rs 131 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A 2023/05/test.txt 33 +++++++++++++++++++++++++++++++++

3 files changed, 385 insertions, 0 deletions


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

@@ -0,0 +1,221 @@
   -1     1 seeds: 2019933646 2719986 2982244904 337763798 445440 255553492 1676917594 196488200 3863266382 36104375 1385433279 178385087 2169075746 171590090 572674563 5944769 835041333 194256900 664827176 42427020
   -1     2 
   -1     3 seed-to-soil map:
   -1     4 3566547172 3725495029 569472267
   -1     5 2346761246 1249510998 267846697
   -1     6 1812605508 937956667 271194541
   -1     7 1421378697 1209151208 40359790
   -1     8 2083800049 2788751092 262961197
   -1     9 2938601691 473979048 463977619
   -1    10 473979048 1517357695 947399649
   -1    11 4136019439 3566547172 158947857
   -1    12 1461738487 3051712289 350867021
   -1    13 2614607943 2464757344 323993748
   -1    14 
   -1    15 soil-to-fertilizer map:
   -1    16 3107230831 2583931429 576709409
   -1    17 970181981 608291332 1441137369
   -1    18 743954495 3859046283 158951815
   -1    19 3683940240 3227916509 91282070
   -1    20 608291332 2448268266 135663163
   -1    21 3775222310 2049428701 398839565
   -1    22 2411319350 3319198579 539847704
   -1    23 2951167054 4017998098 156063777
   -1    24 902906310 3160640838 67275671
   -1    25 
   -1    26 fertilizer-to-water map:
   -1    27 1257642402 395703749 69589612
   -1    28 1800674 2215701547 90550534
   -1    29 2757853693 358464863 37238886
   -1    30 3285451399 181079109 43937782
   -1    31 2346544130 3513448371 192150886
   -1    32 3866348216 4231433060 63534236
   -1    33 1327232014 1560332334 90281838
   -1    34 2538695016 616206288 114467702
   -1    35 255018176 225016891 46372244
   -1    36 1171065990 3705599257 27021880
   -1    37 1070753744 730673990 442780
   -1    38 221369008 3479799203 33649168
   -1    39 2987721226 271389135 80072982
   -1    40 1198087870 732917444 24556356
   -1    41 199036270 2306252081 22332738
   -1    42 0 731116770 1800674
   -1    43 3929882452 3989920675 212758268
   -1    44 631506549 757473800 322942578
   -1    45 301390420 0 157952443
   -1    46 2795092579 157952443 1997721
   -1    47 1222644226 2619085211 34998176
   -1    48 954449127 499901671 116304617
   -1    49 1429766246 159950164 21128945
   -1    50 2205492221 2074649638 141051909
   -1    51 2749302577 3732621137 8551116
   -1    52 459342863 1219863414 57737723
   -1    53 3329389181 3741172253 59047790
   -1    54 2797090300 2328584819 190630926
   -1    55 3278448653 351462117 7002746
   -1    56 126959518 1277601137 72076752
   -1    57 92351208 465293361 34608310
   -1    58 4142640720 3866348216 123572459
   -1    59 2143980560 1080416378 43307177
   -1    60 1450895191 2672287871 693085369
   -1    61 517080586 3365373240 114425963
   -1    62 3388436971 1662866566 411783072
   -1    63 2187287737 2654083387 18204484
   -1    64 1417513852 1650614172 12252394
   -1    65 3067794208 1349677889 210654445
   -1    66 4266213179 4202678943 28754117
   -1    67 2653162718 1123723555 96139859
   -1    68 1071196524 2519215745 99869466
   -1    69 
   -1    70 water-to-light map:
   -1    71 512627839 90187036 1196629
   -1    72 3379634653 2059506154 33434334
   -1    73 3286651054 4276482087 18485209
   -1    74 4233695090 28914830 61272206
   -1    75 3413068987 3322576776 23288997
   -1    76 3736304424 3345865773 43267308
   -1    77 1246285471 2994853001 251748584
   -1    78 3779571732 1946298040 113208114
   -1    79 390808412 3287769466 34807310
   -1    80 1881283842 2879009693 106527924
   -1    81 3964031050 2506138169 12994476
   -1    82 3436357984 793897944 162691614
   -1    83 2255160753 2092940488 151061610
   -1    84 853985057 3506201042 119010035
   -1    85 301385394 1856875022 89423018
   -1    86 972995092 658665705 34308693
   -1    87 4159948022 1315925500 65322692
   -1    88 640912738 250463411 213072319
   -1    89 1761800914 91383665 102591221
   -1    90 450345319 3246601585 5793995
   -1    91 3186220306 4173678310 91115364
   -1    92 28914830 3633635453 176360375
   -1    93 456139314 193974886 56488525
   -1    94 2523290324 3809995828 187303152
   -1    95 2406222363 3389133081 117067961
   -1    96 205275205 2782899504 96110189
   -1    97 2135785589 1100569535 119375164
   -1    98 1121466033 533846267 124819438
   -1    99 1007303785 2244002098 114162248
   -1   100 3599049598 3997298980 137254826
   -1   101 4077949072 463535730 70310537
   -1   102 4225270714 3625211077 8424376
   -1   103 1498034055 2519132645 263766859
   -1   104 2710593476 1381248192 475626830
   -1   105 3977025526 692974398 100923546
   -1   106 4148259609 4264793674 11688413
   -1   107 1987811766 2358164346 147973823
   -1   108 3892779846 1244674296 71251204
   -1   109 3340510149 4134553806 39124504
   -1   110 1864392135 956589558 16891707
   -1   111 425615722 1219944699 24729597
   -1   112 513824468 973481265 127088270
   -1   113 3277335670 2985537617 9315384
   -1   114 3305136263 3252395580 35373886
   -1   115 
   -1   116 light-to-temperature map:
   -1   117 1094191559 698410082 28110394
   -1   118 383870732 1189042355 107231661
   -1   119 3711052230 2164474756 34756304
   -1   120 745558539 170241759 7170863
   -1   121 491102393 503970250 194439832
   -1   122 4034618875 3142749029 146609939
   -1   123 3781998432 1718948669 129329785
   -1   124 2440091414 3071819711 70929318
   -1   125 1301358031 55123603 115118156
   -1   126 0 2789116652 87933685
   -1   127 770729148 177412622 48955790
   -1   128 3772681560 3886204605 9316872
   -1   129 752729402 37123857 17999746
   -1   130 3745808534 2137385460 7147939
   -1   131 2028807236 3677936618 208267987
   -1   132 2237075223 3289358968 92979022
   -1   133 88764920 1960439220 176946240
   -1   134 3568470355 2258695303 142581875
   -1   135 3276170082 1848278454 112160766
   -1   136 2637902204 1129503077 39814191
   -1   137 3000547589 892603630 188042422
   -1   138 2511020732 226368412 126881472
   -1   139 1122301953 1296274016 52818372
   -1   140 1440958847 1353023078 243104929
   -1   141 2963423732 0 37123857
   -1   142 3388330848 2199231060 48304954
   -1   143 1175120325 377732544 126237706
   -1   144 819684938 1349092388 3930690
   -1   145 3752956473 1169317268 19725087
   -1   146 3911328217 2144533399 19941357
   -1   147 1416476187 353249884 24482660
   -1   148 2677716395 3895521477 285707337
   -1   149 265711160 2413138935 118159572
   -1   150 685542225 1080646052 48857025
   -1   151 3556608598 2401277178 11861757
   -1   152 734399250 2247536014 11159289
   -1   153 87933685 3677105383 831235
   -1   154 3188590011 1596128007 87580071
   -1   155 836373414 2531298507 257818145
   -1   156 3471876393 2877050337 84732205
   -1   157 1684063776 726520476 166083154
   -1   158 823615628 3560998296 12757786
   -1   159 3436635802 1683708078 35240591
   -1   160 3931269574 3573756082 103349301
   -1   161 1850146930 3382337990 178660306
   -1   162 2330054245 2961782542 110037169
   -1   163 
   -1   164 temperature-to-humidity map:
   -1   165 1773059646 4122818507 172148789
   -1   166 2417158855 2859734866 110076859
   -1   167 977168274 1576624124 28149321
   -1   168 4275291678 3797606290 19675618
   -1   169 1141296808 749646180 267286171
   -1   170 3592756112 2969811725 273274339
   -1   171 0 19621130 7167651
   -1   172 2059084943 2697725300 48133058
   -1   173 2107218001 3920609496 145140777
   -1   174 1453481278 1152911564 151292167
   -1   175 1408582979 1465584228 44898299
   -1   176 7167651 0 19621130
   -1   177 2907567891 1829621431 240604380
   -1   178 2252358778 3652347291 145258999
   -1   179 1005317595 1016932351 135979213
   -1   180 1945208435 2745858358 113876508
   -1   181 2397617777 4065750273 16506015
   -1   182 3251499859 1776094709 53526722
   -1   183 2867005672 4082256288 40562219
   -1   184 26788781 1304203731 161380497
   -1   185 3305026581 2409995769 287729531
   -1   186 3866030451 3243086064 409261227
   -1   187 2414123792 1773059646 3035063
   -1   188 911026677 1510482527 66141597
   -1   189 3148172271 3817281908 103327588
   -1   190 2527235714 2070225811 339769958
   -1   191 188169278 26788781 722857399
   -1   192 
   -1   193 humidity-to-location map:
   -1   194 3907319746 3137303541 31421983
   -1   195 3085093695 1018495475 286155292
   -1   196 2898003508 2491485887 87665522
   -1   197 2546787368 2901838353 7997221
   -1   198 3835317650 2829836257 72002096
   -1   199 2554784589 3509894030 133012322
   -1   200 3487595595 3719561871 104747874
   -1   201 3714670750 2667334372 120646900
   -1   202 975094571 2909835574 227467967
   -1   203 2985669030 3864000834 99424665
   -1   204 3672962118 2449777255 41708632
   -1   205 3631107133 2787981272 41854985
   -1   206 3938741729 3963425499 15057061
   -1   207 3447904506 3824309745 39691089
   -1   208 1824175159 1304650767 641793976
   -1   209 242892183 0 6504921
   -1   210 3371248987 3642906352 76655519
   -1   211 1698833898 2258930589 81940357
   -1   212 0 6504921 242892183
   -1   213 2465969135 3978482560 80818233
   -1   214 3592343469 4256203632 38763664
   -1   215 3953798790 3168725524 341168506
   -1   216 2775979874 4134179998 122023634
   -1   217 1780774255 975094571 43400904
   -1   218 1311468847 1946444743 312485846
   -1   219 2687796911 2579151409 88182963
   -1   220 1202562538 2340870946 108906309
   -1   221 1623954693 4059300793 74879205

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

@@ -0,0 +1,131 @@
   -1     1 #[path = "../lib.rs"]
   -1     2 mod lib;
   -1     3 
   -1     4 fn parse_numbers(s: &str) -> Vec<usize> {
   -1     5     return s.split_whitespace().map(|s| s.parse().unwrap()).collect();
   -1     6 }
   -1     7 
   -1     8 fn range_intersect(
   -1     9     a: (usize, usize),
   -1    10     b: (usize, usize),
   -1    11 ) -> Option<((usize, usize), Vec<(usize, usize)>)> {
   -1    12     let a_start = a.0;
   -1    13     let a_end = a.0 + a.1;
   -1    14     let b_start = b.0;
   -1    15     let b_end = b.0 + b.1;
   -1    16 
   -1    17     if a_start >= b_end || b_start >= a_end {
   -1    18         return None;
   -1    19     } else {
   -1    20         let mut rest = vec![];
   -1    21 
   -1    22         let mut intersection_start = a_start;
   -1    23         if a_start < b_start {
   -1    24             rest.push((a_start, b_start - a_start));
   -1    25             intersection_start = b_start;
   -1    26         }
   -1    27 
   -1    28         let mut intersection_end = a_end;
   -1    29         if a_end > b_end {
   -1    30             rest.push((b_end, a_end - b_end));
   -1    31             intersection_end = b_end;
   -1    32         }
   -1    33 
   -1    34         let intersection = (intersection_start, intersection_end - intersection_start);
   -1    35 
   -1    36         return Some((intersection, rest));
   -1    37     }
   -1    38 }
   -1    39 
   -1    40 fn multirange_intersect(
   -1    41     ranges: &Vec<(usize, usize)>,
   -1    42     other: (usize, usize),
   -1    43 ) -> (Vec<(usize, usize)>, Vec<(usize, usize)>) {
   -1    44     let mut intersections = vec![];
   -1    45     let mut rest = vec![];
   -1    46 
   -1    47     for range in ranges.iter() {
   -1    48         match range_intersect(*range, other) {
   -1    49             Some((intersection, mut r)) => {
   -1    50                 intersections.push(intersection);
   -1    51                 rest.append(&mut r);
   -1    52             }
   -1    53             None => {
   -1    54                 rest.push(*range);
   -1    55             }
   -1    56         }
   -1    57     }
   -1    58 
   -1    59     return (intersections, rest);
   -1    60 }
   -1    61 
   -1    62 fn apply_map(
   -1    63     ranges: &Vec<(usize, usize)>,
   -1    64     map: &Vec<(usize, usize, usize)>,
   -1    65 ) -> Vec<(usize, usize)> {
   -1    66     let mut result = vec![];
   -1    67 
   -1    68     for i in 0..ranges.len() {
   -1    69         let mut multirange = vec![ranges[i]];
   -1    70 
   -1    71         for (dest_start, src_start, len) in map.iter() {
   -1    72             let (intersections, rest) = multirange_intersect(&multirange, (*src_start, *len));
   -1    73             for (intersection_start, intersection_len) in intersections.iter() {
   -1    74                 result.push((
   -1    75                     *intersection_start + dest_start - src_start,
   -1    76                     *intersection_len,
   -1    77                 ));
   -1    78             }
   -1    79             multirange = rest;
   -1    80         }
   -1    81 
   -1    82         result.append(&mut multirange);
   -1    83     }
   -1    84 
   -1    85     return result;
   -1    86 }
   -1    87 
   -1    88 fn main() {
   -1    89     let mut ranges1 = vec![];
   -1    90     let mut ranges2 = vec![];
   -1    91     let mut map = vec![];
   -1    92     let mut state = 0;
   -1    93 
   -1    94     for line in lib::iter_input() {
   -1    95         match state {
   -1    96             0 => {
   -1    97                 let (_, tail) = line.split_once(": ").unwrap();
   -1    98                 let numbers = parse_numbers(&tail);
   -1    99                 ranges1 = numbers.iter().map(|x| (*x, 1)).collect();
   -1   100                 ranges2 = (0..numbers.len())
   -1   101                     .step_by(2)
   -1   102                     .map(|i| (numbers[i], numbers[i + 1]))
   -1   103                     .collect();
   -1   104                 state = 1;
   -1   105             }
   -1   106             1 => {
   -1   107                 if line == "" {
   -1   108                     ranges1 = apply_map(&ranges1, &map);
   -1   109                     ranges2 = apply_map(&ranges2, &map);
   -1   110                     map = vec![];
   -1   111                     state = 2;
   -1   112                 } else {
   -1   113                     let n = parse_numbers(&line);
   -1   114                     map.push((n[0], n[1], n[2]));
   -1   115                 }
   -1   116             }
   -1   117             2 => {
   -1   118                 state = 1;
   -1   119             }
   -1   120             _ => unreachable!(),
   -1   121         }
   -1   122     }
   -1   123     ranges1 = apply_map(&ranges1, &map);
   -1   124     ranges2 = apply_map(&ranges2, &map);
   -1   125 
   -1   126     let min1 = ranges1.iter().map(|(start, _)| start).min().unwrap();
   -1   127     let min2 = ranges2.iter().map(|(start, _)| start).min().unwrap();
   -1   128 
   -1   129     println!("part1: {}", min1);
   -1   130     println!("part2: {}", min2);
   -1   131 }

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

@@ -0,0 +1,33 @@
   -1     1 seeds: 79 14 55 13
   -1     2 
   -1     3 seed-to-soil map:
   -1     4 50 98 2
   -1     5 52 50 48
   -1     6 
   -1     7 soil-to-fertilizer map:
   -1     8 0 15 37
   -1     9 37 52 2
   -1    10 39 0 15
   -1    11 
   -1    12 fertilizer-to-water map:
   -1    13 49 53 8
   -1    14 0 11 42
   -1    15 42 0 7
   -1    16 57 7 4
   -1    17 
   -1    18 water-to-light map:
   -1    19 88 18 7
   -1    20 18 25 70
   -1    21 
   -1    22 light-to-temperature map:
   -1    23 45 77 23
   -1    24 81 45 19
   -1    25 68 64 13
   -1    26 
   -1    27 temperature-to-humidity map:
   -1    28 0 69 1
   -1    29 1 0 69
   -1    30 
   -1    31 humidity-to-location map:
   -1    32 60 56 37
   -1    33 56 93 4