Exemplo n.º 1
0
def run():
    # Part1
    lines = helpers.get_lines(r"./data/day_19.txt")
    rules, messages = parse_rules(lines)
    total = sum([bfs(rules, message) for message in messages])
    assert total == 124

    # Part2
    lines = helpers.get_lines(r"./data/day_19_part2.txt")
    rules, messages = parse_rules(lines)
    total = sum([bfs(rules, message) for message in messages])
    assert total == 228
Exemplo n.º 2
0
 def prep_instructions(data):
     instructions = []
     lines = helpers.get_lines(data)
     for line in lines:
         op, *args = line.split()
         instructions.append((op, args))
     return instructions
Exemplo n.º 3
0
def run():
    global line
    lines = helpers.get_lines(r"./data/day_02.txt")
    p1 = sum(part_01(line) for line in lines)
    assert p1 == 643
    p2 = sum(part_02(line) for line in lines)
    assert p2 == 388
Exemplo n.º 4
0
def main():
    lines = helpers.get_lines(r"./data/day_07.txt")
    part_01 = supports_tls(lines)
    assert part_01 == 110

    part_02 = supports_ssl(lines)
    assert part_02 == 242
Exemplo n.º 5
0
    def _sanitize_brackets(self, tokens_string):

        print "sanitize_brackets passed"

        lines = get_lines(tokens_string)

        if len(lines) == 1:
            raise EmptyProgramException(tokens_string)

        #for i, line in enumerate(lines):
        for i in range(len(lines) - 1, -1, -1):
            line = lines[i]

            if line.strip() == '_<op>_}' or line.strip() == '_<op>_} _<op>_}' \
               or line.strip() == '_<op>_} _<op>_} _<op>_}' or line.strip() == '_<op>_} _<op>_;' \
               or line.strip() == '_<op>_} _<op>_} _<op>_} _<op>_}' \
               or line.strip() == '_<op>_{' \
               or line.strip() == '_<op>_{ _<op>_{':
                if i > 0:
                    lines[i - 1] += ' ' + line.strip()
                    lines[i] = ''
                else:
                    # can't handle this case!
                    return ''

        # Remove empty lines
        for i in range(len(lines) - 1, -1, -1):
            if lines[i] == '':
                del lines[i]

        for line in lines:
            assert (lines[i].strip() != '')

        return recompose_program(lines)
Exemplo n.º 6
0
def run():
    lines = helpers.get_lines(r"./data/day_24.txt")
    instructions = parse(lines)
    results = get_visited_positions(instructions)
    part01 = sum([v % 2 == 0 for k, v in results.items()])
    assert part01 == 354

    # black = sum((v % 2 == 0 for k, v in results.items()))

    for day in range(1, 101):
        min_extents, max_extents = get_min_max_extents(results)

        changes = list()
        for i in range(min_extents[0] - 2, max_extents[0] + 2):
            for j in range(min_extents[1] - 2, max_extents[1] + 2):
                for k in range(min_extents[2] - 2, max_extents[2] + 2):

                    t = helpers.HexPos(i, j, k)
                    k_neighbours = sum([(results.get(n, 1) % 2 == BLACK)
                                        for n in get_neighbours(t)])

                    colour = results[t] % 2 if t in results else WHITE
                    if colour == BLACK and (k_neighbours == 0
                                            or k_neighbours > 2):
                        changes.append(t)
                    elif colour == WHITE and k_neighbours == 2:
                        changes.append(t)

        for c in changes:
            results[c] = results[c] + 1 if results[c] > 0 else 2

    black = sum((v % 2 == BLACK for k, v in results.items()))
    assert black == 3608
Exemplo n.º 7
0
 def convert_to_new_line_format(self, prog):
     new_line = ' -new-line- '
     lines = get_lines(prog)
     result = ''
     for line in lines:
         result += line + new_line
     # result += '-end-of-program-'
     return result[:-1]
Exemplo n.º 8
0
def main():
    lines = helpers.get_lines(r"./data/day_01.txt")
    ints = [int(line) for line in lines]
    p1 = part1(ints)
    p2 = part2(ints)

    assert p1 == 935419
    assert p2 == 49880012
Exemplo n.º 9
0
def run():
    global line, seat_numbers
    lines = helpers.get_lines(r"./data/day_05.txt")
    seat_numbers = sorted(parse(line) for line in lines)
    part1 = seat_numbers[-1]
    part2 = get_first_missing_seat_id(seat_numbers)
    assert part1 == 930, f"Expected 930; received {part1}"
    assert part2 == 515, f"Expected 515; received {part2}"
Exemplo n.º 10
0
def run():
    lines = helpers.get_lines(r"./data/day_22.txt")
    players = get_players(lines)
    p1 = part_01(players)
    assert p1 == 31809

    lines = helpers.get_lines(r"./data/day_22.txt")
    players = get_players(lines)
    p1, p2 = part_02(players)
    answer = 0
    for result in (p1, p2):
        for i, r in enumerate(reversed(result), 1):
            answer += r * i

    assert answer not in (33648, 33004)  # too high
    assert answer not in (32731, )  # too low
    assert answer == 32835
