[haskell] Solve Day 5
This commit is contained in:
parent
66839b7bfd
commit
d6f9b4dae3
|
@ -27,4 +27,11 @@
|
|||
checkBash = false;
|
||||
checkRust = false;
|
||||
};
|
||||
day5 = {
|
||||
part1 = "462648396";
|
||||
part2 = "2520479";
|
||||
checkHaskell = true;
|
||||
checkBash = false;
|
||||
checkRust = false;
|
||||
};
|
||||
}
|
||||
|
|
|
@ -24,6 +24,7 @@ library
|
|||
, Day2
|
||||
, Day3
|
||||
, Day4
|
||||
, Day5
|
||||
|
||||
executable aoc2023
|
||||
import: warnings
|
||||
|
|
|
@ -7,6 +7,7 @@ import Day2 qualified
|
|||
import System.Environment (getArgs)
|
||||
import qualified Day3
|
||||
import qualified Day4
|
||||
import qualified Day5
|
||||
|
||||
main :: IO ()
|
||||
main = do
|
||||
|
@ -15,4 +16,5 @@ main = do
|
|||
["day2"] -> Day2.run
|
||||
["day3"] -> Day3.run
|
||||
["day4"] -> Day4.run
|
||||
["day5"] -> Day5.run
|
||||
args -> error $ "Invlaid args: " <> show args
|
||||
|
|
370
haskell/src/Day5.hs
Normal file
370
haskell/src/Day5.hs
Normal file
|
@ -0,0 +1,370 @@
|
|||
{-# LANGUAGE RecordWildCards #-}
|
||||
{-# OPTIONS_GHC -Wwarn -Wall -Wunused-top-binds #-}
|
||||
|
||||
module Day5 (run) where
|
||||
|
||||
import Data.Char
|
||||
import Data.IntervalMap.FingerTree (Interval (Interval), IntervalMap, high, low)
|
||||
import Data.IntervalMap.FingerTree qualified as IntervalMap
|
||||
import Data.Maybe (maybeToList)
|
||||
import Text.ParserCombinators.ReadP
|
||||
|
||||
run :: IO ()
|
||||
run = do
|
||||
almanac <- readInput
|
||||
putStrLn $ "Part 1 Answer: " <> show (part1 almanac)
|
||||
putStrLn $ "Part 2 Answer: " <> show (part2 almanac)
|
||||
|
||||
part1 :: Almanac -> Int
|
||||
part1 almanac =
|
||||
minimum $ map (seedToLocation almanac) (seeds almanac)
|
||||
|
||||
part2 :: Almanac -> Int
|
||||
part2 almanac =
|
||||
minimum $ seedToLocationMap almanac
|
||||
|
||||
type Seeds = [Int]
|
||||
|
||||
type RangeMap = IntervalMap Int Int
|
||||
|
||||
data Almanac = Almanac
|
||||
{ seeds :: Seeds,
|
||||
seedToSoilMap :: RangeMap,
|
||||
soilToFertilizerMap :: RangeMap,
|
||||
fertilizerToWaterMap :: RangeMap,
|
||||
waterToLightMap :: RangeMap,
|
||||
lightToTemperatureMap :: RangeMap,
|
||||
temperatureToHumidityMap :: RangeMap,
|
||||
humidityToLocationMap :: RangeMap
|
||||
}
|
||||
deriving (Show)
|
||||
|
||||
rangeMapLookup :: (Ord a, Enum a, Enum b) => (a -> b) -> a -> IntervalMap a b -> b
|
||||
rangeMapLookup f src m =
|
||||
case IntervalMap.search src m of
|
||||
[] -> f src
|
||||
-- Ignores the fact that there can be many matches as it is not defined in
|
||||
-- the problem statement
|
||||
((srcRange, destStart) : _) -> rangeLookup srcRange destStart src
|
||||
|
||||
rangeLookup :: (Enum a, Enum b) => Interval a -> b -> a -> b
|
||||
rangeLookup ia bStart a =
|
||||
toEnum $ fromEnum bStart + (fromEnum a - fromEnum (low ia))
|
||||
|
||||
seedToLocation :: Almanac -> Int -> Int
|
||||
seedToLocation Almanac {..} seed =
|
||||
foldl
|
||||
(rangeMapLookup id)
|
||||
seed
|
||||
[ seedToSoilMap,
|
||||
soilToFertilizerMap,
|
||||
fertilizerToWaterMap,
|
||||
waterToLightMap,
|
||||
lightToTemperatureMap,
|
||||
temperatureToHumidityMap,
|
||||
humidityToLocationMap
|
||||
]
|
||||
|
||||
seedToLocationMap :: Almanac -> RangeMap
|
||||
seedToLocationMap Almanac {..} =
|
||||
foldl
|
||||
(composeRangeMaps id id)
|
||||
(seedToSeedMap seeds)
|
||||
[ seedToSoilMap,
|
||||
soilToFertilizerMap,
|
||||
fertilizerToWaterMap,
|
||||
waterToLightMap,
|
||||
lightToTemperatureMap,
|
||||
temperatureToHumidityMap,
|
||||
humidityToLocationMap
|
||||
]
|
||||
where
|
||||
seedToSeedMap :: Seeds -> RangeMap
|
||||
seedToSeedMap [] = mempty
|
||||
seedToSeedMap [_] = mempty
|
||||
seedToSeedMap (x : y : rest) = IntervalMap.insert (Interval x (x + y - 1)) x $ seedToSeedMap rest
|
||||
|
||||
-- Example:
|
||||
--
|
||||
-- ----------------------- :: -------------------- :: -------------------- :: ------------------- :: -------------------------------------------
|
||||
-- Name :: source interval :: overlapping intervals:: resolution :: Remarks
|
||||
-- ----------------------- :: -------------------- :: -------------------- :: ------------------- :: -------------------------------------------
|
||||
-- 1. Perfect overlap :: [0, 10] -> [10, 20] :: [10, 20] -> [30, 40] :: [0, 10] -> [30, 40] ::
|
||||
-- ----------------------- :: -------------------- :: ---------------------:: ------------------- :: -------------------------------------------
|
||||
-- 2. Right skewed overlap :: [0, 10] -> [15, 25] :: [10, 20] -> [30, 40] :: [0, 5] -> [35, 40] ::
|
||||
-- :: :: :: [6, 10] -> [21, 25] ::
|
||||
-- ----------------------- :: -------------------- :: ---------------------:: ------------------- :: -------------------------------------------
|
||||
-- 3. Left skewed overlap :: [0, 10] -> [ 5, 15] :: [10, 20] -> [30, 40] :: [0, 4] -> [ 5, 9] ::
|
||||
-- :: :: :: [5, 10] -> [30, 35] ::
|
||||
-- ----------------------- :: -------------------- :: ---------------------:: ------------------- :: -------------------------------------------
|
||||
-- 4. Containing overlap :: [0, 10] -> [10, 20] :: [12, 17] -> [32, 37] :: [0, 1] -> [10, 11] :: left skew
|
||||
-- :: :: :: [2, 7] -> [12, 17] :: matches
|
||||
-- :: :: :: [8, 10] -> [ 8, 10] :: right skew
|
||||
-- ----------------------- :: -------------------- :: ---------------------:: ------------------- :: -------------------------------------------
|
||||
-- 5. Contained overlap :: [0, 10] -> [10, 20] :: [ 9, 22] -> [29, 42] :: [0, 10] -> [30, 40] ::
|
||||
-- ----------------------- :: -------------------- :: ---------------------:: ------------------- :: -------------------------------------------
|
||||
-- 6. Multiple overlaps :: [0, 10] -> [10, 20] :: [ 9, 13] -> [29, 33] :: [0, 3] -> [30, 33] ::
|
||||
-- :: :: [15, 17] -> [35, 37] :: [4, 4] -> [14, 14] ::
|
||||
-- :: :: [19, 25] -> [39, 45] :: [5, 7] -> [35, 37] ::
|
||||
-- :: :: :: [8, 8] -> [18, 18] ::
|
||||
-- :: :: :: [9, 10] -> [39, 40] ::
|
||||
-- ----------------------- :: -------------------- :: -------------------- :: ------------------- :: -------------------------------------------
|
||||
|
||||
-- >>> i = Interval
|
||||
-- >>> assertEqual a b = if a == b then True else error $ "Expected: " <> show a <> "\n Actual: " <> show b
|
||||
--
|
||||
-- Perfect overlap
|
||||
-- >>> assertEqual Nothing $ preMatchInterval (i 0 10) 10 (i 10 20)
|
||||
-- True
|
||||
--
|
||||
-- Right skewed overlap
|
||||
-- >>> assertEqual Nothing $ preMatchInterval (i 0 10) 15 (i 10 20)
|
||||
-- True
|
||||
--
|
||||
-- Left skewed overlap
|
||||
-- >>> assertEqual (Just $ i 0 4) $ preMatchInterval (i 0 10) 5 (i 10 20)
|
||||
-- True
|
||||
--
|
||||
-- Containing overlap
|
||||
-- >>> assertEqual (Just $ i 0 1) $ preMatchInterval (i 0 10) 10 (i 12 17)
|
||||
-- True
|
||||
--
|
||||
-- Multiple overlaps 1:
|
||||
-- >>> assertEqual Nothing $ preMatchInterval (i 0 10) 10 (i 9 13)
|
||||
-- True
|
||||
--
|
||||
-- Extra case, probably not going to happen:
|
||||
-- >>> assertEqual (Just $ i 0 10) $ preMatchInterval (i 0 10) 10 (i 30 40)
|
||||
-- True
|
||||
preMatchInterval :: (Ord b, Enum b, Enum a, Ord a) => Interval a -> b -> Interval b -> Maybe (Interval a)
|
||||
preMatchInterval ia bStart ib
|
||||
| bStart < low ib =
|
||||
Just $ Interval (low ia) (min (high ia) (succByDiff (low ia) (pred $ low ib) bStart))
|
||||
| otherwise = Nothing
|
||||
|
||||
-- >>> i = Interval
|
||||
-- >>> assertEqual a b = if a == b then True else error $ "Expected: " <> show a <> "\n Actual: " <> show b
|
||||
--
|
||||
-- Perfect overlap
|
||||
-- >>> assertEqual (Just $ i 0 10) $ matchInterval (i 0 10) 10 (i 10 20)
|
||||
-- True
|
||||
--
|
||||
-- Right skewed overlap
|
||||
-- >>> assertEqual (Just $ i 0 5) $ matchInterval (i 0 10) 15 (i 10 20)
|
||||
-- True
|
||||
--
|
||||
-- Left skewed overlap
|
||||
-- >>> assertEqual (Just $ i 5 10) $ matchInterval (i 0 10) 5 (i 10 20)
|
||||
-- True
|
||||
--
|
||||
-- Containing overlap
|
||||
-- >>> assertEqual (Just $ i 2 7) $ matchInterval (i 0 10) 10 (i 12 17)
|
||||
-- True
|
||||
--
|
||||
-- Multiple overlaps 1:
|
||||
-- >>> assertEqual (Just $ i 0 3) $ matchInterval (i 0 10) 10 (i 9 13)
|
||||
-- True
|
||||
--
|
||||
-- Extra case, probably not going to happen:
|
||||
-- >>> assertEqual Nothing $ matchInterval (i 0 10) 10 (i 30 40)
|
||||
-- True
|
||||
matchInterval :: (Ord a, Ord b, Enum a, Enum b) => Interval a -> b -> Interval b -> Maybe (Interval a)
|
||||
matchInterval ia bStart ib
|
||||
| bStart `elemInterval` ib
|
||||
|| bEnd `elemInterval` ib
|
||||
|| (bStart <= low ib && bEnd >= high ib) =
|
||||
Just $ Interval aStart aEnd
|
||||
| otherwise = Nothing
|
||||
where
|
||||
bEnd = succByDiff bStart (high ia) (low ia)
|
||||
aStart =
|
||||
if bStart `elemInterval` ib
|
||||
then low ia
|
||||
else succByDiff (low ia) (low ib) bStart
|
||||
aEnd =
|
||||
if bEnd `elemInterval` ib
|
||||
then high ia
|
||||
else succByDiff (low ia) (high ib) bStart
|
||||
|
||||
-- >>> i = Interval
|
||||
-- >>> assertEqual a b = if a == b then True else error $ "Expected: " <> show a <> "\n Actual: " <> show b
|
||||
--
|
||||
-- Perfect overlap
|
||||
-- >>> assertEqual Nothing $ postMatchInterval (i 0 10) 10 (i 10 20)
|
||||
-- True
|
||||
--
|
||||
-- Right skewed overlap
|
||||
-- >>> assertEqual (Just $ i 6 10) $ postMatchInterval (i 0 10) 15 (i 10 20)
|
||||
-- True
|
||||
--
|
||||
-- Left skewed overlap
|
||||
-- >>> assertEqual Nothing $ postMatchInterval (i 0 10) 5 (i 10 20)
|
||||
-- True
|
||||
--
|
||||
-- Containing overlap
|
||||
-- >>> assertEqual (Just $ i 8 10) $ postMatchInterval (i 0 10) 10 (i 12 17)
|
||||
-- True
|
||||
--
|
||||
-- Multiple overlaps 1:
|
||||
-- >>> assertEqual (Just $ i 4 10) $ postMatchInterval (i 0 10) 10 (i 9 13)
|
||||
-- True
|
||||
--
|
||||
-- Extra case, probably not going to happen:
|
||||
-- >>> assertEqual Nothing $ postMatchInterval (i 0 10) 10 (i 30 40)
|
||||
-- True
|
||||
postMatchInterval :: (Ord a, Ord b, Enum a, Enum b) => Interval a -> b -> Interval b -> Maybe (Interval a)
|
||||
postMatchInterval ia bStart ib
|
||||
| bEnd > high ib =
|
||||
Just $
|
||||
Interval
|
||||
(succByDiff (low ia) (succ $ high ib) bStart)
|
||||
(high ia)
|
||||
| otherwise = Nothing
|
||||
where
|
||||
bEnd = succByDiff bStart (high ia) (low ia)
|
||||
|
||||
-- >>> i = Interval
|
||||
-- >>> assertEqual a b = if a == b then True else error $ "Expected: " <> show a <> "\n Actual: " <> show b
|
||||
--
|
||||
-- Perfect overlap
|
||||
-- >>> assertEqual [i 0 10] $ newIntervals (i 0 10) 10 [(i 10 20)]
|
||||
-- True
|
||||
--
|
||||
-- Right skewed overlap
|
||||
-- >>> assertEqual [i 0 5, i 6 10] $ newIntervals (i 0 10) 15 [(i 10 20)]
|
||||
-- True
|
||||
--
|
||||
-- Left skewed overlap
|
||||
-- >>> assertEqual [i 0 4, i 5 10] $ newIntervals (i 0 10) 5 [(i 10 20)]
|
||||
-- True
|
||||
--
|
||||
-- Containing overlap
|
||||
-- >>> assertEqual [i 0 1, i 2 7, i 8 10] $ newIntervals (i 0 10) 10 [(i 12 17)]
|
||||
-- True
|
||||
--
|
||||
-- Multiple overlaps 1:
|
||||
-- >>> assertEqual [i 0 3, i 4 4, i 5 7, i 8 8, i 9 10] $ newIntervals (i 0 10) 10 [i 9 13, i 15 17, i 19 25]
|
||||
-- True
|
||||
--
|
||||
-- >>> assertEqual [i 0 10] $ newIntervals (i 0 10) 10 []
|
||||
-- True
|
||||
--
|
||||
-- Extra case, probably not going to happen:
|
||||
-- >>> assertEqual [i 0 10] $ newIntervals (i 0 10) 10 [(i 30 40)]
|
||||
-- True
|
||||
newIntervals :: (Ord a, Ord b, Enum a, Enum b) => Interval a -> b -> [Interval b] -> [Interval a]
|
||||
newIntervals ia _ [] = [ia]
|
||||
newIntervals ia bStart (ib : rest) =
|
||||
let pres = maybeToList $ preMatchInterval ia bStart ib
|
||||
matches = maybeToList $ matchInterval ia bStart ib
|
||||
in case postMatchInterval ia bStart ib of
|
||||
Nothing -> pres <> matches
|
||||
Just post -> pres <> matches <> newIntervals post (succByDiff bStart (low post) (low ia)) rest
|
||||
|
||||
composeRangeMaps :: (Ord a, Ord b, Ord c, Enum a, Enum b, Enum c, Bounded a) => (a -> b) -> (b -> c) -> IntervalMap a b -> IntervalMap b c -> IntervalMap a c
|
||||
composeRangeMaps a2b b2c r1 r2 =
|
||||
let allIntervalsWithStarts = IntervalMap.intersections (Interval minBound maxBound) r1
|
||||
relevantIntervals =
|
||||
foldMap
|
||||
( \(ia, bStart) ->
|
||||
let bEnd = succByDiff bStart (high ia) (low ia)
|
||||
in newIntervals ia bStart $
|
||||
map fst $
|
||||
IntervalMap.intersections (Interval bStart bEnd) r2
|
||||
)
|
||||
allIntervalsWithStarts
|
||||
in foldMap (\ia -> IntervalMap.singleton ia (rangeMapLookup b2c (rangeMapLookup a2b (low ia) r1) r2)) relevantIntervals
|
||||
|
||||
-- >>> enumDiff 15 10
|
||||
-- 5
|
||||
enumDiff :: (Enum a) => a -> a -> Int
|
||||
enumDiff x y = fromEnum x - fromEnum y
|
||||
|
||||
-- >>> succByDiff 0 15 10
|
||||
-- 5
|
||||
succByDiff :: (Enum a, Enum b) => a -> b -> b -> a
|
||||
succByDiff x y1 y2 = toEnum (fromEnum x + enumDiff y1 y2)
|
||||
|
||||
elemInterval :: (Ord a) => a -> Interval a -> Bool
|
||||
a `elemInterval` i = low i <= a && a <= high i
|
||||
|
||||
-- * Parsing
|
||||
|
||||
emptyAlmanac :: Almanac
|
||||
emptyAlmanac =
|
||||
Almanac
|
||||
{ seeds = mempty,
|
||||
seedToSoilMap = mempty,
|
||||
soilToFertilizerMap = mempty,
|
||||
fertilizerToWaterMap = mempty,
|
||||
waterToLightMap = mempty,
|
||||
lightToTemperatureMap = mempty,
|
||||
temperatureToHumidityMap = mempty,
|
||||
humidityToLocationMap = mempty
|
||||
}
|
||||
|
||||
readInput :: IO Almanac
|
||||
readInput = do
|
||||
input <- getContents
|
||||
case readP_to_S (almanacParser <* eof) input of
|
||||
[] -> error "Parser failed"
|
||||
[(almanac, "")] -> pure almanac
|
||||
xs -> error $ "Parser failed: " <> show xs
|
||||
|
||||
-- >>> readP_to_S numberParser "123"
|
||||
-- [(123,"")]
|
||||
numberParser :: ReadP Int
|
||||
numberParser =
|
||||
read <$> munch1 isDigit
|
||||
|
||||
-- >>> readP_to_S (seedsParser <* eof) "seeds: 79 14 55 13"
|
||||
-- [([79,14,55,13],"")]
|
||||
seedsParser :: ReadP Seeds
|
||||
seedsParser = do
|
||||
_ <- string "seeds: "
|
||||
sepBy1 numberParser (char ' ')
|
||||
|
||||
-- >>> readP_to_S (rangeParser <* eof) "52 50 48"
|
||||
-- [((52,50,48),"")]
|
||||
rangeParser :: ReadP (Int, Int, Int)
|
||||
rangeParser = do
|
||||
destRangeStart <- numberParser
|
||||
_ <- char ' '
|
||||
srcRangeStart <- numberParser
|
||||
_ <- char ' '
|
||||
rangeLen <- numberParser
|
||||
pure (destRangeStart, srcRangeStart, rangeLen)
|
||||
|
||||
-- >>> readP_to_S (rangeMapParser <* eof) "seed-to-soil map:\n50 98 2\n52 50 48"
|
||||
-- [(("seed-to-soil",insert (Interval 50 97) 52 $ insert (Interval 98 99) 50 $ empty),"")]
|
||||
rangeMapParser :: ReadP (String, RangeMap)
|
||||
rangeMapParser = do
|
||||
mapName <- munch1 (/= ' ')
|
||||
_ <- string " map:\n"
|
||||
rangeMap <-
|
||||
foldr
|
||||
( \(destStart, srcStart, len) ->
|
||||
IntervalMap.insert (Interval srcStart (srcStart + len - 1)) destStart
|
||||
)
|
||||
mempty
|
||||
<$> sepBy1 rangeParser (char '\n')
|
||||
pure (mapName, rangeMap)
|
||||
|
||||
almanacParser :: ReadP Almanac
|
||||
almanacParser = do
|
||||
parsedSeeds <- seedsParser
|
||||
_ <- string "\n\n"
|
||||
rangeMaps <- sepBy1 rangeMapParser (string "\n\n")
|
||||
pure $ foldr (uncurry updateAlmanacByName) (emptyAlmanac {seeds = parsedSeeds}) rangeMaps
|
||||
|
||||
updateAlmanacByName :: String -> RangeMap -> Almanac -> Almanac
|
||||
updateAlmanacByName name rangeMap almanac =
|
||||
case name of
|
||||
"seed-to-soil" -> almanac {seedToSoilMap = rangeMap}
|
||||
"soil-to-fertilizer" -> almanac {soilToFertilizerMap = rangeMap}
|
||||
"fertilizer-to-water" -> almanac {fertilizerToWaterMap = rangeMap}
|
||||
"water-to-light" -> almanac {waterToLightMap = rangeMap}
|
||||
"light-to-temperature" -> almanac {lightToTemperatureMap = rangeMap}
|
||||
"temperature-to-humidity" -> almanac {temperatureToHumidityMap = rangeMap}
|
||||
"humidity-to-location" -> almanac {humidityToLocationMap = rangeMap}
|
||||
_ -> almanac -- Ignore the wrong input ¯\_(ツ)_/¯
|
213
input/day5
Normal file
213
input/day5
Normal file
|
@ -0,0 +1,213 @@
|
|||
seeds: 3139431799 50198205 3647185634 110151761 2478641666 139825503 498892555 8913570 961540761 489996751 568452082 100080382 907727477 42158689 1617552130 312026427 342640189 97088268 2049289560 336766062
|
||||
|
||||
seed-to-soil map:
|
||||
1615836342 1401909974 23067952
|
||||
785532007 269485885 88937774
|
||||
3019002892 2773729385 10470414
|
||||
4202163101 2747292152 26437233
|
||||
3183210415 4217634159 77333137
|
||||
2847460091 3211730218 136699600
|
||||
2455891790 3791729773 70553041
|
||||
3260543552 2581343101 165949051
|
||||
3840286095 2849853212 361877006
|
||||
4228600334 2361239030 66366962
|
||||
1594559581 1077839137 21276761
|
||||
380069408 165017790 44262617
|
||||
3598718222 1894384162 241567873
|
||||
0 1424977926 190757551
|
||||
1894384162 2810496375 39356837
|
||||
424332025 606264721 196539291
|
||||
3521487829 2221977524 77230393
|
||||
742681934 69797365 36566707
|
||||
1638904294 1615735477 139190145
|
||||
1335949488 0 69797365
|
||||
779248641 802804012 6283366
|
||||
2638766896 4008940964 208693195
|
||||
250963029 1142644585 70452661
|
||||
1933740999 3470280789 321448984
|
||||
190757551 209280407 60205478
|
||||
1778094439 1099115898 43528687
|
||||
2255189983 3348429818 121850971
|
||||
1000500225 809087378 268751759
|
||||
1269251984 1754925622 66697504
|
||||
874469781 358423659 126030444
|
||||
2526444831 2135952035 86025489
|
||||
2439072067 3992121241 16819723
|
||||
3426492603 3897126015 94995226
|
||||
1405746853 1213097246 188812728
|
||||
321415690 106364072 58653718
|
||||
2984159691 3862282814 34843201
|
||||
2377040954 2299207917 62031113
|
||||
3029473306 2427605992 153737109
|
||||
2612470320 2784199799 26296576
|
||||
620871316 484454103 121810618
|
||||
|
||||
soil-to-fertilizer map:
|
||||
4245401761 2352458099 28057201
|
||||
2099789767 3998256334 14950546
|
||||
3446056574 2749719529 135349925
|
||||
890092371 1379309857 42097049
|
||||
953714890 896502554 10335567
|
||||
3115342240 2380515300 218129381
|
||||
3333471621 3885671381 112584953
|
||||
663999152 0 226093219
|
||||
1873325002 727305635 169196919
|
||||
2042521921 1328150912 51158945
|
||||
3581406499 4034715214 260252082
|
||||
500989478 564295961 163009674
|
||||
4273458962 4013206880 21508334
|
||||
3992733429 2099789767 164092891
|
||||
4156826320 2263882658 88575441
|
||||
3841658581 2598644681 151074848
|
||||
1094703999 226093219 21270249
|
||||
1708571521 399542480 164753481
|
||||
964050457 247363468 130653542
|
||||
1236290130 1421406906 171284482
|
||||
0 1592691388 500989478
|
||||
932189420 378017010 21525470
|
||||
2114740313 2885069454 1000601927
|
||||
1115974248 1207835030 120315882
|
||||
1407574612 906838121 300996909
|
||||
|
||||
fertilizer-to-water map:
|
||||
3217858280 3761663130 355893932
|
||||
2319366035 2401839275 72374872
|
||||
1962726423 909927230 105011330
|
||||
2115307878 441322644 204058157
|
||||
2095064202 1824085445 20243676
|
||||
110580631 329763915 34129824
|
||||
2573484127 2701101998 225220022
|
||||
1780224111 2342656863 59182412
|
||||
1717605398 1571533532 62618713
|
||||
3589165621 3062909078 75538793
|
||||
842280446 1871096488 471560375
|
||||
409726333 0 243114563
|
||||
397401582 760576019 12324751
|
||||
0 667815878 92760141
|
||||
3990305711 2926322020 5981819
|
||||
251664023 1741105813 32320840
|
||||
2072629125 645380801 22435077
|
||||
92760141 363893739 17820490
|
||||
2798704149 3138447871 156185660
|
||||
3664704414 2573484127 127617871
|
||||
1839406523 381714229 59608415
|
||||
283984863 1844329121 26767367
|
||||
1313840821 1176023584 27579684
|
||||
2391740907 1790738543 33346902
|
||||
3929650615 4234312200 60655096
|
||||
3996287530 3557602002 204061128
|
||||
1402088224 772900770 137026460
|
||||
1911435456 2474214147 51290967
|
||||
1539114684 1393042818 178490714
|
||||
3573752212 4117557062 15413409
|
||||
1341420505 1014938560 60667719
|
||||
3792322285 4132970471 6723091
|
||||
4200348658 4139693562 80082634
|
||||
652840896 1203603268 189439550
|
||||
310752230 243114563 86649352
|
||||
2425087809 1075606279 100417305
|
||||
1899014938 1773426653 12420518
|
||||
2067737753 1785847171 4891372
|
||||
3799045376 2932303839 130605239
|
||||
2954889809 3294633531 262968471
|
||||
4280431292 4219776196 14536004
|
||||
144710455 1634152245 106953568
|
||||
|
||||
water-to-light map:
|
||||
1071107509 759231097 26724064
|
||||
1293599454 642189614 64567949
|
||||
3147690498 1633749175 71376364
|
||||
3487999223 4080968704 155844998
|
||||
1700873635 2097781236 292450760
|
||||
1146121952 1950303734 147477502
|
||||
2864027062 1470573702 75076585
|
||||
2507471274 3021419800 175807670
|
||||
2939103647 922829268 123372939
|
||||
2826742681 2551285626 37284381
|
||||
719212681 1821763210 100196810
|
||||
4236813702 4292227071 2740225
|
||||
3643844221 3837685117 243283587
|
||||
209103905 785955161 52302440
|
||||
100332146 752700417 6530680
|
||||
1478192138 3229160565 10342236
|
||||
1358167403 3239502801 94242072
|
||||
3219066862 706757563 45942854
|
||||
3062476586 1358475140 29661777
|
||||
819409491 2390231996 26561329
|
||||
4195136152 3511184798 41677550
|
||||
1488534374 1046202207 35444248
|
||||
3887127808 3552862348 284822769
|
||||
2188804057 1705125539 116637671
|
||||
0 309410320 100332146
|
||||
1117778238 1921960020 28343714
|
||||
261406345 3333744873 74978759
|
||||
2100705169 1545650287 88098888
|
||||
3450098653 3473284228 37900570
|
||||
2742067948 1273800407 84674733
|
||||
2305441728 107380774 202029546
|
||||
3265009716 1130086491 143713916
|
||||
1993324395 0 107380774
|
||||
1523978622 465294601 176895013
|
||||
106862826 2588570007 102241079
|
||||
2683278944 864040264 58789004
|
||||
4239553927 4236813702 55413369
|
||||
1097831573 1081646455 19946665
|
||||
524293914 1101593120 28493371
|
||||
336385104 2833510990 187908810
|
||||
552787285 3197227470 31933095
|
||||
845970820 2690811086 142699904
|
||||
988670724 1388136917 82436785
|
||||
1452409475 838257601 25782663
|
||||
3092138363 409742466 55552135
|
||||
584720380 2416793325 134492301
|
||||
4171950577 3450098653 23185575
|
||||
|
||||
light-to-temperature map:
|
||||
2906633798 3843376160 451591136
|
||||
1332454428 1190958320 69004583
|
||||
1837712164 0 353313230
|
||||
494809338 353313230 376619264
|
||||
871428602 729932494 461025826
|
||||
1401459011 1754772241 373416033
|
||||
3976747173 3375456648 91164221
|
||||
3495346659 3466620869 376755291
|
||||
0 1259962903 494809338
|
||||
2608238358 2459541635 298395440
|
||||
3907558614 2984992977 69188559
|
||||
3872101950 2286963246 35456664
|
||||
4067911394 2757937075 227055902
|
||||
3358224934 2322419910 137121725
|
||||
2286963246 3054181536 321275112
|
||||
1774875044 2128188274 62837120
|
||||
|
||||
temperature-to-humidity map:
|
||||
3966168141 3406025946 214996780
|
||||
4181164921 3292223571 113802375
|
||||
1493139015 1471031672 367564898
|
||||
1423475871 1838596570 69663144
|
||||
0 479293006 226560784
|
||||
2500785470 2859072453 433151118
|
||||
3197453551 2500785470 96923792
|
||||
758446483 1237739489 233292183
|
||||
991738666 0 278789291
|
||||
3555740534 3884539689 410427607
|
||||
3294377343 2597709262 261363191
|
||||
226560784 705853790 531885699
|
||||
1860703913 305742584 20602508
|
||||
2933936588 3621022726 263516963
|
||||
1881306421 278789291 26953293
|
||||
1270527957 326345092 152947914
|
||||
|
||||
humidity-to-location map:
|
||||
848612454 2250862530 61410922
|
||||
910023376 3689675651 35197452
|
||||
3724873103 3865027106 240221283
|
||||
483883727 3324946924 364728727
|
||||
0 1766978803 483883727
|
||||
1957894300 561533 922927950
|
||||
945220828 2590144784 734802140
|
||||
2880822250 0 561533
|
||||
3447014853 1489120553 277858250
|
||||
2881383783 923489483 565631070
|
||||
3965094386 3724873103 140154003
|
||||
1680022968 2312273452 277871332
|
33
input/day5-eg
Normal file
33
input/day5-eg
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 a new issue