import sys sys.path.append('..') from adventHelper import FileReader def formatFreq(freq): if freq[0] == '+': return int(freq[1:]) else: return -int(freq[1:]) fr = FileReader(1, 2) freqSet = {0} frequency = 0 complete = False while not complete: for freq in fr.getlines(): frequency += formatFreq(freq) if frequency in freqSet: complete = True break freqSet.add(frequency) print("Final frequency: {}".format(frequency))
completed = False idxRemove = None while not completed: for i, c in enumerate(data): try: if abs(ord(c) - ord(data[i+1])) == 32: idxRemove = i break except: completed = True if not completed: data.pop(i+1) data.pop(i) return data def removeLetter(data, letter): print(letter) idxs = [] for i, c in enumerate(data): if c.lower() == letter: idxs.append(i) for i in reversed(idxs): data.pop(i) return data fr = FileReader(5, 2) data = react(list(fr.getfirstline().strip())) print(min([len(react(removeLetter(list(data), c))) for c in string.ascii_lowercase]))
def getId(lineSplit): return lineSplit[0][1:] def dfs(fabric, x, y): h, w = idToHW[squareToId[(x, y)][0]] for i in range(x, x + h): for j in range(y, y + w): if fabric[i][j] != 1: return False return True fr = FileReader(3, 2) fabric = [[0 for i in range(1001)] for i in range(1001)] squareToId = defaultdict(list) idToHW = {} for lineSplit in map(lambda x: x.split(), fr.getlines()): widthInterval = (getLeftInches(lineSplit), getLeftInches(lineSplit) + getWidth(lineSplit)) heightInterval = (getTopInches(lineSplit), getTopInches(lineSplit) + getHeight(lineSplit)) idToHW[getId(lineSplit)] = (getHeight(lineSplit), getWidth(lineSplit)) for i in range(heightInterval[0], heightInterval[1]): for j in range(widthInterval[0], widthInterval[1]): squareToId[(i, j)].append(getId(lineSplit)) fabric[i][j] += 1
sys.path.append('..') from adventHelper import FileReader from collections import defaultdict from operator import itemgetter def format(line): line = line.split() return line[1], line[7] def time(n): return ord(n) - 4 fr = FileReader(7, 2) # Get graph g = defaultdict(list) gT = defaultdict(list) for pre, step in map(lambda x: format(x), fr.getlines()): g[pre].append(step) gT[step].append(pre) completed = set() q = [] # Find starting Node nodes = {n for n in g.keys()} for nodeList in g.values(): [nodes.remove(n) for n in nodeList if n in nodes]
def format(line): date = re.compile('\d{4}-\d{2}-\d{2}').search(line).group(0) hour = int(re.compile('\d{2}(?=:\d{2})').search(line).group(0)) minute = int(re.compile('(?<=\d{2}:)\d{2}').search(line).group(0)) typeEntry = '' if 'wakes' in line: typeEntry = 'awake' elif 'falls' in line: typeEntry = 'asleep' else: typeEntry = int(re.compile('(?<=#)\d*').search(line).group(0)) return date, hour, minute, typeEntry fr = FileReader(4, 2) lines = sorted([l for l in fr.getlines()]) guardAsleepMin = defaultdict(lambda: defaultdict(int)) guardAsleepCount = defaultdict(int) for (date, hour, minute, typeEntry) in map(lambda x: format(x), lines): if type(typeEntry) == int: guard = typeEntry elif typeEntry == 'asleep': guardAsleepMin[guard][minute] += 1 asleepAt = minute + 1 elif typeEntry == 'awake': for i in range(asleepAt, minute): guardAsleepMin[guard][i] += 1 maxMinutes = (0, None, None)
import sys sys.path.append('..') from adventHelper import FileReader def similar(l1, l2): for i in range(len(l1)): if l1[:i]+l1[i+1:] == l2[:i]+l2[i+1:]: return True, l1[:i]+l1[i+1:] return False, None fr = FileReader(2, 2) lines = [l.strip() for l in fr.getlines()] found = False for l1 in lines: if found: break for l2 in lines: if l1 == l2: continue sim, val = similar(l1, l2) if sim: found = True break print("Common string: " + val)
import sys sys.path.append('..') from adventHelper import FileReader from collections import defaultdict def format(line): line = line.strip().replace(',','').split() return (int(line[0]), int(line[1])) def manhattan(pCoord, qCoord): return sum([abs(p - q) for p, q in zip(pCoord, qCoord)]) fr = FileReader(6, 1) coordinates = list(map(lambda x:format(x), fr.getlines())) maxX = max(coordinates, key=lambda x:x[0])[0] maxY = max(coordinates, key=lambda x:x[1])[1] def getMinDistPoint(i, j): minDist, minDist2, point = None, None, None for curr, (y, x) in enumerate(coordinates): dist = manhattan((i,j), (x,y)) try: if dist <= minDist: point = curr+1 minDist2 = minDist minDist = dist except: point = curr+1
import sys sys.path.append('..') from adventHelper import FileReader fr = FileReader(2, 1) doubleCount, tripleCount = 0, 0 for line in fr.getlines(): doubleFound, tripleFound = False, False for char in set(line): if doubleFound and tripleFound: break if not doubleFound and line.count(char) == 2: doubleCount += 1 doubleFound = True elif not tripleFound and line.count(char) == 3: tripleCount += 1 tripleFound = True print("Checksum: {}".format(doubleCount * tripleCount))
import sys sys.path.append('..') from adventHelper import FileReader fr = FileReader(5, 1) data = list(fr.getfirstline().strip()) completed = False idxRemove = None while not completed: for i, c1 in enumerate(data): try: if abs(ord(c1) - ord(data[i+1])) == 32: idxRemove = i break except: completed = True if not completed: data.pop(i+1) data.pop(i) print(len(data))