Exemplo n.º 11
0
def parse():
    lines = helpers.get_lines(PATH)
    timestamp, data = int(lines[0].strip()), lines[1].strip()
    nums = []
    for d in data.split(","):
        parsed = int(d) if d.isdigit() else None
        nums.append(parsed)
    return timestamp, nums
Exemplo n.º 12
0
def main():
    lines = helpers.get_lines(r"./data/day_09.txt")

    part_01 = process_instructions_01(lines[0])
    assert part_01 == 183269

    # lines = ["(25x3)(3x3)ABC(2x3)XY(5x2)PQRSTX(18x9)(3x2)TWO(5x7)SEVEN"]
    part_02 = process_instructions(lines[0])
    assert part_02 == 11317278863
Exemplo n.º 13
0
    def load(path):
        compiled = []

        lines = helpers.get_lines(path)
        for line in lines:
            arg, num = line.split()
            num = int(num)
            compiled.append((arg, num))

        return compiled
Exemplo n.º 14
0
def parse_lines():
    lines = helpers.get_lines("./data/day_03.txt")
    pattern = re.compile(r"(\d+)\s+(\d+)\s+(\d+)")
    results = list()
    for line in lines:
        found = pattern.search(line)
        a, b, c = found.groups()
        results.append((int(a), int(b), int(c)))

    return results
Exemplo n.º 15
0
def run():
    lines = helpers.get_lines(r"./data/day_21.txt")
    foods = parse(lines)
    allergen_db = allergen_database(foods)
    inert_ingredients = get_inert_ingredients(allergen_db)
    count_of = count_of_ingredients(foods)
    p1 = part_01(inert_ingredients, count_of)
    assert p1 == 2614
    p2 = part_02(inert_ingredients)
    assert p2 == "qhvz,kbcpn,fzsl,mjzrj,bmj,mksmf,gptv,kgkrhg"
Exemplo n.º 16
0
def run():
    # part 01
    lines = helpers.get_lines(r"./data/day_20.txt")
    array = parse(lines)

    p1, corners, total = part_01(array)
    assert p1 == 23386616781851

    # part 02 (requires partial solution from p1)
    r = part_02(array, corners, total)
    p2 = get_monsters(r)
    assert p2 == 2376, f"Expected 2376, but received {p2}"
Exemplo n.º 17
0
def get_bags() -> Dict[str, Bag]:
    bags = dict()
    lines = helpers.get_lines(r"./data/day_07.txt")
    for line in lines:
        name, *_ = line.split("bags")

        bag = Bag(name)
        for bag_info in BAG_INFO.findall(line):
            bag_count, bag_name = bag_info
            bag.append(Bag(bag_name, int(bag_count)))

        bags[bag.name] = bag

    return bags
    def write_conll_format(self, lines_path, save_path, parsed_path=None):
        f = open(save_path, 'w+')
        lines = get_lines(lines_path=lines_path)

        for index, line in enumerate(lines):
            f.write('# sent_id = sent-{0} \n'.format(index + 1))
            f.write('# text = {0} \n'.format(line))
            doc = self.nlp(line)
            for sent in doc.sentences:
                for i, word in enumerate(sent.words):
                    f.write('{0}\t{1}\t_\t_\t_\t_\t{2}\t{3}\t_\t_\n'.format(
                        i + 1, word.text, word.governor,
                        word.dependency_relation))
                f.write('\n')
        f.close()
        return self
    def write_conll_format(self, lines_path, save_path, parsed_path=None):
        f = open(save_path, 'w+')
        lines = get_lines(lines_path=lines_path)

        for index, line in enumerate(lines):
            f.write('# sent_id = sent-{0} \n'.format(index + 1))
            f.write('# text = {0} \n'.format(line))
            doc = self.nlp(line)
            for sent in list(doc.sents):
                dependency = self.sd.convert_tree(sent._.parse_string)
                for token in dependency:
                    f.write('{0}\t{1}\t_\t_\t_\t_\t{2}\t{3}\t_\t_\n'.format(
                        token.index, token.form, token.head, token.deprel))
            f.write('\n')
        f.close()
        return self
