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) |
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) |
""" 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) |
""" 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) |