Add days 3, 4 and 5
This commit is contained in:
parent
c2974f8fd2
commit
e9b068912a
|
@ -0,0 +1,15 @@
|
||||||
|
import numpy
|
||||||
|
import re
|
||||||
|
|
||||||
|
RE = re.compile(r"#(\d+) @ (\d+),(\d+): (\d+)x(\d+)")
|
||||||
|
with open("Day3.in", "r") as f:
|
||||||
|
ROWS = [[int(i) for i in RE.match(line).groups()] for line in f]
|
||||||
|
FABRIC = numpy.zeros((1000, 1000), dtype=numpy.uint8)
|
||||||
|
|
||||||
|
for _, x, y, w, h in ROWS:
|
||||||
|
FABRIC[x:x+w, y:y+h] += 1
|
||||||
|
|
||||||
|
for i, x, y, w, h in ROWS:
|
||||||
|
if (FABRIC[x:x+w, y:y+h] == 1).all():
|
||||||
|
print(i)
|
||||||
|
break
|
|
@ -0,0 +1,10 @@
|
||||||
|
#!/usr/bin/env stack
|
||||||
|
-- stack --resolver lts-12.5 script
|
||||||
|
|
||||||
|
-- WORK IN PROGRESS
|
||||||
|
|
||||||
|
module Day3B where
|
||||||
|
import Text.Regex.TDFA
|
||||||
|
|
||||||
|
main :: IO ()
|
||||||
|
main = print $ ("#1 @ 662,777: 18x27" =~ "#(\\d+) @ (\\d+),(\\d+): (\\d+)x(\\d+)" :: (String, String, String, String, String))
|
|
@ -0,0 +1,51 @@
|
||||||
|
from pprint import pprint
|
||||||
|
from datetime import timedelta
|
||||||
|
import numpy
|
||||||
|
import dateutil.parser
|
||||||
|
import re
|
||||||
|
from collections import defaultdict
|
||||||
|
|
||||||
|
guards_asleep = set()
|
||||||
|
guard_sleep_duration = defaultdict(int)
|
||||||
|
guard_sleep_times = defaultdict(lambda: numpy.zeros(24 * 60, dtype=numpy.int))
|
||||||
|
|
||||||
|
with open("Day4.in", "r") as f:
|
||||||
|
lines = sorted(f.readlines())
|
||||||
|
|
||||||
|
RE_TIME = re.compile(r"\[(.*)\]")
|
||||||
|
RE_SHIFT = re.compile(r".*#(\d+).*")
|
||||||
|
|
||||||
|
current_guard = None
|
||||||
|
last_minute = None
|
||||||
|
for line in lines:
|
||||||
|
time_match = RE_TIME.match(line)
|
||||||
|
|
||||||
|
time = dateutil.parser.parse(time_match.group(1))
|
||||||
|
|
||||||
|
minute = time.time().minute
|
||||||
|
if last_minute is None:
|
||||||
|
last_minute = minute
|
||||||
|
delta = minute - last_minute
|
||||||
|
|
||||||
|
if current_guard in guards_asleep:
|
||||||
|
guard_sleep_duration[current_guard] += delta
|
||||||
|
for i in range(last_minute, minute):
|
||||||
|
guard_sleep_times[current_guard][i] += 1
|
||||||
|
|
||||||
|
last_minute = minute
|
||||||
|
|
||||||
|
match = RE_SHIFT.match(line)
|
||||||
|
if match:
|
||||||
|
current_guard = int(match.group(1))
|
||||||
|
|
||||||
|
if "wakes up" in line:
|
||||||
|
guards_asleep.discard(current_guard)
|
||||||
|
|
||||||
|
if "falls asleep" in line:
|
||||||
|
guards_asleep.add(current_guard)
|
||||||
|
|
||||||
|
a = numpy.array([numpy.insert(value, 0, key) for (key, value) in guard_sleep_times.items()])
|
||||||
|
x, y = numpy.unravel_index(a[:, 1:].argmax(), a[:, 1:].shape)
|
||||||
|
|
||||||
|
guard = a[x, 0]
|
||||||
|
print(guard, y, guard * y)
|
|
@ -0,0 +1,49 @@
|
||||||
|
#!/usr/bin/env stack
|
||||||
|
-- stack --resolver lts-12.5 script
|
||||||
|
|
||||||
|
-- WORK IN PROGRESS
|
||||||
|
|
||||||
|
module Day4A where
|
||||||
|
|
||||||
|
import Data.List (sort)
|
||||||
|
import Data.Maybe (listToMaybe, mapMaybe, fromJust)
|
||||||
|
import Data.Time.Clock
|
||||||
|
import Data.Time.Format
|
||||||
|
import Debug.Trace
|
||||||
|
import Text.Regex.TDFA
|
||||||
|
|
||||||
|
import qualified Data.IntMap as IM
|
||||||
|
import qualified Data.Vector as V
|
||||||
|
|
||||||
|
handleGuardSwitch :: String -> Maybe Int
|
||||||
|
handleGuardSwitch x = unwrap <$> matches
|
||||||
|
where matches = listToMaybe (x =~ "#([0-9]+)")
|
||||||
|
unwrap (_:id:_) = read id
|
||||||
|
|
||||||
|
parseGuardWake :: String -> Maybe Int
|
||||||
|
parseGuardWake x = unwrap <$> listToMaybe (x =~ "(\\d{2})\\] wakes up")
|
||||||
|
where unwrap (_:y:_) = read y
|
||||||
|
|
||||||
|
parseGuardSleep :: String -> Maybe Int
|
||||||
|
parseGuardSleep x = unwrap <$> listToMaybe (x =~ "(\\d{2})\\] falls asleep")
|
||||||
|
where unwrap (_:y:_) = read y
|
||||||
|
|
||||||
|
handle' :: [String] -> Maybe Int -> IM.IntMap V.Vector -> Int -> Bool -> IM.IntMap V.Vector
|
||||||
|
handle' [] _ minutes _ _ = minutes
|
||||||
|
handle' (x:xs) guard minutes minute asleep
|
||||||
|
| Just id <- handleGuardSwitch x = handle' xs (Just id) minutes minute asleep
|
||||||
|
| Just nextMinute <- parseGuardSleep x = handle' xs guard minutes nextMinute True
|
||||||
|
|
||||||
|
| Just nextMinute <- parseGuardWake x =
|
||||||
|
case (nextMinute < minute) of
|
||||||
|
True -> handle' (x:xs) guard minutes (minute + 1) True
|
||||||
|
False -> handle' xs guard minutes minute False
|
||||||
|
|
||||||
|
| otherwise =
|
||||||
|
handle' xs guard minutes (minute + 1) asleep
|
||||||
|
|
||||||
|
handle :: [String] -> IM.IntMap V.Vector
|
||||||
|
handle lines = handle' lines Nothing IM.empty 0 False
|
||||||
|
|
||||||
|
main :: IO ()
|
||||||
|
main = interact $ show . handle . sort . lines
|
|
@ -0,0 +1,23 @@
|
||||||
|
#!/usr/bin/env stack
|
||||||
|
-- stack --resolver lts-12.5 script
|
||||||
|
|
||||||
|
module Day5A where
|
||||||
|
import Data.Char
|
||||||
|
import qualified Data.Foldable as F
|
||||||
|
|
||||||
|
invertCase :: Char -> Char
|
||||||
|
invertCase c
|
||||||
|
| isUpper c = toLower c
|
||||||
|
| otherwise = toUpper c
|
||||||
|
|
||||||
|
calcLength :: String -> String -> Int
|
||||||
|
calcLength ys (x:y:xs)
|
||||||
|
| x == invertCase y = case length ys of
|
||||||
|
0 -> calcLength ys xs
|
||||||
|
_ -> calcLength (tail ys) (head ys:xs)
|
||||||
|
| otherwise = calcLength (x:ys) (y:xs)
|
||||||
|
calcLength ys [x] = calcLength (x:ys) []
|
||||||
|
calcLength ys [] = length ys
|
||||||
|
|
||||||
|
main :: IO ()
|
||||||
|
main = interact $ show . calcLength "" . filter (/= '\n')
|
|
@ -0,0 +1,21 @@
|
||||||
|
#!/usr/bin/env stack
|
||||||
|
-- stack --resolver lts-12.5 script
|
||||||
|
|
||||||
|
module Day5B where
|
||||||
|
import Day5A (calcLength)
|
||||||
|
import Data.Char
|
||||||
|
|
||||||
|
alphabet :: String
|
||||||
|
alphabet = "abcdefghijklmnopqrstuvwxyz"
|
||||||
|
|
||||||
|
caseNEq :: Char -> Char -> Bool
|
||||||
|
caseNEq x y = toLower x /= toLower y
|
||||||
|
|
||||||
|
mapper :: String -> Char -> Int
|
||||||
|
mapper s x = calcLength "" $ filter (caseNEq x) s
|
||||||
|
|
||||||
|
findShortest :: String -> Int
|
||||||
|
findShortest s = minimum $ map (mapper s) alphabet
|
||||||
|
|
||||||
|
main :: IO ()
|
||||||
|
main = interact $ show . findShortest . filter (/='\n')
|
Loading…
Reference in New Issue