예제 #1
0
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))
예제 #2
0
    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]))
예제 #3
0

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
예제 #4
0
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]
예제 #5
0
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)
예제 #6
0
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)
예제 #7
0
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
예제 #8
0
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))
예제 #9
0
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))