def day_sixteen(): entries = file_to_string_list("Day16.txt") entries = [e.split(" ") for e in entries] sues = {} for e in entries: s = int(e[1].replace(":", "")) e = e[2:] sue = {} for i in range(0, len(e)-1, 2): k = e[i].replace(":", "") v = int(e[i+1].replace(",", "")) sue[k] = v sues[s] = sue for k, v in sues.items(): real_sue = True for k1, v1 in v.items(): if k1 in wrapping_sue: wv = wrapping_sue[k1] # print(k1, v1, wv) if k1 in ["cats", "trees"]: if v1 <= wv: real_sue = False elif k1 in ["pomeranians", "goldfish"]: if v1 >= wv: real_sue = False else: if v1 != wv: real_sue = False if real_sue: print(k, v)
def test_day_fourteen(): entries = utils.file_to_string_list("day14a.txt") cur = "" for e in entries: e = e.split(" = ") if "mask" == e[0]: cur = e[1] masks[cur] = [] else: masks[cur].append((int(e[1]), int(e[0]))) mem[e[0]] = zero mask1 = list(masks.keys())[0] mem1 = masks[mask1][0] max_in_file = bin(947441529)[2:] for k, v in masks.items(): for value, address in v: mask = k address = to_binary(address) masked = apply_mask(address, mask) addresses = apply_floating(masked) for a in addresses: i = int(a, 2) mem[a] = to_binary(value) s = 0 for address in mem: s += int(mem[address], 2) print(s)
def day_sixteen(): your = utils.file_to_string_list("Day16your.txt") your = your[0] your = your.split(",") your = [int(y) for y in your] s = your[1]*your[2]*your[12]*your[15]*your[16]*your[17] print(s)
def parse(filename): entries = utils.file_to_string_list(filename) rules = [] messages = [] for e in entries: if ":" in e: rules.append(e) else: messages.append(e) return (rules, messages)
def day_fifteen(): entries = utils.file_to_string_list("Day15.txt") m = get_ingredients(entries) perms = get_permutations() best = 0 for p in perms: s = get_score(m, p) if s > best: best = s print(s, m, p)
def render_sample(): entries = utils.file_to_string_list("Day24sample.txt") to_render = run(entries) plt.show() plt.ion() fig, ax = plt.subplots(1) ax.set_aspect('equal') render(to_render[0], ax) plt.pause(10) for tr in to_render: render(tr, ax)
def day_sixteen_part_two(): nearby_tickets = utils.file_to_string_list("Day16nearby.txt") fields = utils.file_to_string_list("Day16fields.txt") indexes = calculate_field_indexes(fields, nearby_tickets) departures = [] for k in indexes: for v in indexes[k]: if "departure" in v: departures.append(k) my_ticket = utils.file_to_string_list("Day16your.txt")[0] my_ticket = my_ticket.split(",") my_ticket = [int(m) for m in my_ticket] ans = 1 for i, v in enumerate(my_ticket): if i in departures: ans *= v assert ans == 2766491048287
def day_fourteen_part_two(): entries = utils.file_to_string_list("Day14.txt") entries = [e.split(" ") for e in entries] entries = [Reinder(e[0], e[3], e[6], e[13]) for e in entries] points = {} for i in range(1, 2504): es = [(e.name, e.traveled(i)) for e in entries] m = max(es, key=lambda x: x[1]) if m[0] not in points: points[m[0]] = 1 else: points[m[0]] += 1 assert 1084 == max(points.values())
def test_day_nineteen_part_two(): entries = utils.file_to_string_list("Day19.txt") starting = populate(entries) all = set() all.add("e") for i in range(0, 10): new = set() for a in all: new2 = replace(a) for n in new2: new.add(n) for n in new: if n[-2:] != "Ar": all.add(n) print(len(all))
def parse(filename): grids = {} entries = utils.file_to_string_list(filename) grid, id = None, None for e in entries: if "Tile" in e: if grid and id: grids[id] = np.array(grid) id = e.split(" ")[1] id = id.replace(":", "") grids[id] = [] grid = [] elif len(e) > 0: e = [1 if e == "#" else 0 for e in e] grid.append(list(e)) grids[id] = np.array(grid) return grids
def day_twenty_one(): entries = utils.file_to_string_list("Day21.txt") entries = [e.split(" (contains ") for e in entries] answer = run(entries) assert answer[0] == 1977 assert answer[1] == "dpkvsdk,xmmpt,cxjqxbt,drbq,zmzq,mnrjrf,kjgl,rkcpxs"
def test_day_twenty_one(): entries = utils.file_to_string_list("Day21sample.txt") entries = [e.split(" (contains ") for e in entries] answer = run(entries) assert answer[0] == 5 assert answer[1] == "mxmxvkd,sqjhc,fvjkl"
def day_twenty_one(): entries = utils.file_to_string_list("Day24.txt") tiles = run(entries) print(len(tiles[-1]))
def day_fourteen(): entries = utils.file_to_string_list("Day14.txt") entries = [e.split(" ") for e in entries] entries = [Reinder(e[0], e[3], e[6], e[13]) for e in entries] entries = [(e.name, e.traveled(2503)) for e in entries] assert 2696 == max(entries, key=lambda x: x[1])[1]
def test_day_fourteen(): entries = utils.file_to_string_list("Day14sample.txt") entries = [e.split(" ") for e in entries] entries = [Reinder(e[0], e[3], e[6], e[13]) for e in entries]
def test_day_twenty_one(): entries = utils.file_to_string_list("Day24sample.txt") run(entries)
def test_day_twenty_two(): entries = utils.file_to_string_list("Day22sample.txt") assert 306 == run(entries)
def test_day_twenty_two_infinite(): entries = utils.file_to_string_list("Day22infinite.txt") assert 105 == run(entries)
def day_twenty_one(): entries = utils.file_to_string_list("Day24.txt") run(entries)
def test_day_nineteen(): entries = utils.file_to_string_list("Day19.txt") starting = populate(entries) d = replace(starting) print(len(replacements)) assert 535 == len(d)
def day_eighteen(): expressions = utils.file_to_string_list("Day18.txt") ans = 0 for expr in expressions: ans += evaluate(expr) print(ans)
def day_twenty_two(): entries = utils.file_to_string_list("Day22.txt") assert 31308 == run(entries)
import utils.utils as utils entries = utils.file_to_string_list("Day15.txt") test_entries = utils.file_to_string_list("Day15sample.txt") def next(n): """So, after the starting numbers, each turn results in that player speaking aloud either 0 (if the last number is new) or an age (if the last number is a repeat).""" last = n[-1] count = sum(1 for x in n if x == last) if count == 1: n.append(0) return n prev = -1 prev2 = -1 for i in range(len(n)-1, -1, -1): if n[i] == last: if prev == -1: prev = i elif prev2 == -1: prev2 = i else: break n.append(prev-prev2) return n def test_day_fifteen(): n = [2,0,6,12,1,3] index = 2020 for i in range(0, index):
def day_sixteen_part_one(): nearby_tickets = utils.file_to_string_list("Day16nearby.txt") fields = utils.file_to_string_list("Day16fields.txt") ans = sum(get_invalid_field_values(fields, nearby_tickets)) assert 27898 == ans
def test_day_fifteen(): entries = utils.file_to_string_list("Day15sample.txt") m = get_ingredients(entries)
def test_day_sixteen(): all_valid = {} all_valid2 = set() all_invalid = [] maybe_valid_tickets = [] your = utils.file_to_string_list("Day16your.txt") nearby = utils.file_to_string_list("Day16nearby.txt") fields = utils.file_to_string_list("Day16fields.txt") for f in fields: f = f.split(" ") key = f[0] f = [f[1], f[3]] key = key.replace(":", "") all_valid_v = set() for g in f: g = g.split("-") for i in range(int(g[0]), int(g[1])+1): all_valid_v.add(i) all_valid2.add(i) all_valid[key] = all_valid_v for g in nearby: g = g.split(",") valid = True for i, h in enumerate(g): if int(h) not in all_valid2: all_invalid.append(int(h)) valid = False if valid: maybe_valid_tickets.append(g) # print(maybe_valid_tickets) # print(all_valid) field_map = {} for m in maybe_valid_tickets: for i, n in enumerate(m): if i not in field_map: field_map[i] = set() field_map[i].add(int(n)) # print(field_map) actual_fm = {} for k, v in field_map.items(): for k1, v1 in all_valid.items(): if v < v1: if k not in actual_fm: actual_fm[k] = set() actual_fm[k].add(k1) print(actual_fm) for k, v in actual_fm.items(): for v1 in v: if "departure" in v1: print(k, v1, "!!!") what = {} for i in range(0, 20): for k, v in actual_fm.items(): what[k] = v for j in range(0, 20): if i != j and i in what and j in actual_fm: what[i] = what[i] - actual_fm[j] for z in what: if len(what[z]) == 1: for y in what.values(): if y != what[z]: the_key = list(what[z])[0] if the_key in y: y.remove(the_key) departures = {} for k, v in actual_fm.items(): for v1 in v: if "departure" in v1: # print(k, v1, "!!!") if v1 not in departures: departures[v1] = set() departures[v1].add(k) # print(departures) print(what)