mirror of
https://github.com/mx42/adventofcode.git
synced 2026-01-14 05:49:52 +01:00
Add 2020 day 13
This commit is contained in:
2
haskellAoC/inputs/2020/13
Normal file
2
haskellAoC/inputs/2020/13
Normal file
@@ -0,0 +1,2 @@
|
||||
1000510
|
||||
19,x,x,x,x,x,x,x,x,41,x,x,x,x,x,x,x,x,x,523,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,17,13,x,x,x,x,x,x,x,x,x,x,29,x,853,x,x,x,x,x,37,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,23
|
||||
2
haskellAoC/inputs/2020/13_test
Normal file
2
haskellAoC/inputs/2020/13_test
Normal file
@@ -0,0 +1,2 @@
|
||||
939
|
||||
7,13,x,x,59,x,31,19
|
||||
30
haskellAoC/src/Y2020/Day13.hs
Normal file
30
haskellAoC/src/Y2020/Day13.hs
Normal file
@@ -0,0 +1,30 @@
|
||||
module Y2020.Day13 (y20day13) where
|
||||
|
||||
import Data.List
|
||||
import Data.List.Split
|
||||
import Data.Function (on)
|
||||
|
||||
timeToWait :: Int -> Int -> Int
|
||||
timeToWait mytime bustime = time_to_next_pass
|
||||
where time_since_last_pass = mytime `mod` bustime
|
||||
time_to_next_pass = bustime - time_since_last_pass
|
||||
|
||||
-- timestamp, step -> offset, busid -> timestamp, step
|
||||
lowestTS :: (Int, Int) -> (Int, Int) -> (Int, Int)
|
||||
lowestTS (0, 0) (_, busid) = (busid, busid)
|
||||
lowestTS (curTS, step) (offset, busid)
|
||||
| (curTS + offset) `mod` busid == 0 = (curTS, step * busid)
|
||||
| otherwise = lowestTS (curTS + step, step) (offset, busid)
|
||||
|
||||
y20day13 :: [String] -> (String, String)
|
||||
y20day13 [arrival', busids'] = (part1, part2)
|
||||
where part1 = show $ next_bus_id * next_bus_time
|
||||
part2 = show $ timestamp
|
||||
|
||||
arrival = read arrival' :: Int
|
||||
(next_bus_id, next_bus_time) = minimumBy (compare `on` snd) $ map (\busid -> (busid, timeToWait arrival busid)) busids :: (Int, Int)
|
||||
|
||||
busids = map read $ filter (/="x") $ splitOn "," busids' :: [Int]
|
||||
|
||||
busIdWithOffset = map (\(a, b) -> (a, read b :: Int)) $ filter ((/= "x") . snd) $ zip (iterate (+1) 0) $ splitOn "," busids'
|
||||
timestamp = foldl lowestTS (0, 0) busIdWithOffset
|
||||
@@ -12,6 +12,7 @@ import Y2020.Day09
|
||||
import Y2020.Day10
|
||||
import Y2020.Day11
|
||||
import Y2020.Day12
|
||||
import Y2020.Day13
|
||||
|
||||
year2020 :: String -> [String] -> (String, String)
|
||||
year2020 "01" = y20day01
|
||||
@@ -26,3 +27,4 @@ year2020 "09" = y20day09
|
||||
year2020 "10" = y20day10
|
||||
year2020 "11" = y20day11
|
||||
year2020 "12" = y20day12
|
||||
year2020 "13" = y20day13
|
||||
|
||||
Reference in New Issue
Block a user