Exemplo n.º 20
0
def run():
    ll = helpers.get_lines(r"./data/day_16.txt")

    # new
    data = parse_lines(ll)
    ranges = [v for k, v in data.items() if "ticket" not in k]
    ranges_flat = set(itertools.chain.from_iterable(ranges))
    p1 = [
        r for row in data["nearby tickets"] for r in row
        if r not in ranges_flat
    ]
    assert sum(p1) == 23115

    # original
    it = part01(ll)
    assert sum(it) == 23115
    found = part02(ll, it)
    assert found == 239727793813
    def get_dependencies(self, lines_path, save_path):
        f = open(save_path, 'w+')
        lines = get_lines(lines_path=lines_path)

        for line in lines:
            f.write(line + '\n')
            doc = self.nlp(line)
            for sent in list(doc.sents):
                dependency = self.sd.convert_tree(sent._.parse_string)
                for token in dependency:
                    f.write(
                        'index: {0}\tform: {1}\tcpos: {2}\tpos: {3}\thead: {4}\tdeprel: {5} \n'
                        .format(token.index, token.form, token.cpos, token.pos,
                                token.head, token.deprel))
            f.write('\n')
            f.write('======')

        f.close()
        return self
    def get_dependencies(self, lines_path, save_path):
        f = open(save_path, 'w+')
        lines = get_lines(lines_path=lines_path)

        for line in lines:
            f.write(line + '\n')
            f.write('\n')
            doc = self.nlp(line)
            for sent in doc.sentences:
                for word in sent.words:
                    f.write(
                        'text: {0}\tlemma: {1}\tupos: {2}\txpos: {3}\tfeats: {4}\tgovernor: {5}\tdependency_relation: {6} \n'
                        .format(word.text, word.lemma, word.upos, word.xpos,
                                word.feats, word.governor,
                                word.dependency_relation))
                f.write('\n')
            f.write('======')
        f.close()

        return self
Exemplo n.º 23
0
    def init_puzzle_state(self, init_save_path):
        lines = get_lines(init_save_path)
        i_lines = iter(lines)

        # skip command line
        next(i_lines)

        # skip header
        next(i_lines).split()

        for line in i_lines:
            node_name, size, used, avail, percentage = line.split()
            # x = int(needle.search(node_name).group(1))
            y = int(needle.search(node_name).group(2))

            if len(self.maze_state) == y:
                self.maze_state.append([])

            new_node = Node(node_name, int(used[:-1]), int(avail[:-1]))

            self.maze_state[y].append(new_node)
Exemplo n.º 24
0
def day_03(rules: Tuple) -> int:
    lines = helpers.get_lines(r"./data/day_03.txt")

    m = []
    for k, v in rules:
        # prime iterator each time
        forest = iter(lines)
        _ = next(forest)  # always skip header

        x = 0
        total = []
        for trees in forest:
            x += k

            # Skip lines if the rules expect it
            for _ in range(v - 1):
                trees = next(forest)

            total.append(trees[x % len(trees)] == "#")

        m.append((sum(total)))

    return math.prod(m)
Exemplo n.º 25
0
                except Exception:
                    # Likely just reversed .. so try again
                    total += results[b][a]
            if back_to_start:
                add_on = option[-1]
                try:
                    total += results[add_on][0]
                except Exception:
                    total += results[0][add_on]

            lowest_result = total if total < lowest_result else lowest_result
    return lowest_result


if __name__ == "__main__":
    test_data = [
        "###########",
        "#0.1.....2#",
        "#.#######.#",
        "#4.......3#",
        "###########",
    ]
    puzzle_data = get_lines(r"./data/day_24.txt")

    travelling_elves(test_data)
    part_01 = travelling_elves(puzzle_data)
    assert part_01 == 498

    part_02 = travelling_elves(puzzle_data, back_to_start=True)
    assert part_02 == 804
Exemplo n.º 26
0
import helpers

max = 4294967295

last_i = -1
last_o = -1

# Parse the data
lines = helpers.get_lines(r"./data/day_20.txt")

stuff = list()
for line in lines:
    i, o = line.split("-")
    i, o = int(i), int(o)
    stuff.append((i, o))

# Collect Gaps
allowed = list()
for line in sorted(stuff):
    i, o = line

    if last_o >= i or i == last_o + 1:
        last_i = i
        if o > last_o:
            last_o = o
    else:
        for i in range(last_o + 1, i):
            allowed.append(i)
        last_i = i
        last_o = o
Exemplo n.º 27
0
    data.append(".")

    result = list()
    for (x, y, z) in zip(data, data[1:], data[2:]):
        token = "^" if (x, y, z) in traps else "."
        result.append(token)

    return "".join(result)


def get_safe_tiles(data, depth):
    safe_tiles = 0
    for _ in range(depth):
        safe_tiles += data.count(".")
        data = get_new_line(data)
    return safe_tiles


if __name__ == "__main__":
    lines = helpers.get_lines(r"../data/day_18.txt")
    line = lines[0]

    # line = "..^^."
    # line = ".^^.^.^^^^"

    part_01 = get_safe_tiles(line, 40)
    assert part_01 == 2035

    part_02 = get_safe_tiles(line, 400000)
    assert part_02 == 20000577
Exemplo n.º 28
0
def parse_lines():
    lines = helpers.get_lines(r"./data/day_02.txt")
    return [convert_to_positions(line) for line in lines]
Exemplo n.º 29
0
def run():
    lines = helpers.get_lines(r"./data/day_17.txt")
    p1 = part01(lines)
    p2 = part02(lines)
    assert get_total(p1) == 232
    assert get_total(p2) == 1620
Exemplo n.º 30
0
def run():
    lines = helpers.get_lines(r"./data/day_15.txt")
    nums = [int(i) for line in lines for i in line.split(",")]
    assert do_work(nums, 2020) == 475
    assert do_work(nums, 30_000_000) == 11261