diff --git a/Day3/Day3.py b/Day3/Day3.py new file mode 100644 index 0000000..529540e --- /dev/null +++ b/Day3/Day3.py @@ -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 diff --git a/Day3/Day3B.hs b/Day3/Day3B.hs new file mode 100644 index 0000000..e46a375 --- /dev/null +++ b/Day3/Day3B.hs @@ -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)) diff --git a/Day4/Day4.py b/Day4/Day4.py new file mode 100644 index 0000000..66f3d3b --- /dev/null +++ b/Day4/Day4.py @@ -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) diff --git a/Day4/Day4A.hs b/Day4/Day4A.hs new file mode 100644 index 0000000..f6978d1 --- /dev/null +++ b/Day4/Day4A.hs @@ -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 diff --git a/Day5/Day5A.hs b/Day5/Day5A.hs new file mode 100644 index 0000000..420a910 --- /dev/null +++ b/Day5/Day5A.hs @@ -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') diff --git a/Day5/Day5B.hs b/Day5/Day5B.hs new file mode 100644 index 0000000..84f3909 --- /dev/null +++ b/Day5/Day5B.hs @@ -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')