- 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