def main(part1=True): values = list( map(lambda x: (x.split()[0], list(map(int, x.split()[1:]))), helper.load_in_list('input_21.txt', str))) ip = 0 ip_reg = values[0][1][0] program = values[1:] reg = [0, 0, 0, 0, 0, 0] last = 0 seen = set() while ip < len(program): if ip == 28: c = reg[2] if part1: print(c) break else: if c in seen: print("Seen {} before. Last was {}".format(c, last)) break seen.add(c) last = c reg[ip_reg] = ip line = program[ip] func_name = func[line[0]] v = line[1] func_name(reg, v[0], v[1], v[2]) ip = reg[ip_reg] ip += 1
def main(n=0): values = list(map(lambda x : (x.split()[0], list(map(int, x.split()[1:]))), helper.load_in_list('input_21.txt', str))) # ip = 0 ip_reg = values[0][1][0] program = values[1:] reg = [n,0,0,0,0,0] t = 0 while reg[ip_reg] < len(program): ip = reg[ip_reg] reg_before = reg[::] line = program[reg[ip_reg]] func_name = func[line[0]] v = line[1] reg = func_name(reg, v[0], v[1], v[2]) reg[ip_reg] += 1 print(ip, line, reg_before, reg) t += 1 if t > 30: break print(reg)
def setup(): lines = helper.load_in_list('input_17.txt', str) clay = set() for line in lines: v = list(map(int, re.findall("-?\d+", line))) if line[0] == 'y': for x in range(v[1], v[2] + 1): clay.add((x, v[0])) else: for y in range(v[1], v[2] + 1): clay.add((v[0], y)) return clay
def part2(): op2inst = get_op2inst() program = list( map(lambda x: list(map(int, re.findall("-?\d+", x))), helper.load_in_list('input_16_2.txt', str))) reg = [0, 0, 0, 0] for line in program: inst = op2inst[line[0]] reg = instructions[inst](reg, line[1], line[2], line[3]) print(reg)
def setup(): values = helper.load_in_list('input_16.txt', str) before = [] reg = [] after = [] for s in values: x = list(map(int, re.findall("-?\d+", s))) if len(x) > 0: if "Before" in s: before.append(x) elif "After" in s: after.append(x) else: reg.append(x) return zip(before, reg, after)
def setup(): groups = [] values = helper.load_in_list("input_24.txt", str) immune = True i = 1 for line in values: if "Infection" in line: immune = False i = 1 continue if line == "" or "Immune System" in line: continue g = create_unit(line, immune, i) groups.append(g) i += 1 return groups
def main(n=0): values = list(map(lambda x : (x.split()[0], list(map(int, x.split()[1:]))), helper.load_in_list('input_19.txt', str))) ip = 0 ip_reg = values[0][1][0] program = values[1:] reg = [n,0,0,0,0,0] t = 0 while ip < len(program): reg[ip_reg] = ip line = program[ip] func_name = func[line[0]] v = line[1] func_name(reg, v[0], v[1], v[2]) ip = reg[ip_reg] ip += 1 # print(reg, line[0], v) # t += 1 # if t > 100: # break print(reg)
def get_values(): return list( map(lambda x: tuple(map(int, re.findall("-?\d+", x))), helper.load_in_list('input_25.txt', str)))
import collections import itertools import helper import re import matplotlib.pyplot as plt values = helper.load_in_list('input_10.txt', str) values = list(map(lambda x : list(map(int, re.findall("-?\d+", x))), helper.load_in_list('input_10.txt', str))) points = [] velocities = [] for x,y,i,j in values: points.append([x,y]) velocities.append((i,j)) def max_dist(p): minx = min(x for x, y in points) maxx = max(x for x, y in points) miny = min(y for x, y in points) maxy = max(y for x, y in points) return abs(maxx - minx) + abs(maxy - miny) def forwards(p): for i in range(len(p)): p[i][0] += velocities[i][0] p[i][1] += velocities[i][1] return p def backwards(p): for i in range(len(p)): p[i][0] -= velocities[i][0]
import collections import itertools import helper values = helper.load_in_list('input_3.txt', str) two = 0 three = 0 for s in values: counter = collections.Counter(s) times = set(counter.values()) if 2 in times: two += 1 if 3 in times: three += 1 print(two * three)
import itertools import helper values = helper.load_in_list('input_1.txt') freq = 0 freq_reached = set([freq]) for f in itertools.cycle(values): freq += f if freq in freq_reached: print(freq) break freq_reached.add(freq)
import collections import itertools import helper import re coords = { x: i for i, x in enumerate( list( map(lambda x: tuple(map(int, re.findall('\d+', x))), helper.load_in_list('input_6.txt', str)))) } min_x = min(coords.keys(), key=lambda x: x[0])[0] max_x = max(coords.keys(), key=lambda x: x[0])[0] min_y = min(coords.keys(), key=lambda x: x[1])[1] max_y = max(coords.keys(), key=lambda x: x[1])[1] max_dist = 10000 def dist(a, b): return abs(a[0] - b[0]) + abs(a[1] - b[1]) l = [] edge = set() total = 0 for y in range(min_y, max_y + 1): for x in range(min_x, max_x + 1): k = (x, y)
import collections import itertools import helper import re v = [(x[5], x[36]) for x in helper.load_in_list('input_7.txt', str)] steps = set() edges = collections.defaultdict(list) blocked = collections.defaultdict(int) for a, b in v: steps.add(a) steps.add(b) edges[a].append(b) blocked[b] += 1 out = "" while len(steps) > 0: possible = list(filter(lambda x: blocked[x] == 0, steps)) possible.sort() c = possible[0] out += c steps.remove(c) for b in edges[c]: blocked[b] -= 1 print(out)
import collections import itertools import helper import re import math file = "23.txt" # file = "input_23.txt" values = list( map(lambda x: list(map(int, re.findall("-?\d+", x))), helper.load_in_list(file, str))) # def calc_dist(a, b): return abs(a[0] - b[0]) + abs(a[1] - b[1]) + abs(a[2] - b[2]) def mid(a, b, r1, r2): ratio1 = r2 / (r1 + r2) ratio2 = r1 / (r1 + r2) return (int( (a[0] * ratio1 + b[0] * ratio2)), int((a[1] * ratio1 + b[1] * ratio2)), int((a[2] * ratio1 + b[2] * ratio2))) def in_range(p, c): return len([0 for q, r in c.items() if calc_dist(p, q) <= r]) def get_most_near(minx, maxx, miny, maxy, minz, maxz, c, dist):
import helper def collapse(l): stack = [] for y in l: if not stack: stack.append(y) else: x = stack[-1] if x - 32 == y or x + 32 == y: stack.pop() else: stack.append(y) return len(stack) s = helper.load_in_list('input_5.txt', str)[0] # s = "dabAcCaCBAcCcaDA" l = list(map(ord, s)) k = collapse(l) print(k) lengths = [] for i in range(65, 91): k = collapse([x for x in l if x != i and x - 32 != i]) lengths.append(k) print(min(lengths))
import collections import itertools import helper import re values = list(map(lambda x : list(map(int, re.findall('\d+', x))), helper.load_in_list('input_3.txt', str))) claims = [] for v in values: for i in range(v[1], v[1] + v[3]): for j in range(v[2], v[2] + v[4]): claims.append((i, j)) cc = collections.Counter(claims) total = 0 single_claim = [] for key, value in cc.items(): if value > 1: total += 1 print(total) for v in values: claimed = False for i in range(v[1], v[1] + v[3]): for j in range(v[2], v[2] + v[4]): if cc[(i, j)] > 1: claimed = True if not claimed: