Advertisement
Guest User

Untitled

a guest
Apr 26th, 2019
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.17 KB | None | 0 0
  1. data = [
  2.     {
  3.         "filename": "input_files/AoC2015_day19_input.txt",
  4.         "string": "CRnCaSiRnBSiRnFArTiBPTiTiBFArPBCaSiThSiRnTiBPBPMgArCaSiRnTiMgArCaSiThCaSiRnFArRnSiRnFArTiTiBFArCaCaSiRnSiThCaCaSiRnMgArFYSiRnFYCaFArSiThCaSiThPBPTiMgArCaPRnSiAlArPBCaCaSiRnFYSiThCaRnFArArCaCaSiRnPBSiRnFArMgYCaCaCaCaSiThCaCaSiAlArCaCaSiRnPBSiAlArBCaCaCaCaSiThCaPBSiThPBPBCaSiRnFYFArSiThCaSiRnFArBCaCaSiRnFYFArSiThCaPBSiThCaSiRnPMgArRnFArPTiBCaPRnFArCaCaCaCaSiRnCaCaSiRnFYFArFArBCaSiThFArThSiThSiRnTiRnPMgArFArCaSiThCaPBCaSiRnBFArCaCaPRnCaCaPMgArSiRnFYFArCaSiThRnPBPMgAr"
  5.      },
  6.     {
  7.         "filename": "input_files/AoC2015_day19_input_alt1.txt",
  8.         "string": "CRnSiRnCaPTiMgYCaPTiRnFArSiThFArCaSiThSiThPBCaCaSiRnSiRnTiTiMgArPBCaPMgYPTiRnFArFArCaSiRnBPMgArPRnCaPTiRnFArCaSiThCaCaFArPBCaCaPTiTiRnFArCaSiRnSiAlYSiThRnFArArCaSiRnBFArCaCaSiRnSiThCaCaCaFYCaPTiBCaSiThCaSiThPMgArSiRnCaPBFYCaCaFArCaCaCaCaSiThCaSiRnPRnFArPBSiThPRnFArSiRnMgArCaFYFArCaSiRnSiAlArTiTiTiTiTiTiTiRnPMgArPTiTiTiBSiRnSiAlArTiTiRnPMgArCaFYBPBPTiRnSiRnMgArSiThCaFArCaSiThFArPRnFArCaSiRnTiBSiThSiRnSiAlYCaFArPRnFArSiThCaFArCaCaSiThCaCaCaSiRnPRnCaFArFYPMgArCaPBCaPBSiRnFYPBCaFArCaSiAl"
  9.      },
  10.     {
  11.         "filename": "input_files/AoC2015_day19_input_alt2.txt",
  12.         "string": "CRnSiRnCaPTiMgYCaPTiRnFArSiThFArCaSiThSiThPBCaCaSiRnSiRnTiTiMgArPBCaPMgYPTiRnFArFArCaSiRnBPMgArPRnCaPTiRnFArCaSiThCaCaFArPBCaCaPTiTiRnFArCaSiRnSiAlYSiThRnFArArCaSiRnBFArCaCaSiRnSiThCaCaCaFYCaPTiBCaSiThCaSiThPMgArSiRnCaPBFYCaCaFArCaCaCaCaSiThCaSiRnPRnFArPBSiThPRnFArSiRnMgArCaFYFArCaSiRnSiAlArTiTiTiTiTiTiTiRnPMgArPTiTiTiBSiRnSiAlArTiTiRnPMgArCaFYBPBPTiRnSiRnMgArSiThCaFArCaSiThFArPRnFArCaSiRnTiBSiThSiRnSiAlYCaFArPRnFArSiThCaFArCaCaSiThCaCaCaSiRnPRnCaFArFYPMgArCaPBCaPBSiRnFYPBCaFArCaSiAl"
  13.      },
  14.     {
  15.         "filename": "input_files/AoC2015_day19_input_alt3.txt",
  16.         "string": "CRnCaCaCaSiRnBPTiMgArSiRnSiRnMgArSiRnCaFArTiTiBSiThFYCaFArCaCaSiThCaPBSiThSiThCaCaPTiRnPBSiThRnFArArCaCaSiThCaSiThSiRnMgArCaPTiBPRnFArSiThCaSiRnFArBCaSiRnCaPRnFArPMgYCaFArCaPTiTiTiBPBSiThCaPTiBPBSiRnFArBPBSiRnCaFArBPRnSiRnFArRnSiRnBFArCaFArCaCaCaSiThSiThCaCaPBPTiTiRnFArCaPTiBSiAlArPBCaCaCaCaCaSiRnMgArCaSiThFArThCaSiThCaSiRnCaFYCaSiRnFYFArFArCaSiRnFYFArCaSiRnBPMgArSiThPRnFArCaSiRnFArTiRnSiRnFYFArCaSiRnBFArCaSiRnTiMgArSiThCaSiThCaFArPRnFArSiRnFArTiTiTiTiBCaCaSiRnCaCaFYFArSiThCaPTiBPTiBCaSiThSiRnMgArCaF"
  17.      },
  18.     {
  19.         "filename": "input_files/AoC2015_day19_input_alt4.txt",
  20.         "string": "ORnPBPMgArCaCaCaSiThCaCaSiThCaCaPBSiRnFArRnFArCaCaSiThCaCaSiThCaCaCaCaCaCaSiRnFYFArSiRnMgArCaSiRnPTiTiBFYPBFArSiRnCaSiRnTiRnFArSiAlArPTiBPTiRnCaSiAlArCaPTiTiBPMgYFArPTiRnFArSiRnCaCaFArRnCaFArCaSiRnSiRnMgArFYCaSiRnMgArCaCaSiThPRnFArPBCaSiRnMgArCaCaSiThCaSiRnTiMgArFArSiThSiThCaCaSiRnMgArCaCaSiRnFArTiBPTiRnCaSiAlArCaPTiRnFArPBPBCaCaSiThCaPBSiThPRnFArSiThCaSiThCaSiThCaPTiBSiRnFYFArCaCaPRnFArPBCaCaPBSiRnTiRnFArCaPRnFArSiRnCaCaCaSiThCaRnCaFArYCaSiRnFArBCaCaCaSiThFArPBFArCaSiRnFArRnCaCaCaFArSiRnFArTiRnPMgArF"
  21.      },
  22.     {
  23.         "filename": "input_files/AoC2015_day19_input_alt5.txt",
  24.         "string": "CRnCaSiRnBSiRnFArTiBPTiTiBFArPBCaSiThSiRnTiBPBPMgArCaSiRnTiMgArCaSiThCaSiRnFArRnSiRnFArTiTiBFArCaCaSiRnSiThCaCaSiRnMgArFYSiRnFYCaFArSiThCaSiThPBPTiMgArCaPRnSiAlArPBCaCaSiRnFYSiThCaRnFArArCaCaSiRnPBSiRnFArMgYCaCaCaCaSiThCaCaSiAlArCaCaSiRnPBSiAlArBCaCaCaCaSiThCaPBSiThPBPBCaSiRnFYFArSiThCaSiRnFArBCaCaSiRnFYFArSiThCaPBSiThCaSiRnPMgArRnFArPTiBCaPRnFArCaCaCaCaSiRnCaCaSiRnFYFArFArBCaSiThFArThSiThSiRnTiRnPMgArFArCaSiThCaPBCaSiRnBFArCaCaPRnCaCaPMgArSiRnFYFArCaSiThRnPBPMgAr"
  25.      }
  26. ]
  27.  
  28. ind = 0
  29.  
  30. f = open(data[0]["filename"])
  31. input_text = f.read().split("\n")
  32. f.close()
  33.  
  34. string = data[ind]["string"]
  35.  
  36. rep_rules = {}
  37. rev_rules = {}
  38.  
  39. for line in input_text:
  40.     rep = line.split(" => ")
  41.  
  42.     rev_rules.update({rep[1]: rep[0]})
  43.  
  44.     if rep[0] not in rep_rules.keys():
  45.         rep_rules.update({rep[0]: []})
  46.     rep_rules[rep[0]].append(rep[1])
  47.  
  48. """
  49. Part 1
  50.  
  51. replacements = []
  52. start = ""
  53.  
  54. while len(string) > 0:
  55.    match = False
  56.    for atom in rep_rules.keys():
  57.        if string.startswith(atom):
  58.            match = True
  59.            string = string[len(atom):]
  60.            for rep in rep_rules[atom]:
  61.                replacements.append(start + rep + string)
  62.            start += atom
  63.            break
  64.  
  65.    if not match:
  66.        start += string[0]
  67.        string = string[1:]
  68.  
  69. replacements = list(dict.fromkeys(replacements))
  70.  
  71. print(len(replacements))
  72. """
  73.  
  74. products = list(rev_rules.keys())
  75.  
  76.  
  77. def separate(string):
  78.     result = []
  79.  
  80.     while len(string) > 1:
  81.         if string[1].islower():
  82.             result.append(string[0:2])
  83.             string = string[2:]
  84.         else:
  85.             result.append(string[0:1])
  86.             string = string[1:]
  87.  
  88.     if len(string) > 0:
  89.         result.append(string)
  90.  
  91.     return result
  92.  
  93.  
  94. starters = []
  95. enders = []
  96.  
  97. for mol in rev_rules.keys():
  98.     temp = separate(mol)
  99.     if temp[0] not in starters:
  100.         starters.append(temp[0])
  101.     if temp[-1] not in enders:
  102.         enders.append(temp[-1])
  103.  
  104. joints = []
  105.  
  106. for ender in enders:
  107.     for starter in starters:
  108.         joints.append(ender + starter)
  109.  
  110. for mol in rev_rules.keys():
  111.     for j in joints:
  112.         if j in mol:
  113.             joints.remove(j)
  114.  
  115.  
  116. def chunks(string):
  117.     sep_string = separate(string)
  118.     result = [""]
  119.     ind = 0
  120.  
  121.     for i in range(len(sep_string) - 1):
  122.         result[ind] += sep_string[i]
  123.         if sep_string[i] + sep_string[i + 1] in joints:
  124.             ind += 1
  125.             result.append("")
  126.     result[ind] += sep_string[-1]
  127.  
  128.     return result
  129.  
  130.  
  131. def reduce(in_dict):
  132.     result = [in_dict]
  133.     finished = False
  134.  
  135.     while not finished:
  136.         finished = True
  137.         for i in range(len(result)):
  138.             comp = result.pop(0)
  139.             comp_str = comp["string"]
  140.             match = False
  141.             for product in products:
  142.                 ind = comp_str.find(product)
  143.                 while ind > -1:
  144.                     rep = {"string": comp_str[0:ind] + rev_rules[product] + comp_str[ind + len(product):],
  145.                            "count": comp["count"] + 1}
  146.                     if rep not in result:
  147.                         result.append(rep)
  148.                     match = True
  149.                     finished = False
  150.                     ind = comp_str.find(product, ind+1)
  151.             if not match:
  152.                 result.append(comp)
  153.  
  154.     return result
  155.  
  156.  
  157. def split_and_reduce(in_dict):
  158.     results = [{"string": "", "count": in_dict["count"]}]
  159.  
  160.     for chunk in chunks(in_dict["string"]):
  161.         reductions = reduce({"string": chunk, "count": 0})
  162.         for i in range(len(results)):
  163.             result = results.pop(0)
  164.             for reduction in reductions:
  165.                 results.append({"string": result["string"] + reduction["string"],
  166.                                 "count": result["count"] + reduction["count"]})
  167.  
  168.     return results
  169.  
  170.  
  171. stuff = [{"string": string, "count": 0}]
  172. done = False
  173.  
  174. print(stuff[0])
  175.  
  176. while not done:
  177.     print(" ")
  178.     for i in range(len(stuff)):
  179.         for r in split_and_reduce(stuff.pop(0)):
  180.             if r not in stuff:
  181.                 stuff.append(r)
  182.  
  183.     for elem in stuff:
  184.         print(elem)
  185.         if elem["string"] == "e":
  186.             done = True
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement