Add days 3, 4 and 5
This commit is contained in:
parent
c2974f8fd2
commit
e9b068912a
6 changed files with 169 additions and 0 deletions
15
Day3/Day3.py
Normal file
15
Day3/Day3.py
Normal file
|
@ -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
|
10
Day3/Day3B.hs
Normal file
10
Day3/Day3B.hs
Normal file
|
@ -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))
|
51
Day4/Day4.py
Normal file
51
Day4/Day4.py
Normal file
|
@ -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)
|
49
Day4/Day4A.hs
Normal file
49
Day4/Day4A.hs
Normal file
|
@ -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
|
23
Day5/Day5A.hs
Normal file
23
Day5/Day5A.hs
Normal file
|
@ -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')
|
21
Day5/Day5B.hs
Normal file
21
Day5/Day5B.hs
Normal file
|
@ -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 a new issue