Beispiel #1
0
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)
Beispiel #2
0
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)
Beispiel #3
0
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)
Beispiel #4
0
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)
Beispiel #5
0
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)
Beispiel #6
0
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)
Beispiel #7
0
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
Beispiel #8
0
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())
Beispiel #9
0
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))
Beispiel #10
0
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
Beispiel #11
0
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"
Beispiel #12
0
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"
Beispiel #13
0
def day_twenty_one():
    entries = utils.file_to_string_list("Day24.txt")
    tiles = run(entries)
    print(len(tiles[-1]))
Beispiel #14
0
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]
Beispiel #15
0
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]
Beispiel #16
0
def test_day_twenty_one():
    entries = utils.file_to_string_list("Day24sample.txt")
    run(entries)
Beispiel #17
0
def test_day_twenty_two():
    entries = utils.file_to_string_list("Day22sample.txt")
    assert 306 == run(entries)
Beispiel #18
0
def test_day_twenty_two_infinite():
    entries = utils.file_to_string_list("Day22infinite.txt")
    assert 105 == run(entries)
Beispiel #19
0
def day_twenty_one():
    entries = utils.file_to_string_list("Day24.txt")
    run(entries)
Beispiel #20
0
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)
Beispiel #21
0
def day_eighteen():
    expressions = utils.file_to_string_list("Day18.txt")       
    ans = 0
    for expr in expressions:
        ans += evaluate(expr)
    print(ans)
Beispiel #22
0
def day_twenty_two():
    entries = utils.file_to_string_list("Day22.txt")
    assert 31308 == run(entries)
Beispiel #23
0
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):
Beispiel #24
0
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
Beispiel #25
0
def test_day_fifteen():
    entries = utils.file_to_string_list("Day15sample.txt")
    m = get_ingredients(entries)
Beispiel #26
0
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)