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
def prep_instructions(data): instructions = [] lines = helpers.get_lines(data) for line in lines: op, *args = line.split() instructions.append((op, args)) return instructions
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
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
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)
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
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]
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
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}"
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
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
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
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
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
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"
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}"
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
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
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)
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)
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
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
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
def parse_lines(): lines = helpers.get_lines(r"./data/day_02.txt") return [convert_to_positions(line) for line in lines]
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
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