def __init__(self, data): self.grid = defaultdict(int) program = [int(n) for n in data.split(',')] self.comp = Computer(program) self.pos = 0, 0 self.painted = set() self.dir_index = 0
def parse(data): asts = set() for y, line in enumerate(data.split('\n')): for x, char in enumerate(line): if char == '#': asts.add((x, y)) return asts
def sol(data): dct = defaultdict(list) for line in data.split('\n'): inr, outr = line.split(')') dct[inr].append(outr) paths = {} def recrs(path): for outr in dct[path[-1]]: newpath = path + [outr] paths[outr] = newpath recrs(newpath) recrs(['COM']) # part 1 print(sum(len(p) - 1 for p in paths.values())) # part 2 sanpath = paths['SAN'] mypath = paths['YOU'] steps = 0 for a, b in it.zip_longest(mypath[:-1], sanpath[:-1]): if a != b: steps += bool(a) + bool(b) print(steps)
def sol(data): dirs = { 'R': (1, 0), 'L': (-1, 0), 'U': (0, -1), 'D': (0, 1), } sets = [] for wire in data.split('\n'): if wire: pts = {} sets.append(pts) x, y = 0, 0 c = 0 for d, *steps in wire.split(','): steps = int(''.join(steps)) dx, dy = dirs[d] for _ in range(steps): x += dx y += dy c += 1 pts[x, y] = c intsect = set(sets[0]).intersection(sets[1]) # part 1 print(min(abs(x) + abs(y) for x, y in intsect)) # part 2 print(min(sets[0][pt] + sets[1][pt] for pt in intsect))
def sol1(data): a, b = map(int, data.split('-')) c = 0 for n in range(a, b + 1): n = str(n) if all(x <= y for x, y in zip(n, n[1:])) and len(set(n)) < 6: c += 1 print(c)
def sol2(data): a, b = map(int, data.split('-')) c = 0 for n in range(a, b + 1): n = str(n) if all(x <= y for x, y in zip(n, n[1:])) and 2 in Counter(n).values(): c += 1 print(c)
def sol1(data): res = 0 for line in data.split(): n = int(line) // 3 - 2 if n > 0: res += n print(res)
def sol2(data): res = 0 for line in data.split(): n = int(line) // 3 - 2 while n > 0: res += n n = n // 3 - 2 print(res)
def parse(data): dct = {} for line in data.split('\n'): reactants, product = line.split(' => ') needed = [] for thing in reactants.split(', '): amt, name = thing.split() needed.append((int(amt), name)) amt, name = product.split() dct[name] = [int(amt), needed] return dct
def sol(data): start, stop = data.split('-') stop = [int(n) for n in stop] part1, part2 = 0, 0 for digit_seq in gen_ascending(start): if digit_seq > stop: break counts = Counter(digit_seq) if max(counts.values()) >= 2: part1 += 1 if 2 in counts.values(): part2 += 1 print(part1) print(part2)
def sol(data, noun=12, verb=2): arr = [int(n) for n in data.split(',')] arr[1] = noun arr[2] = verb i = 0 while True: n, a, b, c = arr[i:i+4] if n == 99: break elif n == 1: arr[c] = arr[a] + arr[b] elif n == 2: arr[c] = arr[a] * arr[b] else: print('weird', n) i += 4 return arr[0]
def sol(data, input=0): program = [int(n) for n in data.split(',')] comp = Computer(program, input=input) comp.run() print(comp.collect())
def __init__(self): program = [int(n) for n in data.split(',')] self.comp = Computer(program) self.score = 0 self.board = None self.setup()
i = 0 while True: op, a, b, c = arr[i:i + 4] A = a if isinstance(a, Symbol) else arr[a] B = b if isinstance(b, Symbol) else arr[b] if op == 99: break elif op == 1: arr[c] = A + B elif op == 2: arr[c] = A * B else: print('weird', op) i += 4 return arr[0] arr = [int(n) for n in data.split(',')] target = 19690720 expr = sol(arr, x, y) - target xc = int(expr.coeff(x, 1)) yc = int(expr.coeff(y, 1)) assert yc == 1 c = abs(int(expr.coeff(x, 0).coeff(y, 0))) verb, noun = divmod(c, xc) print(100 * verb + noun)