@@ -0,0 +1,38 @@ | |||
from collections import defaultdict | |||
lines = open('04in.txt').read().split('\n') | |||
lines.sort() | |||
def parseTime(line): | |||
words = line.split() | |||
date, time = words[0][1:], words[1][:-1] | |||
return int(time.split(':')[1]) | |||
C = defaultdict(int) | |||
CM = defaultdict(int) | |||
guard = None | |||
asleep = None | |||
for line in lines: | |||
if line: | |||
time = parseTime(line) | |||
if 'begins shift' in line: | |||
guard = int(line.split()[3][1:]) | |||
asleep = None | |||
elif 'falls asleep' in line: | |||
asleep = time | |||
elif 'wakes up' in line: | |||
for t in range(asleep, time): | |||
CM[(guard, t)] += 1 | |||
C[guard] += 1 | |||
def argmax(d): | |||
best = None | |||
for k,v in d.items(): | |||
print("{}: {}".format(k,v)) | |||
if best is None or v > d[best]: | |||
best = k | |||
return best | |||
best_guard, best_min = argmax(CM) | |||
print (best_guard, best_min) | |||
print (best_guard * best_min) |
@@ -0,0 +1,87 @@ | |||
import re | |||
def main(lines): | |||
""" Sort the input by date/time, then find the best guard/minute combination | |||
Note: the example answer is WRONG! | |||
""" | |||
# [1518-09-25 00:28] falls asleep | |||
# Don't actually care about the year, since it's always the same | |||
# grp1 grp2 grp3 grp4 grp5 | |||
pattern = re.compile("\[[0-9]+-([0-9]+)-([0-9]+) ([0-9]+):([0-9]+)\] (.+)") | |||
guardptn = re.compile("Guard #([0-9]+) begins shift") | |||
entries = [] | |||
guards = {} | |||
for line in lines: | |||
m = pattern.match(line) | |||
g = guardptn.match(m.group(5)) | |||
guard = -1 if g == None else int(g.group(1)) | |||
# guard # month # day # hour # minute # activity | |||
entries.append([guard, int(m.group(1)), int(m.group(2)), int(m.group(3)), int(m.group(4)), m.group(5)]) | |||
entries.sort(key = lambda x: (x[1], x[2], -x[3], x[4])) | |||
for i in range(1, len(entries)): | |||
if entries[i][0] == -1: | |||
entries[i][0] = entries[i-1][0] | |||
with open("04out.txt", "w") as ofile: | |||
for entry in entries: | |||
ofile.write("{}\n".format(entry)) | |||
# so entries is | |||
# [0, 1, 2, 3, 4, 5] | |||
# #guard # month #day #hour #minute #activity | |||
stt = -1 | |||
end = -1 | |||
for i in range(1,len(entries)): | |||
sleeping = False | |||
cguard = entries[i][0] | |||
#print(cguard) | |||
if cguard == entries[i-1][0]: | |||
if entries[i][5] == "falls asleep": | |||
stt = entries[i][4] | |||
#print("{} fell asleep at {}".format(cguard, stt)) | |||
sleeping = True | |||
elif entries[i][5] == "wakes up": | |||
end = entries[i][4] | |||
sleeping = False | |||
#print("{} woke up at {} (fell asleep at {})".format(cguard, end, stt)) | |||
for q in range(stt, end): | |||
if cguard not in guards.keys(): | |||
guards[cguard] = {} | |||
guards[cguard][q] = 1 | |||
else: | |||
if q not in guards[cguard].keys(): | |||
guards[cguard][q] = 1 | |||
else: | |||
guards[cguard][q] = guards[cguard][q] + 1 | |||
else: | |||
stt = -1 | |||
end = -1 | |||
gslp = {} | |||
for k,v in guards.items(): | |||
maxsleeps = 0 | |||
maxmin = 0 | |||
for minute, sleeps in v.items(): | |||
if sleeps > maxsleeps: | |||
maxsleeps = sleeps | |||
maxmin = minute | |||
print("{} slept the most times ({}) at minute {}".format(k, maxsleeps, maxmin)) | |||
gslp[k] = [maxmin, maxsleeps] | |||
tguard, tmin, tsleeps = 0, 0, 0 | |||
for k,v in gslp.items(): | |||
if v[1] > tsleeps: | |||
tguard, tmin, tsleeps = k, v[0], v[1] | |||
print("Guard {} slept the most times ({}) at minute {}. ID * minute = {}!".format(tguard, tsleeps, tmin, tguard*tmin)) | |||
def add_sleeping(dct, mins): | |||
pass | |||
if __name__ == "__main__": | |||
lines = [] | |||
with open("04in.txt","r") as f: | |||
for line in f: | |||
lines.append(line.strip()) | |||
main(lines) |
@@ -0,0 +1,35 @@ | |||
""" Advent of Code Day 5a | |||
""" | |||
def comp(s1,s2): | |||
if (s1 != s2) and s1.lower() == s2.lower(): | |||
return True | |||
return False | |||
def main(polymer): | |||
opoly = polymer | |||
do_it = True | |||
while do_it: | |||
olen = len(polymer) | |||
print(olen) | |||
for i in range(len(polymer)-1): | |||
if comp(polymer[i], polymer[i+1]): | |||
if i == 0: # the first two are a match | |||
polymer = polymer[2:] | |||
elif i == (olen - 2): # the last two are a match | |||
polymer = polymer[:-2] | |||
else: # the match is in the middle | |||
polymer = polymer[:i] + polymer[i+2:] | |||
break | |||
if olen == len(polymer): # we didn't reduce polymer's length at all | |||
do_it = False # no more matches, stop looping | |||
print(len(polymer)) | |||
if __name__ == "__main__": | |||
inline = "" | |||
with open("05in.txt","r") as ofile: | |||
inline = ofile.read().strip() | |||
main(inline) |
@@ -0,0 +1,50 @@ | |||
""" Advent of Code Day 5b | |||
""" | |||
from collections import defaultdict | |||
def comp(s1,s2): | |||
if (s1 != s2) and s1.lower() == s2.lower(): | |||
return True | |||
return False | |||
def main(polymer): | |||
opoly = polymer | |||
lens = defaultdict(int) | |||
alphabet = "abcdefghijklmnopqrstuvwxyz" | |||
for char in alphabet: | |||
polymer = "".join(opoly.split(char)) | |||
polymer = "".join(polymer.split(char.upper())) | |||
do_it = True | |||
while do_it: | |||
olen = len(polymer) | |||
# print(olen) | |||
for acter in alphabet: | |||
if acter != char: | |||
polymer = "".join(polymer.split("{}{}".format(acter, acter.upper()))) | |||
polymer = "".join(polymer.split("{}{}".format(acter.upper(), acter))) | |||
print("with {}, after {}, len(polymer) is {}".format(char, acter, len(polymer))) | |||
# for i in range(len(polymer)-1): | |||
# if comp(polymer[i], polymer[i+1]): | |||
# if i == 0: # the first two are a match | |||
# polymer = polymer[2:] | |||
# elif i == (olen - 2): # the last two are a match | |||
# polymer = polymer[:-2] | |||
# else: # the match is in the middle | |||
# polymer = polymer[:i] + polymer[i+2:] | |||
# break | |||
if olen == len(polymer): # we didn't reduce polymer's length at all | |||
do_it = False # no more matches, stop looping | |||
lens[char] = len(polymer) | |||
with open("05out.txt","a") as ofile: | |||
ofile.write("{}: {}\n".format(char, len(polymer))) | |||
for k,v in lens.items(): | |||
print("{}: {}".format(k,v)) | |||
if __name__ == "__main__": | |||
inline = "" | |||
with open("05in.txt","r") as ofile: | |||
inline = ofile.read().strip() | |||
main(inline) |