Day 5
Brute force solution in rust to power through part 2 faster
This commit is contained in:
parent
f508ae1292
commit
71309f3672
1
.gitignore
vendored
1
.gitignore
vendored
@ -160,3 +160,4 @@ cython_debug/
|
|||||||
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
||||||
#.idea/
|
#.idea/
|
||||||
|
|
||||||
|
target/
|
||||||
|
7
d05/Cargo.lock
generated
Normal file
7
d05/Cargo.lock
generated
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
# This file is automatically @generated by Cargo.
|
||||||
|
# It is not intended for manual editing.
|
||||||
|
version = 3
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "d05"
|
||||||
|
version = "0.1.0"
|
12
d05/Cargo.toml
Normal file
12
d05/Cargo.toml
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
[package]
|
||||||
|
name = "d05"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
|
||||||
|
[[bin]]
|
||||||
|
name = "d05"
|
||||||
|
path = "main.rs"
|
238
d05/input.txt
Normal file
238
d05/input.txt
Normal file
@ -0,0 +1,238 @@
|
|||||||
|
seeds: 3943078016 158366385 481035699 103909769 3553279107 15651230 3322093486 189601966 2957349913 359478652 924423181 691197498 2578953067 27362630 124747783 108079254 1992340665 437203822 2681092979 110901631
|
||||||
|
|
||||||
|
seed-to-soil map:
|
||||||
|
2702707184 1771488746 32408643
|
||||||
|
1838704579 89787943 256129587
|
||||||
|
3308305769 3945110092 140077818
|
||||||
|
3628160213 4264964536 30002760
|
||||||
|
3481822196 4118626519 146338017
|
||||||
|
2314039806 0 23017018
|
||||||
|
2094834166 23017018 66770925
|
||||||
|
13529560 2374830476 266694587
|
||||||
|
1360948085 2280951884 93878592
|
||||||
|
2337056824 1405838386 365650360
|
||||||
|
2735115827 1389537903 16300483
|
||||||
|
2161605091 1122407194 152434715
|
||||||
|
2944685788 3581490111 363619981
|
||||||
|
3448383587 4085187910 33438609
|
||||||
|
293095451 1923371965 152989927
|
||||||
|
555976625 1361056107 28481796
|
||||||
|
0 2076361892 13529560
|
||||||
|
4055868219 3342391034 239099077
|
||||||
|
3658162973 2944685788 397705246
|
||||||
|
446085378 2641525063 109891247
|
||||||
|
584458421 685760755 436646439
|
||||||
|
1647644147 2089891452 191060432
|
||||||
|
1528169571 1832460171 90911794
|
||||||
|
1619081365 1803897389 28562782
|
||||||
|
280224147 1348184803 12871304
|
||||||
|
1021104860 345917530 339843225
|
||||||
|
1454826677 1274841909 73342894
|
||||||
|
|
||||||
|
soil-to-fertilizer map:
|
||||||
|
370579153 1660655546 474809840
|
||||||
|
1390384163 3890794774 29044725
|
||||||
|
3933903064 3062217622 43562309
|
||||||
|
2579648014 2135465386 381757066
|
||||||
|
3905615715 3862507425 28287349
|
||||||
|
4053211235 382332912 208377334
|
||||||
|
3718132574 4107484155 187483141
|
||||||
|
3977465373 306587050 75745862
|
||||||
|
1866333065 230994048 75593002
|
||||||
|
1268904151 2940737610 121480012
|
||||||
|
3646057320 3790432171 72075254
|
||||||
|
845388993 2517222452 423515158
|
||||||
|
2291172026 769577840 288475988
|
||||||
|
4261588569 3919839499 33378727
|
||||||
|
2112304432 590710246 178867594
|
||||||
|
1419428888 1213751369 446904177
|
||||||
|
2961405080 3105779931 684652240
|
||||||
|
230994048 3967899050 139585105
|
||||||
|
2097623608 3953218226 14680824
|
||||||
|
1941926067 1058053828 155697541
|
||||||
|
|
||||||
|
fertilizer-to-water map:
|
||||||
|
0 1551952886 33233684
|
||||||
|
961721436 932763195 63696624
|
||||||
|
2767354703 3875238046 18117484
|
||||||
|
3717194106 2676555200 188038931
|
||||||
|
799543557 483022915 162177879
|
||||||
|
2428347038 3081230279 28566103
|
||||||
|
2872288153 3519235797 218585862
|
||||||
|
215425000 1162608123 279396952
|
||||||
|
1473270503 411403786 71619129
|
||||||
|
2762028477 2930057227 5326226
|
||||||
|
3263853515 2169144956 62130350
|
||||||
|
3330983617 2935383453 10086546
|
||||||
|
2522376237 2231275306 106924906
|
||||||
|
2757818051 2103190872 4210426
|
||||||
|
3090874015 3187643516 172979500
|
||||||
|
2785472187 2530367956 37190043
|
||||||
|
1365587214 49710602 107683289
|
||||||
|
554985341 330919476 80484310
|
||||||
|
3639346972 3109796382 77847134
|
||||||
|
1964878739 1442005075 21531118
|
||||||
|
2098191120 3737821659 137416387
|
||||||
|
1832452033 298110266 32809210
|
||||||
|
2456913141 2864594131 65463096
|
||||||
|
1025418060 1606654056 340169154
|
||||||
|
2277580887 2475812485 29651215
|
||||||
|
2416229303 2107401298 12117735
|
||||||
|
33233684 176973083 62797441
|
||||||
|
157085258 239770524 58339742
|
||||||
|
2307232102 2567557999 108997201
|
||||||
|
1915168137 0 49710602
|
||||||
|
2235607507 3893355530 41973380
|
||||||
|
1865261243 1502045992 49906894
|
||||||
|
3905233037 3935328910 231121478
|
||||||
|
494821952 157393891 19579192
|
||||||
|
514401144 996459819 40584197
|
||||||
|
4136354515 3360623016 158612781
|
||||||
|
3503586692 2945469999 135760280
|
||||||
|
635469651 1463536193 38509799
|
||||||
|
2629301143 4166450388 128516908
|
||||||
|
2822662230 2119519033 49625923
|
||||||
|
3325983865 2098191120 4999752
|
||||||
|
3341070163 2338200212 137612273
|
||||||
|
3478682436 2505463700 24904256
|
||||||
|
96031125 1971548655 36328688
|
||||||
|
1986409857 1585186570 21467486
|
||||||
|
673979450 1037044016 125564107
|
||||||
|
1544889632 645200794 287562401
|
||||||
|
132359813 1946823210 24725445
|
||||||
|
|
||||||
|
water-to-light map:
|
||||||
|
3326310943 1150412752 87200223
|
||||||
|
4257088620 4233111242 37878676
|
||||||
|
3994159838 4060724644 54228568
|
||||||
|
3876001808 4114953212 90976210
|
||||||
|
2886658207 1485800780 134153427
|
||||||
|
3966978018 4205929422 27181820
|
||||||
|
4048388406 3874470488 149045901
|
||||||
|
528406865 502600485 237825862
|
||||||
|
111547576 1241598488 111964267
|
||||||
|
3068561383 1485461466 339314
|
||||||
|
3168255879 3056441319 158055064
|
||||||
|
3504257503 1453325844 32135622
|
||||||
|
2109734789 3372472386 240074722
|
||||||
|
3068900697 403245303 99355182
|
||||||
|
2027101388 740426347 82633401
|
||||||
|
1219093087 1970502974 808008301
|
||||||
|
3643122008 1951548756 18954218
|
||||||
|
2603944924 279757237 123488066
|
||||||
|
766232727 0 10960493
|
||||||
|
3712182589 4270989918 1531320
|
||||||
|
3536393125 2778511275 106728883
|
||||||
|
3482397575 1237612975 3985513
|
||||||
|
777193220 1763962961 71462615
|
||||||
|
1117452579 1680930659 83032302
|
||||||
|
3413511166 3214496383 46428427
|
||||||
|
2432743763 2885240158 171201161
|
||||||
|
0 3260924810 111547576
|
||||||
|
3486383088 1835425576 17874415
|
||||||
|
3672475952 3703073187 39706637
|
||||||
|
848655835 10960493 268796744
|
||||||
|
4197434307 4023516389 37208255
|
||||||
|
3459939593 823059748 22457982
|
||||||
|
2727432990 1853299991 98248765
|
||||||
|
4234642562 4272521238 22446058
|
||||||
|
3713713909 3672475952 30597235
|
||||||
|
2351588880 1353562755 81154883
|
||||||
|
223511843 845517730 304895022
|
||||||
|
3744311144 3742779824 131690664
|
||||||
|
1200484881 1434717638 18608206
|
||||||
|
3020811634 3612547108 47749749
|
||||||
|
2349809511 3660296857 1779369
|
||||||
|
2825681755 1619954207 60976452
|
||||||
|
|
||||||
|
light-to-temperature map:
|
||||||
|
252460180 3718023854 80580651
|
||||||
|
3778113118 1519654737 306188725
|
||||||
|
333040831 2573805517 96168275
|
||||||
|
4084301843 3798604505 210665453
|
||||||
|
1694244932 1825843462 379128459
|
||||||
|
1487313708 2669973792 206931224
|
||||||
|
429209106 2876905016 268167573
|
||||||
|
3133421217 3610326681 107697173
|
||||||
|
1486370741 3145072589 942967
|
||||||
|
697376679 3146015556 464311125
|
||||||
|
2152115592 836439718 249469053
|
||||||
|
3241118390 214400336 17576418
|
||||||
|
214400336 1164650972 38059844
|
||||||
|
2073373391 1085908771 78742201
|
||||||
|
1161687804 2248952614 324682937
|
||||||
|
3258694808 231976754 268511965
|
||||||
|
3527206773 1312729085 206925652
|
||||||
|
3133251251 2573635551 169966
|
||||||
|
2930227394 4091943439 203023857
|
||||||
|
2484258126 790765872 45673846
|
||||||
|
2639950241 500488719 290277153
|
||||||
|
2529931972 1202710816 110018269
|
||||||
|
2401584645 4009269958 82673481
|
||||||
|
3734132425 2204971921 43980693
|
||||||
|
|
||||||
|
temperature-to-humidity map:
|
||||||
|
168091833 268406932 76258451
|
||||||
|
3449803430 2843367435 19310453
|
||||||
|
2007621581 1615073306 528954706
|
||||||
|
1947960540 798304921 59661041
|
||||||
|
3469113883 3441273912 247683303
|
||||||
|
3980335429 3688957215 155495519
|
||||||
|
1382488646 1289756018 231480201
|
||||||
|
1613968847 2144028012 203484286
|
||||||
|
3030343754 2862677888 310561319
|
||||||
|
311459258 1257812898 31943120
|
||||||
|
3716797186 4024477040 263538243
|
||||||
|
743249314 734822904 63482017
|
||||||
|
2843367435 4288015283 6952013
|
||||||
|
244350284 201297958 67108974
|
||||||
|
806731331 549427536 185395368
|
||||||
|
33679712 344665383 134412121
|
||||||
|
1817453133 1521236219 93837087
|
||||||
|
2850319448 3844452734 180024306
|
||||||
|
1193424657 2347512298 189063989
|
||||||
|
992126699 0 201297958
|
||||||
|
3340905073 3173239207 108898357
|
||||||
|
343402378 857965962 399846936
|
||||||
|
0 479077504 33679712
|
||||||
|
4135830948 3282137564 159136348
|
||||||
|
1911290220 512757216 36670320
|
||||||
|
|
||||||
|
humidity-to-location map:
|
||||||
|
1586270647 2666237958 31388199
|
||||||
|
1639118951 2401662894 243114959
|
||||||
|
673413244 1218441073 9004417
|
||||||
|
4189219561 4197782169 97185127
|
||||||
|
339701505 993997384 224443689
|
||||||
|
2088925654 1227445490 16145987
|
||||||
|
3048450614 2034241441 196558736
|
||||||
|
3245009350 3057456069 37064056
|
||||||
|
1990947272 217743214 23964128
|
||||||
|
755791330 433456361 436687719
|
||||||
|
3750378482 1243591477 29460651
|
||||||
|
1347952933 3094520125 238317714
|
||||||
|
682417661 3593572644 73373669
|
||||||
|
1891967948 3494593320 98979324
|
||||||
|
2746577216 1325573050 27089148
|
||||||
|
90823161 3346797254 147796066
|
||||||
|
238619227 1933159163 101082278
|
||||||
|
2884769306 269775053 163681308
|
||||||
|
564145194 0 109268050
|
||||||
|
2014911400 1273052128 12916400
|
||||||
|
2773666364 1295702566 29870484
|
||||||
|
0 903174223 90823161
|
||||||
|
4286404688 3841991082 8562608
|
||||||
|
1617658846 2644777853 21460105
|
||||||
|
2714916854 3748178771 31660362
|
||||||
|
2275934358 3332837839 13959415
|
||||||
|
2027827800 870144080 33030143
|
||||||
|
3841991082 4158641967 39140202
|
||||||
|
3881131284 3850553690 308088277
|
||||||
|
3390548570 2697626157 359829912
|
||||||
|
1882233910 1285968528 9734038
|
||||||
|
2105071641 2230800177 170862717
|
||||||
|
1192479049 1777685279 155473884
|
||||||
|
2803536848 3666946313 81232458
|
||||||
|
2289893773 1352662198 425023081
|
||||||
|
2060857943 241707342 28067711
|
||||||
|
3282073406 109268050 108475164
|
132
d05/main.py
Normal file
132
d05/main.py
Normal file
@ -0,0 +1,132 @@
|
|||||||
|
from collections.abc import Generator
|
||||||
|
from collections.abc import Iterable
|
||||||
|
from dataclasses import dataclass
|
||||||
|
from itertools import batched
|
||||||
|
from itertools import chain
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class RangeMapContent:
|
||||||
|
dest_start: int
|
||||||
|
source_start: int
|
||||||
|
length: int
|
||||||
|
|
||||||
|
def __contains__(self, key: int) -> int:
|
||||||
|
return self.source_start <= key < self.source_start + self.length
|
||||||
|
|
||||||
|
def __getitem__(self, key: int) -> int:
|
||||||
|
# print(f"looking for {key} in {self.dest_start} {self.source_start}, {self.length}")
|
||||||
|
if key not in self:
|
||||||
|
return key
|
||||||
|
|
||||||
|
delta = self.source_start - self.dest_start
|
||||||
|
|
||||||
|
return key - delta
|
||||||
|
|
||||||
|
|
||||||
|
class RangeMap:
|
||||||
|
def __init__(self, *contents: RangeMapContent) -> None:
|
||||||
|
self.contents = contents
|
||||||
|
|
||||||
|
def __getitem__(self, key: int) -> int:
|
||||||
|
for content in self.contents:
|
||||||
|
if key in content:
|
||||||
|
return content[key]
|
||||||
|
|
||||||
|
return key
|
||||||
|
|
||||||
|
|
||||||
|
def part1(input: Path, part2=False):
|
||||||
|
seeds: Iterable[int] = []
|
||||||
|
maps: dict[str, RangeMap] = {}
|
||||||
|
map_name: str = ""
|
||||||
|
map_contents: list[RangeMapContent] = []
|
||||||
|
with input.open() as f:
|
||||||
|
for line in f:
|
||||||
|
line = line.strip()
|
||||||
|
if not seeds:
|
||||||
|
seeds = [int(s.strip()) for s in line.partition(":")[2].split()]
|
||||||
|
if part2:
|
||||||
|
windows = [
|
||||||
|
[start, start + length] for start, length in batched(seeds, n=2)
|
||||||
|
]
|
||||||
|
windows.sort(key=lambda x: x[0])
|
||||||
|
merged_windows: list[list[int]] = []
|
||||||
|
for window in windows:
|
||||||
|
if not merged_windows:
|
||||||
|
merged_windows.append(window)
|
||||||
|
continue
|
||||||
|
if window[0] > merged_windows[-1][1]:
|
||||||
|
merged_windows.append(window)
|
||||||
|
continue
|
||||||
|
if window[1] > merged_windows[-1][1]:
|
||||||
|
merged_windows[-1][1] = window[1]
|
||||||
|
continue
|
||||||
|
|
||||||
|
seeds = chain.from_iterable(
|
||||||
|
range(window[0], window[1]) for window in merged_windows
|
||||||
|
)
|
||||||
|
|
||||||
|
# seeds = set(chain(*[
|
||||||
|
# range(start, start+length)
|
||||||
|
# for start, length in batched(seeds, n=2)
|
||||||
|
# ]))
|
||||||
|
|
||||||
|
# print(f"{len(list(seeds))} seeds")
|
||||||
|
continue
|
||||||
|
|
||||||
|
if line == "" and map_name != "":
|
||||||
|
# print(f"Creating map {map_name} with ranges {map_contents}")
|
||||||
|
maps[map_name] = RangeMap(*map_contents)
|
||||||
|
map_name = ""
|
||||||
|
map_contents.clear()
|
||||||
|
continue
|
||||||
|
|
||||||
|
if map_name == "":
|
||||||
|
map_name = line.partition(" ")[0]
|
||||||
|
continue
|
||||||
|
|
||||||
|
items = [int(i) for i in line.split()]
|
||||||
|
dest_start = items[0]
|
||||||
|
source_start = items[1]
|
||||||
|
range_length = items[2]
|
||||||
|
|
||||||
|
map_contents.append(RangeMapContent(dest_start, source_start, range_length))
|
||||||
|
|
||||||
|
maps[map_name] = RangeMap(*map_contents)
|
||||||
|
|
||||||
|
# for name, m in maps.items():
|
||||||
|
# print(f"map {name}")
|
||||||
|
# for c in m.contents:
|
||||||
|
# print(f" {c.dest_start} {c.source_start} {c.length}")
|
||||||
|
|
||||||
|
min_location: int | None = None
|
||||||
|
|
||||||
|
for seed in seeds:
|
||||||
|
soil = maps["seed-to-soil"][seed]
|
||||||
|
fertilizer = maps["soil-to-fertilizer"][soil]
|
||||||
|
water = maps["fertilizer-to-water"][fertilizer]
|
||||||
|
light = maps["water-to-light"][water]
|
||||||
|
temperature = maps["light-to-temperature"][light]
|
||||||
|
humidity = maps["temperature-to-humidity"][temperature]
|
||||||
|
location = maps["humidity-to-location"][humidity]
|
||||||
|
|
||||||
|
if min_location is None or location < min_location:
|
||||||
|
min_location = location
|
||||||
|
|
||||||
|
print(
|
||||||
|
f"Seed {seed} to soil {soil} to fertilizer {fertilizer} to water {water} to light {light} to temperature {temperature} to humidity {humidity} to location {location}"
|
||||||
|
)
|
||||||
|
|
||||||
|
return min_location
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
input = Path("./sample.txt")
|
||||||
|
# input = Path("./input.txt")
|
||||||
|
answer1 = part1(input)
|
||||||
|
print("part1", answer1)
|
||||||
|
|
||||||
|
answer2 = part1(input, True)
|
||||||
|
print("part2", answer2)
|
214
d05/main.rs
Normal file
214
d05/main.rs
Normal file
@ -0,0 +1,214 @@
|
|||||||
|
#![feature(iter_array_chunks)]
|
||||||
|
|
||||||
|
// use std::thread;
|
||||||
|
use std::collections::HashMap;
|
||||||
|
use std::fs;
|
||||||
|
use std::thread;
|
||||||
|
// use iterchunks::IterChunk
|
||||||
|
|
||||||
|
#[derive(Clone)]
|
||||||
|
struct RangePart {
|
||||||
|
dest_start: i64,
|
||||||
|
source_start: i64,
|
||||||
|
length: i64,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl RangePart {
|
||||||
|
fn contains(&self, val: i64) -> bool {
|
||||||
|
return self.source_start <= val && val < self.source_start + self.length;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get(&self, val: i64) -> i64 {
|
||||||
|
if !self.contains(val) {
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
let delta = self.source_start - self.dest_start;
|
||||||
|
|
||||||
|
return val - delta;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone)]
|
||||||
|
struct RangeMap {
|
||||||
|
parts: Vec<RangePart>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl RangeMap {
|
||||||
|
fn new(parts: Vec<RangePart>) -> RangeMap {
|
||||||
|
RangeMap { parts }
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get(&self, val: i64) -> i64 {
|
||||||
|
for range in self.parts.iter() {
|
||||||
|
if range.contains(val.clone()) {
|
||||||
|
return range.get(val.clone());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn min_loc(maps: HashMap<&str, RangeMap>, seeds: Vec<i64>) -> i64 {
|
||||||
|
let mut min_location: i64 = i64::MAX;
|
||||||
|
|
||||||
|
for seed in seeds.iter() {
|
||||||
|
let soil = maps["seed-to-soil"].get(*seed);
|
||||||
|
let fertilizer = maps["soil-to-fertilizer"].get(soil);
|
||||||
|
let water = maps["fertilizer-to-water"].get(fertilizer);
|
||||||
|
let light = maps["water-to-light"].get(water);
|
||||||
|
let temperature = maps["light-to-temperature"].get(light);
|
||||||
|
let humidity = maps["temperature-to-humidity"].get(temperature);
|
||||||
|
let location = maps["humidity-to-location"].get(humidity);
|
||||||
|
|
||||||
|
if location < min_location {
|
||||||
|
min_location = location
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return min_location;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn min_loc_threads(maps: HashMap<&str, RangeMap>, seeds: &Vec<i64>, threads: usize) -> i64 {
|
||||||
|
// let maps = maps.clone();
|
||||||
|
// let seeds = seeds.clone();
|
||||||
|
thread::scope(|s| -> i64 {
|
||||||
|
let mut children = vec![];
|
||||||
|
for chunk in seeds.chunks(seeds.len() / threads) {
|
||||||
|
let maps = maps.clone();
|
||||||
|
let chunk = chunk.clone();
|
||||||
|
children.push(s.spawn(|| -> i64 { min_loc(maps, chunk.to_vec()) }));
|
||||||
|
}
|
||||||
|
|
||||||
|
children
|
||||||
|
.into_iter()
|
||||||
|
.map(|c| -> i64 { c.join().unwrap() })
|
||||||
|
.min()
|
||||||
|
.unwrap()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
// let file_contents = fs::read_to_string("sample.txt").expect("No input found");
|
||||||
|
let file_contents = fs::read_to_string("input.txt").expect("No input found");
|
||||||
|
let mut lines = file_contents.lines();
|
||||||
|
|
||||||
|
// let start = 1;
|
||||||
|
// let len = 2;
|
||||||
|
// let r = (start..start+len).collect();
|
||||||
|
|
||||||
|
let mut windows = lines
|
||||||
|
.next()
|
||||||
|
.expect("No line found")
|
||||||
|
.strip_prefix("seeds: ")
|
||||||
|
.expect("No seeds prefix")
|
||||||
|
.split_whitespace()
|
||||||
|
.map(|value| {
|
||||||
|
value
|
||||||
|
.parse::<i64>()
|
||||||
|
.expect(format!("Expected value to be an int but got : {}", value).as_str())
|
||||||
|
})
|
||||||
|
.array_chunks::<2>()
|
||||||
|
.map(|r| vec![r[0], r[0] + r[1]])
|
||||||
|
.collect::<Vec<Vec<i64>>>();
|
||||||
|
|
||||||
|
windows.sort_by(|a, b| a[0].cmp(&b[0]));
|
||||||
|
|
||||||
|
let mut merged_windows: Vec<Vec<i64>> = Vec::new();
|
||||||
|
merged_windows.push(windows[0].clone());
|
||||||
|
|
||||||
|
for i in 1..windows.len() {
|
||||||
|
let j: usize = merged_windows.len() - 1;
|
||||||
|
if windows[i][0] > merged_windows.last().unwrap()[1] {
|
||||||
|
merged_windows.push(windows[i].clone());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if windows[i][1] > merged_windows.last().unwrap()[1] {
|
||||||
|
merged_windows[j][1] = windows[i][1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let seeds = merged_windows
|
||||||
|
.iter()
|
||||||
|
.map(|r| {
|
||||||
|
// println!("range {} to {}", r[0], r[1]);
|
||||||
|
(r[0]..r[1]).collect::<Vec<i64>>()
|
||||||
|
})
|
||||||
|
.flatten()
|
||||||
|
.collect::<Vec<i64>>();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* let seed_set: HashSet<&i64> = HashSet::from_iter(seeds.iter());
|
||||||
|
* println!("seeds {}", seed_set.len());
|
||||||
|
*/
|
||||||
|
|
||||||
|
let mut maps: HashMap<&str, RangeMap> = HashMap::new();
|
||||||
|
let mut map_name = "";
|
||||||
|
let mut ranges: Vec<RangePart> = vec![];
|
||||||
|
|
||||||
|
for line in lines.map(|l| l.trim()) {
|
||||||
|
if line == "" {
|
||||||
|
if map_name != "" {
|
||||||
|
maps.insert(map_name, RangeMap::new(ranges));
|
||||||
|
map_name = "";
|
||||||
|
ranges = vec![];
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if map_name == "" {
|
||||||
|
map_name = line.split_whitespace().next().unwrap();
|
||||||
|
// println!("map {}", map_name);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut parts = line.split_whitespace();
|
||||||
|
let dest_start = parts.next().unwrap().parse::<i64>().unwrap();
|
||||||
|
let source_start = parts.next().unwrap().parse::<i64>().unwrap();
|
||||||
|
let length = parts.next().unwrap().parse::<i64>().unwrap();
|
||||||
|
|
||||||
|
ranges.push(RangePart {
|
||||||
|
dest_start,
|
||||||
|
source_start,
|
||||||
|
length,
|
||||||
|
});
|
||||||
|
// println!("adding range {} {} {}", dest_start, source_start, length)
|
||||||
|
}
|
||||||
|
maps.insert(map_name, RangeMap::new(ranges));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* let mut min_location: i64 = i64::MAX;
|
||||||
|
* for seed in seeds.iter() {
|
||||||
|
* let soil = maps["seed-to-soil"].get(*seed);
|
||||||
|
* let fertilizer = maps["soil-to-fertilizer"].get(soil);
|
||||||
|
* let water = maps["fertilizer-to-water"].get(fertilizer);
|
||||||
|
* let light = maps["water-to-light"].get(water);
|
||||||
|
* let temperature = maps["light-to-temperature"].get(light);
|
||||||
|
* let humidity = maps["temperature-to-humidity"].get(temperature);
|
||||||
|
* let location = maps["humidity-to-location"].get(humidity);
|
||||||
|
*
|
||||||
|
* if location < min_location {
|
||||||
|
* min_location = location
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* #<{(|
|
||||||
|
* * println!(
|
||||||
|
* * "Seed {} to soil {} to fertilizer {} to water {} to light {} to temperature {} to humidity {} to location {}",
|
||||||
|
* * seed,
|
||||||
|
* * soil,
|
||||||
|
* * fertilizer,
|
||||||
|
* * water,
|
||||||
|
* * light,
|
||||||
|
* * temperature,
|
||||||
|
* * humidity,
|
||||||
|
* * location,
|
||||||
|
* * )
|
||||||
|
* |)}>#
|
||||||
|
* }
|
||||||
|
*/
|
||||||
|
|
||||||
|
let min_location = min_loc_threads(maps, &seeds, 4);
|
||||||
|
|
||||||
|
println!("answer {}", min_location);
|
||||||
|
}
|
33
d05/sample.txt
Normal file
33
d05/sample.txt
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
seeds: 79 14 55 13
|
||||||
|
|
||||||
|
seed-to-soil map:
|
||||||
|
50 98 2
|
||||||
|
52 50 48
|
||||||
|
|
||||||
|
soil-to-fertilizer map:
|
||||||
|
0 15 37
|
||||||
|
37 52 2
|
||||||
|
39 0 15
|
||||||
|
|
||||||
|
fertilizer-to-water map:
|
||||||
|
49 53 8
|
||||||
|
0 11 42
|
||||||
|
42 0 7
|
||||||
|
57 7 4
|
||||||
|
|
||||||
|
water-to-light map:
|
||||||
|
88 18 7
|
||||||
|
18 25 70
|
||||||
|
|
||||||
|
light-to-temperature map:
|
||||||
|
45 77 23
|
||||||
|
81 45 19
|
||||||
|
68 64 13
|
||||||
|
|
||||||
|
temperature-to-humidity map:
|
||||||
|
0 69 1
|
||||||
|
1 0 69
|
||||||
|
|
||||||
|
humidity-to-location map:
|
||||||
|
60 56 37
|
||||||
|
56 93 4
|
Loading…
Reference in New Issue
Block a user