diff options
Diffstat (limited to 'solutions/py')
| -rw-r--r-- | solutions/py/01-1.py | 11 | ||||
| -rw-r--r-- | solutions/py/01-2.py | 16 | ||||
| -rw-r--r-- | solutions/py/02-1.py | 19 | ||||
| -rw-r--r-- | solutions/py/02-2.py | 28 | ||||
| -rw-r--r-- | solutions/py/03-1.py | 37 | ||||
| -rw-r--r-- | solutions/py/03-2.py | 41 | ||||
| -rw-r--r-- | solutions/py/04-1.py | 30 | ||||
| -rw-r--r-- | solutions/py/04-2.py | 31 | ||||
| -rw-r--r-- | solutions/py/05.py | 44 | ||||
| -rw-r--r-- | solutions/py/06.py | 75 | ||||
| -rw-r--r-- | solutions/py/08.py | 28 | ||||
| -rw-r--r-- | solutions/py/d01.py | 19 | ||||
| -rw-r--r-- | solutions/py/d02.py | 41 | ||||
| -rw-r--r-- | solutions/py/d03.py | 75 | ||||
| -rw-r--r-- | solutions/py/d04.py | 45 | ||||
| -rw-r--r-- | solutions/py/d05.py | 26 | ||||
| -rw-r--r-- | solutions/py/d06.py | 78 | ||||
| -rw-r--r-- | solutions/py/d07.py (renamed from solutions/py/07.py) | 47 | ||||
| -rw-r--r-- | solutions/py/d08.py | 31 | ||||
| -rw-r--r-- | solutions/py/main.py | 15 |
20 files changed, 361 insertions, 376 deletions
diff --git a/solutions/py/01-1.py b/solutions/py/01-1.py deleted file mode 100644 index 598caf4..0000000 --- a/solutions/py/01-1.py +++ /dev/null @@ -1,11 +0,0 @@ -import math -import sys - -s = 0 -for line in sys.stdin: - mass = int(line) - if mass == 0: - break - fuel = math.floor(mass / 3) - 2 - s += fuel -print(s) diff --git a/solutions/py/01-2.py b/solutions/py/01-2.py deleted file mode 100644 index 0017a8b..0000000 --- a/solutions/py/01-2.py +++ /dev/null @@ -1,16 +0,0 @@ -import math -import sys - -def get_fuel(mass): - fuel = math.floor(mass / 3) - 2 - if fuel <= 0: - return 0 - return fuel + get_fuel(fuel) - -fuels = [] -for line in sys.stdin: - if line.rstrip() == "": - break - fuels.append(get_fuel(int(line))) - -print(sum(fuels)) diff --git a/solutions/py/02-1.py b/solutions/py/02-1.py deleted file mode 100644 index 47ab15f..0000000 --- a/solutions/py/02-1.py +++ /dev/null @@ -1,19 +0,0 @@ -import sys - -program = [int(x) for x in input().split(",")] - -memory = program.copy() -memory[1] = 12 -memory[2] = 2 - -pointer = 0 -while True: - if memory[pointer] == 99: - break - elif memory[pointer] == 1: - memory[memory[pointer+3]] = memory[memory[pointer+1]] + memory[memory[pointer+2]] - elif memory[pointer] == 2: - memory[memory[pointer+3]] = memory[memory[pointer+1]] * memory[memory[pointer+2]] - pointer += 4 -print(memory[0]) - diff --git a/solutions/py/02-2.py b/solutions/py/02-2.py deleted file mode 100644 index cc6402e..0000000 --- a/solutions/py/02-2.py +++ /dev/null @@ -1,28 +0,0 @@ -import sys -import time - -program = [int(x) for x in input().split(" ")] - -start = time.time() - -for n in range(100): - for v in range(100): - memory = program.copy() - memory[1] = n - memory[2] = v - - pointer = 0 - while True: - if memory[pointer] == 99: - break - elif memory[pointer] == 1: - memory[memory[pointer+3]] = memory[memory[pointer+1]] + memory[memory[pointer+2]] - elif memory[pointer] == 2: - memory[memory[pointer+3]] = memory[memory[pointer+1]] * memory[memory[pointer+2]] - pointer += 4 - # print(n, v, memory[0]) - if memory[0] == 19690720: - print(n, v) - print("took " + str(time.time() - start)) - sys.exit() - diff --git a/solutions/py/03-1.py b/solutions/py/03-1.py deleted file mode 100644 index 3f26a84..0000000 --- a/solutions/py/03-1.py +++ /dev/null @@ -1,37 +0,0 @@ -import math - -def intersection(l1, l2): - return [value for value in l2 if value in l1] - -def man_dist(point): - return abs(point[0]) + abs(point[1]) - -wire1 = [] -wire2 = [] -for wire in (wire1, wire2): - x = 0 - y = 0 - dx = 0 - dy = 0 - for move in input().split(","): - if move[0] == "D": - dx = 0 - dy = -1 - elif move[0] == "U": - dx = 0 - dy = 1 - elif move[0] == "R": - dx = 1 - dy = 0 - elif move[0] == "L": - dx = -1 - dy = 0 - for i in range(int(move[1:])): - x += dx - y += dy - wire.append((x, y)) -points = intersection(wire1, wire2) -dist = man_dist(points[0]) -for point in points[1:]: - dist = min(dist, man_dist(point)) -print(dist) diff --git a/solutions/py/03-2.py b/solutions/py/03-2.py deleted file mode 100644 index 0bb1efc..0000000 --- a/solutions/py/03-2.py +++ /dev/null @@ -1,41 +0,0 @@ -import math - -def intersection(l1, l2): - return [value for value in l2 if value in l1] - -def man_dist(point): - return abs(point[0]) + abs(point[1]) - -wire1 = {} -wire2 = {} -# wire {(x,y) : dist} -for wire in (wire1, wire2): - x = 0 - y = 0 - dx = 0 - dy = 0 - steps = 0 - for move in input().split(","): - if move[0] == "D": - dx = 0 - dy = -1 - elif move[0] == "U": - dx = 0 - dy = 1 - elif move[0] == "R": - dx = 1 - dy = 0 - elif move[0] == "L": - dx = -1 - dy = 0 - for i in range(int(move[1:])): - x += dx - y += dy - steps += 1 - wire[(x, y)] = steps - -points = intersection(list(wire1.keys()), list(wire2.keys())) -length = wire1[points[0]] + wire2[points[0]] -for point in points[1:]: - length = min(length, wire1[point] + wire2[point]) -print(length) diff --git a/solutions/py/04-1.py b/solutions/py/04-1.py deleted file mode 100644 index 23096ec..0000000 --- a/solutions/py/04-1.py +++ /dev/null @@ -1,30 +0,0 @@ -from collections import Counter - -def containsDouble(num): - s = str(num) - amounts = [] - for n in (0,1,2,3,4,5,6,7,8,9): - amounts.append(s.count(str(n))) - c = Counter(amounts) - return c[0] + c[1] < 10 - -def isIncreasing(num): - s = str(num) - n = int(s[0]) - for sp in s[1:]: - if int(sp) < n: - return False - n = int(sp) - return True - -if __name__ == "__main__": - amount = 0 - for n in range(357253, 892942 + 1): - if containsDouble(n): - if isIncreasing(n): - print(n) - amount += 1 - if n % 10000 == 0: - pass - # print(n) - print(amount) diff --git a/solutions/py/04-2.py b/solutions/py/04-2.py deleted file mode 100644 index 582df1a..0000000 --- a/solutions/py/04-2.py +++ /dev/null @@ -1,31 +0,0 @@ -from collections import Counter - -def containsDouble(num): - s = str(num) - amounts = [] - for n in (0,1,2,3,4,5,6,7,8,9): - amounts.append(s.count(str(n))) - c = Counter(amounts) - if c[0] + c[1] < 10: - return c[2] >= 1 - -def isIncreasing(num): - s = str(num) - n = int(s[0]) - for sp in s[1:]: - if int(sp) < n: - return False - n = int(sp) - return True - -if __name__ == "__main__": - amount = 0 - for n in range(357253, 892942 + 1): - if containsDouble(n): - if isIncreasing(n): - print(n) - amount += 1 - if n % 10000 == 0: - pass - # print(n) - print(amount) diff --git a/solutions/py/05.py b/solutions/py/05.py deleted file mode 100644 index e9eb6c1..0000000 --- a/solutions/py/05.py +++ /dev/null @@ -1,44 +0,0 @@ -import intcode -import itertools -import queue -import sys - -def pt1(program): - c = intcode.Computer(program) - c.input = 1 - output = [] - while c.memory[c.pointer] != 99: - c.step() - if c.output != None: - output.append(c.output) - c.output = None - return output - -def pt2(program): - c = intcode.Computer(program) - c.input = 5 - output = [] - while c.memory[c.pointer] != 99: - c.step() - if c.output != None: - output.append(c.output) - c.output = None - return output - -if __name__ == "__main__": - f = open("../input/05", "r") - program = [int(x) for x in f.readline().split(",")] - - import cProfile - import timeit - - print("PART 1") - print(timeit.timeit('pt1(program)', globals=globals(), number=1000), "ms") - cProfile.run("pt1(program)") - - print("PART 2") - print(timeit.timeit('pt2(program)', globals=globals(), number=1000), "ms") - cProfile.run("pt2(program)") - - print(1, pt1(program)) - print(2, pt2(program)) diff --git a/solutions/py/06.py b/solutions/py/06.py deleted file mode 100644 index 2ca5f26..0000000 --- a/solutions/py/06.py +++ /dev/null @@ -1,75 +0,0 @@ -from typing import Iterable -import sys - -class Tree(object): - # https://stackoverflow.com/a/28015122 - def __init__(self, name='root', children=None): - self.name = name - self.children = [] - self.parent = None - if children is not None: - for child in children: - self.add_child(child) - def add_child(self, node): - self.children.append(node) - node.parent = self - - def __eq__(self, other): - if isinstance(other, Tree): - return self.name == other.name - return False - def parents(self): - return [self.parent] + self.parent.parents() if self.parent != None\ - else [] - -lines = open("../input/06", "r").readlines() - -trees = {} -seen = set() # seen trees. contains only IDs -leafs = {} - -for orbit in lines: - orbit = orbit.rstrip().split(")") - #print(orbit) - if not orbit[0] in seen: - trees[orbit[0]] = Tree(orbit[0]) - seen.add(orbit[0]) - -# hook up each child to its parent (since every parent now exists) -for orbit in lines: - orbit = orbit.rstrip().split(")") - if orbit[1] in seen: - trees[orbit[0]].add_child(trees[orbit[1]]) - else: - leafs[orbit[1]] = Tree(orbit[1]) - trees[orbit[0]].add_child(leafs[orbit[1]]) -for k in trees: - pass - #print(trees[k], trees[k].children) - -trees.update(leafs) - -sum_depths = 0 -depth = 0 -depths = {} -def count_children(tree, depth): - global sum_depths # fusk-rekursion? ville bara att det skulle fungera - sum_depths += depth - depths[tree.name] = depth - for child in tree.children: - count_children(child, depth+1) -count_children(trees["COM"], 0) -print("1:", sum_depths) - -# find common parent and distance to it -src_parents = trees["YOU"].parent.parents() -tar_parents = trees["SAN"].parent.parents() -src_dist = 0 -for src_parent in src_parents: - src_dist += 1 - tar_dist = 0 - for tar_parent in tar_parents: - tar_dist += 1 - if src_parent == tar_parent: - print("2:", src_parent.name, src_dist, tar_dist, src_dist + tar_dist) - sys.exit() diff --git a/solutions/py/08.py b/solutions/py/08.py deleted file mode 100644 index c57cb4c..0000000 --- a/solutions/py/08.py +++ /dev/null @@ -1,28 +0,0 @@ -def count(layer, num): - return sum([row.count(num) for row in layer]) - -f = open("../input/08", "r").readline() -img = [] -least_zeroes = 150 # 25*6 -n = 0 - -for l in range(100): - #print("l", l) - layer = [[int(f[l*25*6 + y*25 + x]) for x in range(25)] for y in range(6)] - if count(layer, 0) < least_zeroes: - least_zeroes = count(layer, 0) - n = count(layer, 1) * count(layer, 2) - img.append(layer) -print(1, n) - -result = img[0] -for layer in img[1:]: - for x in range(25): - for y in range(6): - if result[y][x] == 2: - result[y][x] = layer[y][x] -print(2) -for row in result: - for c in row: - print(('\u2588' if c == 1 else ' '), end='') - print("") diff --git a/solutions/py/d01.py b/solutions/py/d01.py new file mode 100644 index 0000000..d5197ab --- /dev/null +++ b/solutions/py/d01.py @@ -0,0 +1,19 @@ +import math +import sys + +def get_fuel(mass): + fuel = math.floor(mass / 3) - 2 + return 0 if fuel <= 0 else fuel + get_fuel(fuel) + +def pt1(_in): + s = 0 + for line in _in: + mass = int(line) + if mass == 0: + break + fuel = math.floor(mass / 3) - 2 + s += fuel + return s + +def pt2(input): + return sum([get_fuel(int(line)) for line in input]) diff --git a/solutions/py/d02.py b/solutions/py/d02.py new file mode 100644 index 0000000..15f0fea --- /dev/null +++ b/solutions/py/d02.py @@ -0,0 +1,41 @@ +import sys + +def pt1(input): + program = [int(x) for x in input[0].split(",")] + + memory = program.copy() + memory[1] = 12 + memory[2] = 2 + + pointer = 0 + while True: + if memory[pointer] == 99: + break + elif memory[pointer] == 1: + memory[memory[pointer+3]] = memory[memory[pointer+1]] + memory[memory[pointer+2]] + elif memory[pointer] == 2: + memory[memory[pointer+3]] = memory[memory[pointer+1]] * memory[memory[pointer+2]] + pointer += 4 + return memory[0] + +def pt2(input): + program = [int(x) for x in input[0].split(",")] + + for n in range(100): + for v in range(100): + memory = program.copy() + memory[1] = n + memory[2] = v + + pointer = 0 + while True: + if memory[pointer] == 99: + break + elif memory[pointer] == 1: + memory[memory[pointer+3]] = memory[memory[pointer+1]] + memory[memory[pointer+2]] + elif memory[pointer] == 2: + memory[memory[pointer+3]] = memory[memory[pointer+1]] * memory[memory[pointer+2]] + pointer += 4 + if memory[0] == 19690720: + return (n, v) + diff --git a/solutions/py/d03.py b/solutions/py/d03.py new file mode 100644 index 0000000..aec6d4a --- /dev/null +++ b/solutions/py/d03.py @@ -0,0 +1,75 @@ +import math + +def intersection(l1, l2): + l1 = set(l1) + l2 = set(l2) + return [value for value in l2 if value in l1] + +def man_dist(point): + return abs(point[0]) + abs(point[1]) + +def pt1(input): + wire1 = [] + wire2 = [] + for wire, moves in zip((wire1, wire2), (input[0], input[1])): + x = 0 + y = 0 + dx = 0 + dy = 0 + for move in moves.split(","): + if move[0] == "D": + dx = 0 + dy = -1 + elif move[0] == "U": + dx = 0 + dy = 1 + elif move[0] == "R": + dx = 1 + dy = 0 + elif move[0] == "L": + dx = -1 + dy = 0 + for i in range(int(move[1:])): + x += dx + y += dy + wire.append((x, y)) + points = intersection(wire1, wire2) + dist = man_dist(points[0]) + for point in points[1:]: + dist = min(dist, man_dist(point)) + return dist + +def pt2(input): + wire1 = {} + wire2 = {} + # wire {(x,y) : dist} + for wire, moves in zip((wire1, wire2), (input[0], input[1])): + x = 0 + y = 0 + dx = 0 + dy = 0 + steps = 0 + for move in moves.split(","): + if move[0] == "D": + dx = 0 + dy = -1 + elif move[0] == "U": + dx = 0 + dy = 1 + elif move[0] == "R": + dx = 1 + dy = 0 + elif move[0] == "L": + dx = -1 + dy = 0 + for i in range(int(move[1:])): + x += dx + y += dy + steps += 1 + wire[(x, y)] = steps + + points = intersection(list(wire1.keys()), list(wire2.keys())) + length = wire1[points[0]] + wire2[points[0]] + for point in points[1:]: + length = min(length, wire1[point] + wire2[point]) + return length diff --git a/solutions/py/d04.py b/solutions/py/d04.py new file mode 100644 index 0000000..3115f2a --- /dev/null +++ b/solutions/py/d04.py @@ -0,0 +1,45 @@ +from collections import Counter + +def isIncreasing(num): + s = str(num) + n = int(s[0]) + for sp in s[1:]: + if int(sp) < n: + return False + n = int(sp) + return True + +def pt1(input): + return + def containsDouble(num): + s = str(num) + amounts = [] + for n in (0,1,2,3,4,5,6,7,8,9): + amounts.append(s.count(str(n))) + c = Counter(amounts) + return c[0] + c[1] < 10 + + amount = 0 + for n in range(357253, 892942 + 1): + if containsDouble(n): + if isIncreasing(n): + amount += 1 + return amount + +def pt2(input): + return + def containsDouble(num): + s = str(num) + amounts = [] + for n in (0,1,2,3,4,5,6,7,8,9): + amounts.append(s.count(str(n))) + c = Counter(amounts) + if c[0] + c[1] < 10: + return c[2] >= 1 + amount = 0 + for n in range(357253, 892942 + 1): + if containsDouble(n): + if isIncreasing(n): + amount += 1 + return amount + diff --git a/solutions/py/d05.py b/solutions/py/d05.py new file mode 100644 index 0000000..446bcd6 --- /dev/null +++ b/solutions/py/d05.py @@ -0,0 +1,26 @@ +import intcode + +def pt1(input): + program = [int(x) for x in input[0].split(",")] + c = intcode.Computer(program) + c.input = 1 + output = [] + while c.memory[c.pointer] != 99: + c.step() + if c.output != None: + output.append(c.output) + c.output = None + return output + +def pt2(input): + program = [int(x) for x in input[0].split(",")] + c = intcode.Computer(program) + c.input = 5 + output = [] + while c.memory[c.pointer] != 99: + c.step() + if c.output != None: + output.append(c.output) + c.output = None + return output + diff --git a/solutions/py/d06.py b/solutions/py/d06.py new file mode 100644 index 0000000..b6b9ef7 --- /dev/null +++ b/solutions/py/d06.py @@ -0,0 +1,78 @@ +from typing import Iterable +import sys + +class Tree(object): + # https://stackoverflow.com/a/28015122 + def __init__(self, name='root', children=None): + self.name = name + self.children = [] + self.parent = None + if children is not None: + for child in children: + self.add_child(child) + def add_child(self, node): + self.children.append(node) + node.parent = self + + def __eq__(self, other): + if isinstance(other, Tree): + return self.name == other.name + return False + def parents(self): + return [self.parent] + self.parent.parents() if self.parent != None\ + else [] + +def gen_tree(input): + trees = {} + seen = set() # seen trees. contains only IDs + leafs = {} + + for orbit in input: + orbit = orbit.split(")") + #print(orbit) + if not orbit[0] in seen: + trees[orbit[0]] = Tree(orbit[0]) + seen.add(orbit[0]) + + # hook up each child to its parent (since every parent now exists) + for orbit in input: + orbit = orbit.rstrip().split(")") + if orbit[1] in seen: + trees[orbit[0]].add_child(trees[orbit[1]]) + else: + leafs[orbit[1]] = Tree(orbit[1]) + trees[orbit[0]].add_child(leafs[orbit[1]]) + for k in trees: + pass + #print(trees[k], trees[k].children) + + trees.update(leafs) + return trees + +sum_depths = 0 +def pt1(input): + tree = gen_tree(input) + depth = 0 + depths = {} + def count_children(tree, depth): + global sum_depths # fusk-rekursion? ville bara att det skulle fungera + sum_depths += depth + depths[tree.name] = depth + for child in tree.children: + count_children(child, depth+1) + count_children(tree["COM"], 0) + return sum_depths + +def pt2(input): + # find common parent and distance to it + tree = gen_tree(input) + src_parents = tree["YOU"].parent.parents() + tar_parents = tree["SAN"].parent.parents() + src_dist = 0 + for src_parent in src_parents: + src_dist += 1 + tar_dist = 0 + for tar_parent in tar_parents: + tar_dist += 1 + if src_parent == tar_parent: + return (src_parent.name, src_dist, tar_dist, src_dist + tar_dist) diff --git a/solutions/py/07.py b/solutions/py/d07.py index 18c3b89..e12d7c9 100644 --- a/solutions/py/07.py +++ b/solutions/py/d07.py @@ -2,15 +2,41 @@ import intcode import itertools import queue -def pt2(program): +def pt1(input): + program = [int(x) for x in input[0].split(",")] highest_signal = 0 highest_sequence = None - for phase_seq in list(itertools.permutations(list(range(5,10)))): + for phase_seq in list(itertools.permutations(list(range(0,5)))): + q = queue.Queue(5) + for phase in phase_seq: + q.put(phase) + amps = [intcode.Computer(program) for _ in range(5)] + for amp in amps: + amp.input = q.get() signal = 0 + for amp in amps: + while True: + amp.step() + if amp.input is None: + amp.input = signal + if amp.output is not None: + signal = amp.output + amp.output = None + break + if signal > highest_signal: + highest_signal = signal + highest_sequence = phase_seq + return (highest_sequence, highest_signal) + +def pt2(input): + program = [int(x) for x in input[0].split(",")] + highest_signal = 0 + highest_sequence = None + for phase_seq in list(itertools.permutations(list(range(5,10)))): q = queue.Queue(5) for phase in phase_seq: q.put(phase) - amps = [intcode.Computer(program) for i in range(5)] + amps = [intcode.Computer(program) for _ in range(5)] for amp in amps: amp.input = q.get() @@ -19,7 +45,7 @@ def pt2(program): while True: amp = amps[current_amp] amp.step() - if amp.input == None: + if amp.input is None: if amp.phase_read == False: amp.phase_read = True amp.input = signal @@ -41,15 +67,4 @@ def pt2(program): if signal > highest_signal: highest_signal = signal highest_sequence = phase_seq - return highest_signal - -if __name__ == "__main__": - f = open("../input/07", "r") - program = [int(x) for x in f.readline().split(",")] - - import cProfile - import timeit - - print(2, pt2(program)) - print(timeit.timeit('pt2(program)', globals=globals(), number=1)*1000, "ms") - cProfile.run("pt2(program)") + return (highest_sequence, highest_signal) diff --git a/solutions/py/d08.py b/solutions/py/d08.py new file mode 100644 index 0000000..659bc3a --- /dev/null +++ b/solutions/py/d08.py @@ -0,0 +1,31 @@ +def count(layer, num): + return sum([row.count(num) for row in layer]) + + +def pt1(input): + img = [] + least_zeroes = 150 # max + n = 0 + for l in range(100): + #print("l", l) + layer = [[int(input[0][l*25*6 + y*25 + x]) for x in range(25)] for y in range(6)] + if count(layer, 0) < least_zeroes: + least_zeroes = count(layer, 0) + n = count(layer, 1) * count(layer, 2) + img.append(layer) + return n + +def pt2(input): + img = [[[int(input[0][l*25*6 + y*25 + x]) for x in range(25)] for y in range(6)] for l in range(100)] + result = img[0] + for layer in img[1:]: + for x in range(25): + for y in range(6): + if result[y][x] == 2: + result[y][x] = layer[y][x] + str_res = [] + for row in result: + for c in row: + str_res.append('\u2588' if c == 1 else ' ') + str_res.append("\n") + return "\n" + ("".join(str_res)) diff --git a/solutions/py/main.py b/solutions/py/main.py new file mode 100644 index 0000000..3456dd6 --- /dev/null +++ b/solutions/py/main.py @@ -0,0 +1,15 @@ +import d01 +import d02 +import d03 +import d04 +import d05 +import d06 +import d07 +import d08 + +mods = [d01, d02, d03, d04, d05, d06, d07, d08] + +for mod, day in zip(mods, range(8)): + print("Day", str(day+1).zfill(2)) + print("Part", 1, mod.pt1(open("../input/" + str(day+1).zfill(2), "r").readlines())) + print("Part", 2, mod.pt2(open("../input/" + str(day+1).zfill(2), "r").readlines())) |
