diff --git a/2015/day19/solution.py b/2015/day19/solution.py index f231cbb..60f0ddf 100644 --- a/2015/day19/solution.py +++ b/2015/day19/solution.py @@ -1,4 +1,3 @@ - def convert_to_dict(conversion_list: list[str]) -> dict: converted_dict: dict[str:set] = {} for conversion in conversion_list: @@ -10,38 +9,62 @@ def convert_to_dict(conversion_list: list[str]) -> dict: return converted_dict -def convert_one_molek_num_pos_versions(conversion_dict: dict[str:set], input_molek: str) -> int: - def convert_to_list() -> list[str]: - result = '' - for index, letter in enumerate(input_molek): - if letter.isupper() and index != 0: - result += ' ' - result += letter - return result.split() +def convert_to_list(im) -> list[str]: + result = '' + for index, letter in enumerate(im): + if letter.isupper() and index != 0: + result += ' ' + result += letter + return result.split() + +def run_all_possible_conversions(conversion_table: dict, input_molek: list) -> set[str]: combinations: set = set() - converted_list = convert_to_list() - for index, molek in enumerate(converted_list): - if molek not in conversion_dict: + for index, molek in enumerate(input_molek): + if molek not in conversion_table: continue - for product in conversion_dict[molek]: - inserted_molek = converted_list.copy() + for product in conversion_table[molek]: + inserted_molek = input_molek.copy() inserted_molek[index] = product combinations.add("".join(inserted_molek)) + return combinations - return len(combinations) + +def convert_one_molek_num_pos_versions(conversion_dict: dict[str:set], input_molek: str) -> int: + converted_list = convert_to_list(input_molek) + return len(run_all_possible_conversions(conversion_dict, converted_list)) + + +def steps_to_medicine(conversion_dict: dict[str:set], product, debug_print=False, s_molek="e") -> int: + results, iterations = set(s_molek), 0 + while product not in results: + iterations += 1 + new_results = set() + for result in results: + [new_results.add(i) for i in run_all_possible_conversions(conversion_dict, convert_to_list(result))] + results = new_results + if debug_print: + output_file.write(str(iterations) + " : \n") + output_file.writelines(str(results)) + output_file.write("\n") + + return iterations if __name__ == '__main__': - test_input, test_molek = ["H => HO", "H => OH", "O => HH"], "HOH" + test_input, test_molek = ["H => HO", "H => OH", "O => HH", "e => O", "e => H"], "HOH" assert convert_one_molek_num_pos_versions(convert_to_dict(test_input), test_molek) == 4 + + assert steps_to_medicine(convert_to_dict(test_input), test_molek) == 3 + assert steps_to_medicine(convert_to_dict(test_input), "HOHOHO") == 6 print("All test passed") puzzle_input = open("input.txt", "r").read().splitlines() + output_file = open("output.txt", "w") starting_molek = puzzle_input.pop() puzzle_input.pop() converted_dict = convert_to_dict(puzzle_input) print("solution: ", convert_one_molek_num_pos_versions(converted_dict, starting_molek)) print("Part2: ") - print("solution: ", ) + print("solution: ", steps_to_medicine(converted_dict, starting_molek, debug_print=True))