heh
d4p2
| -rw-r--r-- | .gitignore | 2 | ||||
| -rw-r--r-- | Cargo.toml | 13 | ||||
| -rw-r--r-- | src/inp.txt | 249 | ||||
| -rw-r--r-- | src/main.rs | 107 |
4 files changed, 371 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..96ef6c0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/target +Cargo.lock diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..9760321 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "aoc" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +itertools = "0.12.0" +rayon = "1.8.0" +[profile.release] +lto = true +codegen-units = 1 diff --git a/src/inp.txt b/src/inp.txt new file mode 100644 index 0000000..d612f11 --- /dev/null +++ b/src/inp.txt @@ -0,0 +1,249 @@ +seeds: 763445965 78570222 1693788857 146680070 1157620425 535920936 3187993807 180072493 1047354752 20193861 2130924847 274042257 20816377 596708258 950268560 11451287 3503767450 182465951 3760349291 265669041 + +seed-to-soil map: +0 1894195346 315486903 +1184603419 2977305241 40929361 +1225532780 597717 4698739 +1988113706 1603988885 78481073 +679195301 529385087 505408118 +1781158512 2285166785 39457705 +352613463 2324624490 326581838 +1820616217 1738931330 104130014 +2066594779 2671974456 78036460 +1288754536 1682469958 56461372 +1371340411 3442489267 409818101 +3341036988 1092718505 511270380 +315486903 1857068786 37126560 +1924746231 2209682249 49360033 +1345215908 2259042282 26124503 +2917167497 2651206328 20768128 +1230231519 1034793205 57925300 +2144631239 3421335965 21153302 +2689873172 2750010916 227294325 +1974106264 1843061344 14007442 +2165784541 5296456 524088631 +1288156819 0 597717 +2937935625 3018234602 403101363 + +soil-to-fertilizer map: +3849355959 3101885274 170573538 +3006688391 3025445580 66663107 +1656285214 0 92188755 +2361256790 4033128077 180329908 +2073349245 3676064680 287907545 +3458323699 4213457985 81509311 +2607585697 2380345050 99923790 +2541586698 3332501375 61727497 +3789313396 3272458812 60042563 +1858319884 917612384 162600389 +404885474 510011966 407600418 +4019929497 3603127472 72937208 +812485892 1190058688 253881561 +2603314195 2073349245 4271502 +1469824760 92188755 186460454 +0 278649209 231362757 +1249323571 1443940249 220501189 +4285190709 3092108687 9776587 +1066367453 1817839802 182956118 +3257369783 2724171240 184379320 +2707509487 2480268840 111317034 +2818826521 2192483180 187861870 +1748473969 1080212773 109845915 +3441749103 3394228872 16574596 +3142507350 2077620747 114862433 +3539833010 2908550560 116895020 +231362757 1664441438 153398364 +384761121 2000795920 20124353 +3656728030 2591585874 132585366 +3073351498 3963972225 69155852 +4092866705 3410803468 192324004 + +fertilizer-to-water map: +2289944373 962149121 35670423 +3187295333 3295892606 34862460 +3798694276 3187295333 48036047 +3633796172 3644673845 164898104 +3222157793 3909959418 311250910 +922447685 2248438960 142418952 +648510907 2390857912 2187794 +3533408703 3809571949 100387469 +650698701 1840321280 271748984 +464371310 553340958 30176545 +3907291549 3330755066 313918779 +2791296727 461310335 25110510 +397451197 486420845 66920113 +3846730323 3235331380 60561226 +2575399801 2393045706 96151163 +1064866637 583517503 106955439 +1308190772 822897256 139251865 +0 236670371 224639964 +2671550964 0 119745763 +1171822076 2112070264 136368696 +224639964 690472942 132424314 +494547855 2489196869 153963052 +2498862112 160132682 76537689 +1447442637 997819544 842501736 +357064278 119745763 40386919 +2325614796 2643159921 173247316 + +water-to-light map: +3181220930 3836164803 159006567 +1405924027 2473049234 39930303 +1275636734 1411161599 10830099 +3831476263 1580605379 266491658 +1570444205 1294782382 116379217 +3133505036 2271845049 47715894 +1305612481 2512979537 100311546 +1286466833 1275636734 19145648 +167024508 145118817 64336111 +92584517 615923894 40913901 +2227655152 2098041405 130620812 +2181794752 2613291083 34326669 +433451288 209454928 64553504 +4223684323 2228662217 43182832 +3527642272 3532330812 303833991 +2855274869 2647617752 119788915 +4266867155 2319560943 28100141 +231360619 1167459710 18705935 +2136463524 3995171370 45331228 +2978600831 1421991698 154904205 +4097967921 2825698355 78160170 +0 489813287 92584517 +1686823422 3023927616 328136942 +2014960364 2903858525 116532044 +1512152517 2767406667 58291688 +395185371 1129193793 38265917 +498004792 274008432 215804855 +2975063784 3020390569 3537047 +3340227497 3352064558 180266254 +3524203227 4040502598 3439045 +713809647 656837795 472355998 +1445854330 2395217316 66298187 +3520493751 1576895903 3709476 +4176128091 2347661084 47556232 +2216121421 2461515503 11533731 +2604330501 1847097037 250944368 +2358275964 4043941643 246054537 +133498418 582397804 33526090 +2131492408 4289996180 4971116 +250066554 0 145118817 + +light-to-temperature map: +1212130960 1395832798 58636484 +542019293 812004214 195851408 +1706861165 2688952641 3198757 +3097592274 3018951608 116723898 +1148165381 3135675506 2936711 +938881022 300892136 26815610 +2884354982 3318488806 103553821 +789335095 421331130 149545927 +3270968199 1036156523 69989778 +1142047574 1030038716 6117807 +1710059922 1367448764 28384034 +3961474833 1257923390 109525374 +300892136 570877057 241127157 +2564647329 3422042627 200129932 +3534803741 2001828127 16273450 +1738443956 1454469282 486329977 +3717055162 2018101577 244419671 +4071000207 2781125469 223967089 +1030038716 3005092558 13859050 +737870701 358179343 20992797 +3388483069 4209077325 84901810 +3551077191 3622172559 62988195 +3614065386 2769635501 11489968 +3215304333 3262824940 55663866 +2278270544 2395185346 286376785 +1151102092 1940799259 61028868 +3625555354 4044566844 91499808 +2987908803 1106146301 109683471 +1134657064 2681562131 7390510 +2236365744 2353280546 41904800 +1270767444 3685160754 311880998 +1043897766 2262521248 90759298 +2806870879 2692151398 77484103 +3340957977 3997041752 47525092 +3214316172 4293979135 988161 +2764777261 1215829772 42093618 +965696632 379172140 42158990 +3473384879 4147658463 61418862 +2224773933 4136066652 11591811 +1582648442 3201806221 61018719 +758863498 327707746 30471597 +1643667161 3138612217 63194004 + +temperature-to-humidity map: +3893671309 2897869925 193525827 +1232495182 999263760 191357681 +2440090529 1477966061 163000786 +3554817869 2745268041 3258240 +2845194314 3091395752 30017739 +4087197136 1397536284 33207741 +131252236 827398049 11627380 +2183328852 2476037434 27127608 +2603091315 2503165042 242102999 +2875212053 1778930312 348370034 +1427151141 891672290 77843721 +1642958327 3928570372 200739395 +3610489285 3219006125 283182024 +3277129360 3580618829 128344865 +2233175686 1190621441 206914843 +891672290 4129309767 165657529 +0 205218291 35419402 +3584280491 3551111757 26208794 +4247745260 1430744025 47222036 +2210456460 3502188149 21171921 +1843697722 2136406304 209010485 +1423852863 3577320551 3298278 +348097907 336470527 490927522 +1057329819 3708963694 175165363 +2231628381 3549564452 1547305 +3268023402 2127300346 9105958 +142879616 0 205218291 +3558076109 3523360070 26204382 +2052708207 2345416789 130620645 +4120404877 969516011 29747749 +35419402 240637693 95832834 +4150152626 3121413491 97592634 +3223582087 3884129057 44441315 +1504994862 1640966847 137963465 +3405474225 2748526281 149343644 + +humidity-to-location map: +3554305993 3441523152 94289982 +4052786034 3015714705 242181262 +491965155 895492593 72049890 +2437667299 3726944956 38441480 +0 387558480 141314689 +3811971022 3765386436 101972362 +3648595975 3535813134 51583790 +1318420824 1500487572 135197760 +230758172 30039204 163596268 +3097413876 4221249785 73717511 +3041068351 3257895967 56345525 +1454254795 641271247 181430537 +394354440 1139828795 97610715 +3215016925 2618366793 339289068 +827848339 193635472 113349295 +150184459 306984767 80573713 +1778801395 2099048921 519317872 +1176891800 1379491771 111489820 +1288381620 0 30039204 +3171131387 3891749067 43885538 +564015045 528873169 112398078 +3913943384 3935634605 11560990 +2767014161 3947195595 274054190 +941197634 822701784 72790809 +1453618584 1499851361 636211 +2298119267 3587396924 139548032 +3700179765 3867358798 24390269 +3742730647 1778801395 11181531 +1013988443 967542483 20851096 +141314689 1490981591 8869770 +3925504374 3314241492 127281660 +2476108779 2088802749 10246172 +676413123 988393579 151435216 +3753912178 2957655861 58058844 +2486354951 1789982926 280659210 +3724570034 2070642136 18160613 +1034839539 1237439510 142052261 diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..52d3b33 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,107 @@ +#![feature(array_windows, test, slice_as_chunks, array_chunks)] +extern crate test; +pub mod prelude { + pub use itertools::izip; + pub use itertools::Itertools; + pub use std::{ + collections::{HashMap, HashSet, VecDeque}, + fmt::{Debug, Display}, + hint::black_box as boxd, + iter, + ops::Range, + }; +} +pub use prelude::*; +use rayon::iter::{ParallelBridge, ParallelIterator}; + +const S: char = ' '; + +fn solve(i: &str) -> impl Display { + let mut lines = i.lines(); + let seeds: Box<[u64]> = lines + .next() + .unwrap() + .split_once(':') + .unwrap() + .1 + .split_ascii_whitespace() + .map(|x| x.parse::<u64>().unwrap()) + .collect(); + lines.next().unwrap(); + macro_rules! section { + ($of:ident) => { + let mut $of = Vec::with_capacity(10); + for line in lines.by_ref().skip(1) { + if line == "" { + println!("finished section {}", stringify!($of)); + break; + } + $of.push( + line.split_ascii_whitespace() + .map(|x| x.parse::<u64>().unwrap()) + .collect_tuple() + .map(|(s, d, r)| (s..s + r, d..d + r)) + .unwrap(), + ); + } + }; + } + section!(seed2soil); + section!(soil2fertilizer); + section!(fertilizer2water); + section!(water2light); + section!(light2temperature); + section!(temperature2humidity); + section!(humidity2location); + fn index(v: &[(Range<u64>, Range<u64>)], get: u64) -> u64 { + for (a, b) in v.iter().cloned() { + for (a, b) in izip!(a, b) { + if b == get { + return a; + } + } + } + get + } + seeds + .array_chunks::<2>() + .par_bridge() + .flat_map(|&[s, r]| s..s + r) + .map(|seed| { + // print!("seed {seed} "); + let soil = index(&seed2soil, seed); + // print!("soil {soil} "); + let fertilizer = index(&soil2fertilizer, soil); + // print!("fertilizer {fertilizer} "); + let water = index(&fertilizer2water, fertilizer); + // print!("water {water} "); + let light = index(&water2light, water); + // print!("light {light} "); + let temperature = index(&light2temperature, light); + // print!("temp {temperature} "); + let humidity = index(&temperature2humidity, temperature); + // print!("humidity {humidity} "); + let location = index(&humidity2location, humidity); + // println!("location {location}"); + location + }) + .min() + .unwrap() + + // lines + // .map(|x| { + // // + // }) + // .sum::<u64>() +} + +fn main() { + let i = include_str!("inp.txt").trim(); + println!("{}", solve(i)); +} + +#[bench] +fn bench(b: &mut test::Bencher) { + let i = boxd(include_str!("inp.txt").trim()); + b.iter(|| solve(i)); +} |