From 04d9bfd5c8f18fd36f48c29b9f496589e7b75490 Mon Sep 17 00:00:00 2001 From: structix Date: Thu, 7 Dec 2023 15:11:53 +0100 Subject: [PATCH] Add day 5, 6, 7 --- 2023/day5/day5/.gitignore | 1 + 2023/day5/day5/Cargo.lock | 7 + 2023/day5/day5/Cargo.toml | 8 + 2023/day5/day5/input.txt | 249 +++++++++ 2023/day5/day5/script.py | 110 ++++ 2023/day5/day5/src/main.rs | 3 + 2023/day6/day6/.gitignore | 1 + 2023/day6/day6/Cargo.lock | 54 ++ 2023/day6/day6/Cargo.toml | 9 + 2023/day6/day6/input.txt | 3 + 2023/day6/day6/src/main.rs | 43 ++ 2023/day7/day7/.gitignore | 1 + 2023/day7/day7/Cargo.lock | 7 + 2023/day7/day7/Cargo.toml | 8 + 2023/day7/day7/input.txt | 1001 ++++++++++++++++++++++++++++++++++++ 2023/day7/day7/src/main.rs | 148 ++++++ 16 files changed, 1653 insertions(+) create mode 100644 2023/day5/day5/.gitignore create mode 100644 2023/day5/day5/Cargo.lock create mode 100644 2023/day5/day5/Cargo.toml create mode 100644 2023/day5/day5/input.txt create mode 100644 2023/day5/day5/script.py create mode 100644 2023/day5/day5/src/main.rs create mode 100644 2023/day6/day6/.gitignore create mode 100644 2023/day6/day6/Cargo.lock create mode 100644 2023/day6/day6/Cargo.toml create mode 100644 2023/day6/day6/input.txt create mode 100644 2023/day6/day6/src/main.rs create mode 100644 2023/day7/day7/.gitignore create mode 100644 2023/day7/day7/Cargo.lock create mode 100644 2023/day7/day7/Cargo.toml create mode 100644 2023/day7/day7/input.txt create mode 100644 2023/day7/day7/src/main.rs diff --git a/2023/day5/day5/.gitignore b/2023/day5/day5/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/2023/day5/day5/.gitignore @@ -0,0 +1 @@ +/target diff --git a/2023/day5/day5/Cargo.lock b/2023/day5/day5/Cargo.lock new file mode 100644 index 0000000..7a62bb0 --- /dev/null +++ b/2023/day5/day5/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "day5" +version = "0.1.0" diff --git a/2023/day5/day5/Cargo.toml b/2023/day5/day5/Cargo.toml new file mode 100644 index 0000000..f9b62bf --- /dev/null +++ b/2023/day5/day5/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "day5" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/2023/day5/day5/input.txt b/2023/day5/day5/input.txt new file mode 100644 index 0000000..d612f11 --- /dev/null +++ b/2023/day5/day5/input.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/2023/day5/day5/script.py b/2023/day5/day5/script.py new file mode 100644 index 0000000..68ea98f --- /dev/null +++ b/2023/day5/day5/script.py @@ -0,0 +1,110 @@ +from collections import defaultdict +from multiprocessing import Pool +from dataclasses import dataclass + +def parse_file(data): + d = defaultdict(dict) + targets = [] + + for section in data.split("\n\n")[1:]: + lines = section.split("\n") + + parts = lines[0].split("-") + source = parts[0] + target = parts[2].split(" ")[0] + + d[source][target] = [] + targets.append(target) + + for line in lines[1:]: + target_start, src_start, length = map(int, line.split(" ")) + d[source][target].append((target_start, src_start, length)) + return (d, targets) + +def split_seeds(data): + seeds = list(map(int, data.split("\n")[0].split(": ")[1].split(" "))) + return seeds + +def find_minimum(data_dict, targets, data): + seeds = split_seeds(data) + min_location = 9000000000 # Integer max size + for seed in seeds: + current = "seed" + value = seed + + for trgt in targets: + for trg_start, src_start, length in data_dict[current][trgt]: + if src_start <= value and value < src_start + length: + value = trg_start + value - src_start + break + + current = trgt + + min_location = min(min_location, value) + return min_location + +def part2(data): + global seed_ranges + global maps + + plain_seeds = split_seeds(data) + seed_ranges = [] + for i in range(0, len(plain_seeds), 2): + seed_ranges.append(RangePart2(plain_seeds[i], plain_seeds[i + 1])) + + maps = [] + + for section in data.split("\n\n")[1:]: + lines = section.split("\n") + + m = [] + for line in lines[1:]: + trg_start, src_start, length = map(int, line.split(" ")) + m.append((RangePart2(trg_start, length), src_start)) + + maps.append(m) + + maps = maps[::-1] + + with Pool(23) as pool: + for location in pool.imap(check_part2, range(int(1e9)), int(1e6)): + if location is not None: + print(location) + return + + +@dataclass +class RangePart2: + start: int + length: int + + def contains(self, value): + return self.start <= value and value < self.start + self.length + + +def check_part2(location): + global seed_ranges + global maps + + value = location + for m in maps: + for trg_range, src_start in m: + if trg_range.contains(value): + value = src_start + (value - trg_range.start) + break + + for sr in seed_ranges: + if sr.contains(value): + return location + + return None + + + +f = open("input.txt", "r") +data = f.read().strip() + +data_dict, targets = parse_file(data) +print("Part 1:", find_minimum(data_dict, targets, data)) +print("Part 2:") +part2(data) diff --git a/2023/day5/day5/src/main.rs b/2023/day5/day5/src/main.rs new file mode 100644 index 0000000..e7a11a9 --- /dev/null +++ b/2023/day5/day5/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +} diff --git a/2023/day6/day6/.gitignore b/2023/day6/day6/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/2023/day6/day6/.gitignore @@ -0,0 +1 @@ +/target diff --git a/2023/day6/day6/Cargo.lock b/2023/day6/day6/Cargo.lock new file mode 100644 index 0000000..2fcee10 --- /dev/null +++ b/2023/day6/day6/Cargo.lock @@ -0,0 +1,54 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "aho-corasick" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +dependencies = [ + "memchr", +] + +[[package]] +name = "day6" +version = "0.1.0" +dependencies = [ + "regex", +] + +[[package]] +name = "memchr" +version = "2.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" + +[[package]] +name = "regex" +version = "1.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" diff --git a/2023/day6/day6/Cargo.toml b/2023/day6/day6/Cargo.toml new file mode 100644 index 0000000..b0c7957 --- /dev/null +++ b/2023/day6/day6/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "day6" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +regex = "1.10.2" diff --git a/2023/day6/day6/input.txt b/2023/day6/day6/input.txt new file mode 100644 index 0000000..24b413f --- /dev/null +++ b/2023/day6/day6/input.txt @@ -0,0 +1,3 @@ +Time: 63 78 94 68 +Distance: 411 1274 2047 1035 + diff --git a/2023/day6/day6/src/main.rs b/2023/day6/day6/src/main.rs new file mode 100644 index 0000000..5bb2302 --- /dev/null +++ b/2023/day6/day6/src/main.rs @@ -0,0 +1,43 @@ +use std::{ + fs::File, + io::{BufRead, BufReader}, +}; + +fn main() { + // Open the file + let file = File::open("input.txt").expect("Failed to open file"); + let reader = BufReader::new(file); + + let mut lines = reader.lines().map(|l| l.unwrap()); + + let line1 = lines.next().unwrap(); + let line2 = lines.next().unwrap(); + + let times: Vec = line1.split(' ').filter_map(|s| s.parse().ok()).collect(); + + let distances: Vec = line2.split(' ').filter_map(|s| s.parse().ok()).collect(); + + println!("Part 1: {}", calc(times, distances)); + + println!("Part 2: {}", calc(vec![63789468], vec![411127420471035])); +} + +fn calc(times: Vec, distances: Vec) -> i32 { + let mut out = 1; + + for (&t, &d) in times.iter().zip(distances.iter()) { + let mut count = 0; + + for speed in 1..t { + let total = (t - speed) * speed; + + if total > d { + count += 1; + } + } + + out *= count; + } + + out +} diff --git a/2023/day7/day7/.gitignore b/2023/day7/day7/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/2023/day7/day7/.gitignore @@ -0,0 +1 @@ +/target diff --git a/2023/day7/day7/Cargo.lock b/2023/day7/day7/Cargo.lock new file mode 100644 index 0000000..7af9b93 --- /dev/null +++ b/2023/day7/day7/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "day7" +version = "0.1.0" diff --git a/2023/day7/day7/Cargo.toml b/2023/day7/day7/Cargo.toml new file mode 100644 index 0000000..b170ccb --- /dev/null +++ b/2023/day7/day7/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "day7" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/2023/day7/day7/input.txt b/2023/day7/day7/input.txt new file mode 100644 index 0000000..bfd335f --- /dev/null +++ b/2023/day7/day7/input.txt @@ -0,0 +1,1001 @@ +467K3 95 +JK5QK 838 +44664 725 +8QAK3 134 +53A3A 945 +7QQJ7 164 +J8J89 236 +38QAT 166 +Q7944 755 +35333 526 +5J787 482 +4K769 829 +37773 960 +QJ78K 282 +3J39Q 326 +TJ2QQ 255 +J4338 337 +QK3KK 187 +5K8KQ 380 +93785 500 +795JT 382 +Q399Q 391 +99J99 206 +T5555 716 +Q7Q8Q 990 +QQJJQ 346 +34344 332 +K4J44 763 +2A36T 974 +77757 461 +55446 907 +99JJ9 962 +K29KQ 177 +99666 961 +688KK 249 +5A558 767 +TT6K2 630 +5Q4A4 872 +JTKQ4 969 +A5AAA 421 +JAA4Q 680 +55K69 29 +96ATJ 144 +3Q462 523 +73646 203 +5A96A 550 +K84TQ 4 +7278T 406 +KQQT5 395 +54567 197 +T53TA 355 +AQA99 601 +88KQQ 968 +55J5J 727 +73TJ9 466 +99799 843 +324QQ 36 +84AAA 190 +7J366 511 +JK938 667 +KKQJQ 762 +722J4 110 +9TKT9 84 +33JJ3 458 +6K444 498 +4279T 23 +K5T28 467 +3KKKK 871 +KQAQK 492 +44AKK 865 +5638T 932 +A89AK 24 +29K92 403 +A69K6 596 +KKK84 400 +QA748 616 +55AAA 504 +9255Q 684 +56646 330 +6J6J7 222 +A59J5 370 +3AA4J 940 +K9K38 302 +2AK58 735 +68K4K 422 +95599 324 +8K88J 987 +845Q5 478 +72KQ7 263 +8TJ83 751 +96TTQ 935 +AQ6AQ 445 +QKQQA 321 +A5644 769 +QQ5QJ 801 +AA574 436 +333QQ 605 +J5982 71 +QT8A5 956 +2Q46A 982 +J3773 317 +3KK93 485 +3A76A 926 +338JJ 502 +8KAQ6 737 +KKK28 520 +644Q5 850 +2T6TT 397 +34JA7 549 +743J7 747 +34843 103 +6KKKK 204 +Q2J22 548 +JKKKK 995 +42446 704 +8732A 238 +TT9J2 109 +4758T 33 +TTTT7 914 +787J7 647 +59T59 62 +9Q989 985 +T886J 554 +543QJ 75 +77637 857 +8888T 83 +92T52 939 +9832A 620 +3TT39 81 +84353 18 +A8Q8A 824 +T4597 425 +K3635 949 +KAAA2 320 +42224 243 +AA8A3 565 +KK63K 114 +TT3TT 133 +33T77 141 +J868J 774 +422QT 369 +24T2K 344 +KK3Q3 8 +424J2 967 +8J6J6 666 +K6927 887 +36666 366 +78KT8 867 +AT66T 761 +72AT6 155 +2Q6QQ 440 +64J64 594 +A2JT8 578 +QQAJQ 383 +8Q333 963 +9A22A 503 +K86K6 55 +66899 899 +4744J 210 +72K54 860 +KQKK4 723 +6TK62 607 +9J955 652 +A45A5 766 +4J333 744 +5K555 277 +7777J 657 +7853A 147 +75QQQ 356 +T6T93 818 +8T342 643 +498A7 232 +96A2A 471 +J55KK 583 +KJ7Q6 849 +36A36 707 +23655 290 +K444K 371 +5858K 688 +KJK8J 258 +Q3699 910 +79T64 864 +KAQ44 536 +T4TJ5 239 +8KK88 589 +42AA4 127 +QQ4Q4 746 +J9868 472 +95493 170 +JK6T5 428 +KAATA 775 +TK3KT 886 +36633 858 +67767 590 +86A2Q 175 +J7J7J 659 +7J457 796 +55335 65 +9288A 664 +88899 499 +7TKTA 327 +6QJ36 701 +K7KQK 943 +QQAQ2 681 +Q9948 444 +85923 335 +82832 283 +TQ5QT 92 +TK8A3 191 +A957K 614 +8877T 623 +5JTT9 253 +2K626 248 +757Q7 817 +JJ6T5 827 +KJ796 367 +895AQ 608 +AA666 950 +TT4T2 135 +QQQKK 600 +A9KK9 925 +49AA7 972 +73TAT 60 +5K49Q 74 +AAJ6A 753 +42222 470 +J99KK 722 +A9AA9 514 +36636 581 +7T5Q9 690 +TTK7K 496 +277J4 665 +782TQ 662 +3AK57 734 +29KJ7 343 +72726 378 +67656 541 +22A29 229 +JJ5AA 336 +QTTJQ 979 +J73K6 473 +55AK9 19 +46466 610 +8AAK4 408 +27227 181 +55525 214 +444Q4 505 +65K55 506 +KJ84T 529 +82225 250 +59TKA 32 +83J53 178 +599K4 988 +55TTT 759 +59999 431 +T44A4 828 +A888T 874 +J3533 619 +9979K 981 +KK998 101 +64965 799 +9A999 934 +9A299 942 +5KKKA 862 +4A865 802 +64QQ4 837 +ATATA 98 +6TJQ7 807 +K6997 585 +57T5T 457 +JT66T 938 +JJQK9 105 +JJ278 804 +JJ5AQ 661 +Q2597 930 +AAQAQ 31 +5A974 427 +TTQQK 868 +7KT7T 730 +K4999 112 +A8KAQ 672 +6AQQ6 447 +32J32 297 +4QA2J 915 +T2Q3Q 712 +34KQT 121 +98379 617 +487QK 44 +55TAJ 909 +6686T 28 +22922 805 +T846A 556 +J5A6A 399 +55Q55 347 +8488J 593 +JKKTT 708 +8288J 768 +JKK66 1 +22999 586 +85398 334 +77KK6 782 +K34JJ 674 +39K4K 653 +QA6K3 720 +78878 715 +QA9Q4 745 +3333J 226 +3TT32 686 +44999 401 +A2J32 531 +Q65A9 905 +J6AA7 194 +8J888 163 +7JT74 624 +JKKAK 568 +239J2 919 +AA4AA 52 +222JJ 184 +546AQ 894 +K2KK9 631 +45TQ2 375 +TTTT2 146 +26Q77 989 +9866K 851 +T3332 292 +66469 758 +48J48 889 +4A4QA 185 +J6626 68 +46T4A 660 +83T52 151 +7T7T7 407 +73758 479 +63A44 291 +66QT6 875 +6645J 738 +94Q97 638 +T5KT5 411 +TJ3J3 866 +QT6TQ 842 +A448A 433 +556JJ 533 +T3TKT 161 +6JT43 265 +T5TTT 393 +K7KK4 386 +53J6A 845 +K7777 756 +63399 685 +J85AQ 87 +88585 906 +QJTQQ 270 +TKKTK 131 +3J3JQ 797 +K7Q34 836 +K4499 362 +53555 651 +9888T 435 +2J299 557 +8J999 964 +96TQ2 293 +8KTJ8 137 +KA6Q7 442 +2J6KQ 900 +446A4 294 +AJAA3 671 +Q427T 116 +9JQ99 398 +59929 392 +822J8 192 +Q92Q7 420 +KKJK6 171 +TAJ37 487 +8A2J5 10 +22TTT 220 +33623 111 +7Q7AJ 491 +A3JJ2 650 +J4J23 299 +396KA 896 +K3K3J 486 +QKKKK 20 +9A2AJ 713 +746K4 56 +96996 885 +JTK77 312 +Q8888 826 +3T4AJ 771 +97977 219 +9354K 788 +5Q5KK 455 +T3734 325 +TK26A 156 +7AAAA 924 +KJ622 183 +5QTAQ 642 +AAAAQ 488 +TTTJT 953 +Q2222 145 +4A9TJ 245 +TT3JK 588 +J5555 284 +94AQT 193 +97325 196 +74A8J 37 +24AAA 847 +22A32 381 +4KJ59 542 +T6QK4 673 +77877 922 +Q2Q66 49 +66688 792 +9T9T9 918 +J8878 552 +6A63A 221 +AA559 780 +9T47Q 300 +AKKA4 501 +33QQ4 64 +6K375 965 +T7Q43 82 +3689Q 569 +A6A3A 462 +T5Q3J 689 +49Q99 895 +KA262 490 +87497 13 +4449A 973 +92453 430 +5QA5A 149 +69666 247 +K6AJA 992 +A4444 729 +44494 298 +J5993 927 +26662 555 +4J6A5 613 +KK77K 855 +73222 315 +2A2J2 719 +K7KT7 43 +98T64 998 +23282 528 +449T7 130 +6QK24 424 +AAAA3 179 +JA42K 53 +6A6KK 211 +J55JJ 742 +J5T93 304 +TQA23 358 +8J257 240 +39393 522 +68A38 450 +QQAK8 970 +J77QT 341 +T68AA 242 +99933 310 +425KA 69 +99A9J 535 +J35JK 113 +4A37T 360 +63333 791 +78J5T 34 +46T46 883 +T8JQ3 50 +KKKK5 519 +T29J8 640 +KKK88 646 +3A32A 228 +7A77T 57 +2QQ2J 971 +7Q777 438 +5J545 21 +T4AAJ 432 +QQJAA 570 +KJ79J 853 +T3JKA 359 +676K6 724 +4TATT 931 +JKKT2 629 +J338T 469 +9939J 743 +85A93 241 +945TA 363 +5JK5A 493 +Q5JT5 815 +76378 12 +T3T53 157 +JAA24 732 +55757 200 +K727J 115 +259KK 510 +2J739 786 +288AA 598 +QJ233 100 +QQ56Q 25 +6333J 702 +86797 839 +47T77 361 +K4823 3 +6K446 54 +94J75 543 +QQQQA 980 +55J66 923 +AQT55 645 +55593 314 +J6776 379 +J23T6 102 +7K7K7 911 +JQ5A3 227 +KK66K 279 +AJJAQ 396 +JA252 39 +555KK 714 +KJ56K 637 +KJ64K 928 +6Q66Q 85 +TJTT2 273 +K634J 854 +66662 576 +6Q6J6 212 +KAAT2 696 +76663 793 +T3AQ3 632 +2J994 966 +TTTJA 63 +4QJQ4 165 +AAAJ8 331 +TT666 158 +2KKA2 453 +54444 563 +7KK88 675 +47777 832 +6JJQ9 475 +55275 876 +63489 794 +7K7Q3 208 +6J585 820 +3Q89T 524 +92AK2 6 +66JK9 655 +7J4KQ 139 +666A5 711 +4JTK9 117 +88AJA 368 +34T5T 602 +9933J 278 +97Q63 448 +A5555 892 +QJ7A2 726 +5KKJ2 917 +A5238 108 +33343 663 +K33T3 285 +6Q655 937 +38383 880 +47834 252 +QJA49 692 +A6926 547 +48Q8Q 288 +72J86 107 +5T5T9 449 +2JK25 305 +667T6 136 +7JJ88 429 +Q5KQK 394 +ATAAA 952 +66949 296 +TT222 933 +AQ4AK 948 +KQJJ7 209 +3465K 709 +74775 126 +8TJ6T 402 +82Q3J 816 +Q7855 354 +JJ3KK 9 +22223 351 +2K7TA 831 +555AA 984 +83539 168 +444T4 140 +4A8Q4 693 +JA8AK 890 +29QTQ 308 +KJKKJ 389 +A86AK 649 +J898T 14 +A6AAA 352 +2J222 176 +A4669 958 +333K8 635 +T4269 844 +J4Q54 603 +44AAA 349 +QT575 413 +AA2J2 859 +7T395 648 +K3Q68 251 +7T2T2 790 +QQQ33 446 +428A4 879 +36J2Q 434 +69955 991 +7J5A4 812 +QQ445 789 +7A69A 93 +4K979 537 +K6K73 518 +45555 79 +45A6A 833 +KAAA5 307 +48887 80 +KK2KK 38 +ATJJ5 11 +5K325 388 +42TJA 353 +66J3T 611 +A758A 728 +TJT77 644 +5JQQ2 898 +9KQT2 404 +K42A2 303 +Q6QTA 124 +58Q5J 670 +K6JTJ 409 +T3333 731 +J73JK 463 +4A288 452 +79AAJ 41 +2K7T7 15 +7AAA7 888 +44J94 286 +8938K 328 +TKKKA 633 +22JT7 577 +QQQQ7 683 +66665 89 +T72J4 955 +J66J6 877 +99433 509 +9K92J 776 +JQ7Q2 78 +A6T2Q 122 +69Q6A 153 +J5JQ5 218 +25KAJ 416 +7A47A 513 +62T26 1000 +96449 281 +KKTKK 977 +35642 921 +9K4K9 778 +J4244 993 +JJAAA 573 +7AA27 626 +A685T 376 +4JA9A 957 +T886T 267 +737J7 538 +999KK 579 +75KK7 76 +Q737Q 809 +Q3393 901 +2734Q 754 +J2T9K 216 +89859 695 +63343 35 +7JK7K 700 +8828A 765 +29AT5 615 +Q838Q 410 +A3235 622 +TKJKQ 810 +45454 224 +77737 869 +JA9T9 333 +2772K 276 +5535A 350 +TT5QT 821 +46JKJ 986 +9T8KK 125 +6JAJ7 595 +74647 464 +499A4 612 +4KT7A 22 +J3233 891 +44555 959 +8KQ8A 271 +33443 182 +37373 27 +88828 997 +Q2Q22 189 +3635A 373 +T66TT 717 +A4469 207 +2T2KT 749 +4244Q 90 +9234T 348 +33TJ3 289 +QAA63 562 +2A2A2 199 +J6JK7 929 +TT99J 234 +T3JQ2 798 +65Q66 154 +JTTJT 975 +22699 705 +Q6Q6Q 618 +99929 811 +389J6 920 +585Q5 852 +A2255 477 +TJTJJ 30 +K5AK5 772 +2QQ3Q 323 +6888J 454 +7J8K3 609 +J463J 572 +32323 223 +686J6 534 +Q25J4 47 +29996 882 +TTQ8Q 944 +42265 480 +2JQ96 287 +QQ868 517 +AK447 994 +8J3Q3 897 +42QK5 489 +A8A88 384 +3AT3A 941 +44T8T 88 +QQ8QQ 787 +488TJ 996 +6KK66 313 +2J262 764 +K6KK5 275 +K572T 893 +7T7QQ 215 +76965 773 +59575 800 +586QJ 309 +QQQQ4 721 +9A9A4 40 +8JJJJ 128 +QATA6 162 +K6TAQ 415 +95JJ8 72 +9TQ97 319 +2AK22 61 +T2TJ2 465 +T5274 195 +Q4587 266 +J97QT 441 +52384 17 +Q7J77 414 +QQQ6Q 903 +4444J 532 +QQKQQ 904 +QJ467 16 +25525 785 +ATA8A 205 +65542 261 +9QKKK 512 +48844 231 +JTJAK 99 +QJ8AT 571 +68A88 878 +5353J 94 +2Q33Q 311 +KJJ69 946 +J83A8 634 +QQT6Q 884 +KK74J 374 +77474 781 +38888 527 +29457 329 +52452 73 +2K776 256 +QJQQQ 268 +J24K6 913 +42K88 861 +29QQQ 733 +4J546 806 +K2K98 841 +Q4644 697 +44K94 834 +QAAQT 830 +J666T 750 +3T335 437 +9594T 694 +8QQQ3 682 +88887 269 +J3KKQ 641 +99993 551 +2K437 699 +75775 710 +5963J 870 +TTKT5 582 +2Q82A 439 +KJ4Q9 301 +Q3558 152 +32333 999 +T77TT 599 +3T6JT 627 +2J3T5 560 +25442 86 +8888K 257 +5QJ45 96 +QQ7AA 658 +88JJ8 863 +98948 202 +2QJ3J 803 +J6488 66 +59559 160 +JJKK7 484 +7J223 254 +68889 364 +555J9 822 +KKAAA 525 +K7557 5 +3Q33A 814 +2384J 587 +KK8Q2 777 +494K2 426 +2TJ22 507 +QQQ2Q 698 +7229T 954 +JJ757 142 +2882A 530 +KKTQT 539 +72222 621 +99A5A 736 +22887 936 +3377Q 779 +6A6J6 740 +A7AAJ 840 +44JJ4 2 +QQTQT 51 +6666A 669 +T9279 908 +K9J7Q 856 +2AAAJ 748 +J3K25 947 +TT65T 377 +KK2K6 752 +K7KKK 150 +9J6J8 120 +72AK6 656 +TT6TT 757 +QQ9TT 412 +3AA3J 365 +84477 783 +KK4K2 591 +AK79J 654 +J77J7 951 +Q7664 606 +7QQ59 59 +J2725 795 +96989 417 +7TT64 387 +47JJK 91 +228AA 201 +AJJ63 902 +A5AKJ 123 +37Q33 741 +8J358 483 +Q88QQ 508 +43A33 340 +Q9QQQ 516 +232JT 148 +666J6 159 +38363 97 +42285 322 +4Q944 233 +TT4TT 342 +K8TQA 566 +KJKK2 213 +QJQJJ 339 +5K932 559 +86888 494 +2QQJQ 70 +7A772 167 +5659T 881 +T43A6 186 +A2Q22 739 +55K95 679 +2T5QQ 262 +47797 419 +52522 357 +2J734 597 +AA3Q3 678 +3Q9A3 567 +KJAAJ 813 +K8794 495 +7JT77 198 +4KT2A 564 +55QQ5 497 +5K558 272 +T2A25 318 +K58Q2 825 +7KKJK 628 +6A6A7 676 +J7T96 706 +A4A96 625 +6KTQ7 372 +JAAJ3 916 +99699 106 +Q7Q77 468 +8Q88J 545 +2A2J8 983 +777A7 246 +329TA 546 +38388 48 +KKKQQ 316 +KKKK8 460 +33K8Q 77 +A9A29 691 +8J859 237 +A9599 540 +23J67 390 +JT43J 668 +8J8JQ 338 +JQQQ8 456 +K9KKK 129 +8KJ8K 67 +7555Q 169 +9QJQ9 459 +7A8Q9 718 +7J765 760 +94744 173 +AA35A 264 +QKQQ5 423 +A6JJ9 819 +4AA44 848 +88385 180 +A4T7Q 259 +7J757 584 +A96T3 474 +JJJJJ 42 +9K372 604 +J333Q 118 +J7A37 451 +Q4447 515 +QQ77Q 274 +73333 553 +6747J 521 +J56K2 405 +KKJJQ 575 +QT86A 592 +75A73 476 +29925 295 +A778A 823 +AAAAJ 580 +TT99T 636 +QQ3JQ 235 +A8778 244 +K6638 784 +87Q5A 574 +99499 46 +AK7Q7 172 +KKK33 443 +38J88 345 +7976K 58 +59669 558 +6659J 217 +7557J 143 +5549K 306 +J3982 639 +J249A 677 +55955 418 +QQQQT 7 +77A47 770 +66K4K 104 +Q9T5A 976 +2673Q 230 +Q75TK 26 +JKJ9K 225 +9TAAT 188 +55JQA 119 +9Q9Q9 385 +24K42 260 +T9222 873 +99989 45 +88448 544 +T9784 808 +43454 846 +TA674 174 +3T3AT 687 +38929 561 +22QQK 912 +KQJQQ 978 +23223 481 +J7772 835 +3999Q 703 +74K44 280 +4K444 138 +KJ53K 132 + diff --git a/2023/day7/day7/src/main.rs b/2023/day7/day7/src/main.rs new file mode 100644 index 0000000..8da2e5d --- /dev/null +++ b/2023/day7/day7/src/main.rs @@ -0,0 +1,148 @@ +use std::collections::HashMap; +use std::fs::File; +use std::io::{BufRead, BufReader}; + +fn get_score(item: (&str, i32)) -> (i32, Vec) { + let (hand, bid) = item; + let mut counts: HashMap = HashMap::new(); + for c in hand.chars() { + *counts.entry(c).or_insert(0) += 1; + } + + let mut values: Vec = Vec::new(); + for c in hand.chars() { + values.push(match c { + '2' => 0, + '3' => 1, + '4' => 2, + '5' => 3, + '6' => 4, + '7' => 5, + '8' => 6, + '9' => 7, + 'T' => 8, + 'J' => 9, + 'Q' => 10, + 'K' => 11, + 'A' => 12, + _ => 0, + }); + } + + let mut counts_vec: Vec = counts.values().cloned().collect(); + counts_vec.sort(); + + let type_value = if counts_vec.contains(&5) { + 10 + } else if counts_vec.contains(&4) { + 9 + } else if counts_vec.contains(&3) { + if counts_vec.contains(&2) { + 8 + } else { + 7 + } + } else if counts_vec.contains(&2) { + if counts_vec.iter().filter(|&&x| x == 2).count() == 2 { + 6 + } else { + 5 + } + } else { + 4 + }; + (type_value, values) +} + +fn get_score_part2(item: (&str, i32)) -> (i32, Vec) { + let (hand, bid) = item; + + let counts: Vec = { + let mut count_map: HashMap = HashMap::new(); + for c in hand.replace('J', "").chars() { + *count_map.entry(c).or_insert(0) += 1; + } + let mut counts: Vec = count_map.values().cloned().collect(); + counts.sort(); + if let Some(last_count) = counts.last_mut() { + *last_count += hand.matches('J').count() as i32; + } else { + counts.push(5); + } + counts + }; + + let values: Vec = hand + .chars() + .map(|c| match c { + 'J' => 0, + '2' => 1, + '3' => 2, + '4' => 3, + '5' => 4, + '6' => 5, + '7' => 6, + '8' => 7, + '9' => 8, + 'T' => 9, + 'Q' => 10, + 'K' => 11, + 'A' => 12, + _ => 0, + }) + .collect(); + + let mut counts_vec: Vec = counts.clone(); + counts_vec.sort(); + + let type_value = if counts.contains(&5) { + 10 + } else if counts.contains(&4) { + 9 + } else if counts.contains(&3) { + if counts.contains(&2) { + 8 + } else { + 7 + } + } else if counts.contains(&2) { + if counts.iter().filter(|&&x| x == 2).count() == 2 { + 6 + } else { + 5 + } + } else { + 4 + }; + + (type_value, values) +} + +fn main() { + let file = File::open("input.txt").expect("Failed to open file"); + let reader = BufReader::new(file); + + let mut hands: Vec<(String, i32)> = Vec::new(); + let lines = reader.lines().map(|l| l.unwrap()); + + for line in lines { + let mut iter = line.split_whitespace(); + if let (Some(hand), Some(bid)) = (iter.next(), iter.next()) { + hands.push((hand.to_string(), bid.parse().unwrap())); + } + } + + // Part 1 + //hands.sort_by_key(|(hand, bid)| get_score((&hand.clone(), *bid))); + + // Part 2 + hands.sort_by_key(|(hand, bid)| get_score_part2((&hand.clone(), *bid))); + + let mut total = 0; + for (i, (_, bid)) in hands.iter().enumerate() { + total += bid * (i as i32 + 1); + } + + println!("Total: {}", total); +} +