Advent of Code 2015 day 19 part 2: solved
This commit is contained in:
parent
4a0b5f95fa
commit
eceb0d2dfc
|
|
@ -1 +1 @@
|
||||||
[ ] - day 19 part 2
|
- [ ] day 19 part 2 own solution
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
FaCaCBPBPaCrAFYFaCnRiSBiTiTPaCrAFaChTiSrAgMnRiSrAgMnRiSaCnRiTPaCaCaCrAFBnRiSaCaCrAFaCaCYFnRiSaChTrAlAiSaCaCaCBPrAFBPBPaCaCaCaCaCaCrAFrAgMnRiSnRPnRiTrAFnRiSaCBPaCBPaCaCBiTPrAFYFaCaCnRiSBPhTiSaCBPaCaChTiSaCrAlAiSaCnRPaCaCaCaChTiSaCrAFYlAiSBiTrAFnRiSaCnRiSrAgMiTnRiSaCnRC
|
||||||
|
FBiTPrAFYFnRiSBPaCrAFaCaCaCaCnRPaCaCrAgMnRiSaCrAFaCYFnRiShTrAFaCBPrAgMiTPaCaCaCrAFaCnRPnRiTPBPaCaCBPrAFYFaCnRiSaCaCBPhTiSrAFaCnRPaChTiSrAFYFBPaCnRiSrAgMnRiSnRC
|
||||||
|
gMPaCaCaCrAFaCaCnRPaCaCaCrAFYFnRiShTrAFaCrAgMPaCrAFnRPnRPaCaCaCrAFYFnRiSBPaCrAFnRPaCrAFYgMPnRiSaCnRC
|
||||||
|
FaCaCrAFaCnRPaCaChTrAFrAFaCaCnRPaCaCaCaCaCaCrAFYFnRiSnRC
|
||||||
|
FaCrAFnRPhTrAFrAFaCnRPaCaCaCaCnRC
|
||||||
|
FaChTrAFrAFnRPaCaCnRC
|
||||||
|
FhTrAFaCaCnRC
|
||||||
|
lArAFaCnRC
|
||||||
|
lArAFnRC
|
||||||
|
lAN
|
||||||
|
e
|
||||||
|
|
@ -1,3 +1,6 @@
|
||||||
|
import re
|
||||||
|
|
||||||
|
|
||||||
def convert_to_dict(conversion_list: list[str]) -> dict:
|
def convert_to_dict(conversion_list: list[str]) -> dict:
|
||||||
converted_dict: dict[str:set] = {}
|
converted_dict: dict[str:set] = {}
|
||||||
for conversion in conversion_list:
|
for conversion in conversion_list:
|
||||||
|
|
@ -35,36 +38,45 @@ def convert_one_molek_num_pos_versions(conversion_dict: dict[str:set], input_mol
|
||||||
return len(run_all_possible_conversions(conversion_dict, converted_list))
|
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:
|
def steps_to_medicine(conversion_dict: dict[str:set], product) -> int:
|
||||||
results, iterations = set(s_molek), 0
|
# reimplemented solution from https://www.reddit.com/r/adventofcode/comments/3xflz8/comment/cy4nsdd
|
||||||
while product not in results:
|
def rep(x) -> str:
|
||||||
iterations += 1
|
nonlocal iteration
|
||||||
new_results = set()
|
iteration += 1
|
||||||
for result in results:
|
return reversed_dict[x.group()]
|
||||||
[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
|
reversed_dict = dict()
|
||||||
|
for value, keys in conversion_dict.items():
|
||||||
|
rvalue = value[::-1]
|
||||||
|
for key in keys:
|
||||||
|
rkey = key[::-1]
|
||||||
|
reversed_dict[rkey] = rvalue
|
||||||
|
molekule = product[::-1]
|
||||||
|
print(reversed_dict)
|
||||||
|
|
||||||
|
iteration = 0
|
||||||
|
while molekule != "e":
|
||||||
|
molekule = re.sub('|'.join(reversed_dict.keys()), rep, molekule)
|
||||||
|
if output_file is not None:
|
||||||
|
output_file.write(molekule + "\n")
|
||||||
|
return iteration
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
output_file = open("output.txt", "w")
|
||||||
test_input, test_molek = ["H => HO", "H => OH", "O => HH", "e => O", "e => H"], "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 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), test_molek) == 3
|
||||||
assert steps_to_medicine(convert_to_dict(test_input), "HOHOHO") == 6
|
# assert steps_to_medicine(convert_to_dict(test_input), "HOHOHO") == 6
|
||||||
|
# the tests above end in an infinite loop, because at a certain point it wants to replace the first H with e
|
||||||
print("All test passed")
|
print("All test passed")
|
||||||
|
|
||||||
puzzle_input = open("input.txt", "r").read().splitlines()
|
puzzle_input = open("input.txt", "r").read().splitlines()
|
||||||
output_file = open("output.txt", "w")
|
|
||||||
starting_molek = puzzle_input.pop()
|
starting_molek = puzzle_input.pop()
|
||||||
puzzle_input.pop()
|
puzzle_input.pop()
|
||||||
converted_dict = convert_to_dict(puzzle_input)
|
converted_dict = convert_to_dict(puzzle_input)
|
||||||
print("solution: ", convert_one_molek_num_pos_versions(converted_dict, starting_molek))
|
print("solution: ", convert_one_molek_num_pos_versions(converted_dict, starting_molek))
|
||||||
|
|
||||||
print("Part2: ")
|
print("Part2: ")
|
||||||
print("solution: ", steps_to_medicine(converted_dict, starting_molek, debug_print=True))
|
print("solution: ", steps_to_medicine(converted_dict, starting_molek))
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue