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)