From 5e9a465064f1a882b8a81d4ece8ac45fd5ffa1dc Mon Sep 17 00:00:00 2001 From: daviddoji Date: Mon, 20 Jun 2022 20:45:56 +0200 Subject: [PATCH] [WIP]Solution to problem 11 in Python --- src/Year_2016/P11.py | 280 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 280 insertions(+) create mode 100644 src/Year_2016/P11.py diff --git a/src/Year_2016/P11.py b/src/Year_2016/P11.py new file mode 100644 index 0000000..56f9fc8 --- /dev/null +++ b/src/Year_2016/P11.py @@ -0,0 +1,280 @@ +# --- Day 11: Radioisotope Thermoelectric Generators --- + +# You come upon a column of four floors that have been entirely sealed off from +# the rest of the building except for a small dedicated lobby. There are some +# radiation warnings and a big sign which reads "Radioisotope Testing +# Facility". + +# According to the project status board, this facility is currently being used +# to experiment with Radioisotope Thermoelectric Generators (RTGs, or simply +# "generators") that are designed to be paired with specially-constructed +# microchips. Basically, an RTG is a highly radioactive rock that generates +# electricity through heat. + +# The experimental RTGs have poor radiation containment, so they're dangerously +# radioactive. The chips are prototypes and don't have normal radiation +# shielding, but they do have the ability to generate an electromagnetic +# radiation shield when powered. Unfortunately, they can only be powered by +# their corresponding RTG. An RTG powering a microchip is still dangerous to +# other microchips. + +# In other words, if a chip is ever left in the same area as another RTG, and +# it's not connected to its own RTG, the chip will be fried. Therefore, it is +# assumed that you will follow procedure and keep chips connected to their +# corresponding RTG when they're in the same room, and away from other RTGs +# otherwise. + +# These microchips sound very interesting and useful to your current +# activities, and you'd like to try to retrieve them. The fourth floor of the +# facility has an assembling machine which can make a self-contained, shielded +# computer for you to take with you - that is, if you can bring it all of the +# RTGs and microchips. + +# Within the radiation-shielded part of the facility (in which it's safe to +# have these pre-assembly RTGs), there is an elevator that can move between the +# four floors. Its capacity rating means it can carry at most yourself and two +# RTGs or microchips in any combination. (They're rigged to some heavy +# diagnostic equipment - the assembling machine will detach it for you.) As a +# security measure, the elevator will only function if it contains at least one +# RTG or microchip. The elevator always stops on each floor to recharge, and +# this takes long enough that the items within it and the items on that floor +# can irradiate each other. (You can prevent this if a Microchip and its +# Generator end up on the same floor in this way, as they can be connected +# while the elevator is recharging.) + +# You make some notes of the locations of each component of interest (your +# puzzle input). Before you don a hazmat suit and start moving things around, +# you'd like to have an idea of what you need to do. + +# When you enter the containment area, you and the elevator will start on the +# first floor. + +# For example, suppose the isolated area has the following arrangement: + +# The first floor contains a hydrogen-compatible microchip and a +# lithium-compatible microchip. +# The second floor contains a hydrogen generator. +# The third floor contains a lithium generator. +# The fourth floor contains nothing relevant. + +# As a diagram (F# for a Floor number, E for Elevator, H for Hydrogen, L for +# Lithium, M for Microchip, and G for Generator), the initial state looks like +# this: + +# F4 . . . . . +# F3 . . . LG . +# F2 . HG . . . +# F1 E . HM . LM + +# Then, to get everything up to the assembling machine on the fourth floor, the +# following steps could be taken: + +# Bring the Hydrogen-compatible Microchip to the second floor, which is +# safe because it can get power from the Hydrogen Generator: + +# F4 . . . . . +# F3 . . . LG . +# F2 E HG HM . . +# F1 . . . . LM + +# Bring both Hydrogen-related items to the third floor, which is safe +# because the Hydrogen-compatible microchip is getting power from its generator: + +# F4 . . . . . +# F3 E HG HM LG . +# F2 . . . . . +# F1 . . . . LM + +# Leave the Hydrogen Generator on floor three, but bring the +# Hydrogen-compatible Microchip back down with you so you can still use the elevator: + +# F4 . . . . . +# F3 . HG . LG . +# F2 E . HM . . +# F1 . . . . LM + +# At the first floor, grab the Lithium-compatible Microchip, which is safe +# because Microchips don't affect each other: + +# F4 . . . . . +# F3 . HG . LG . +# F2 . . . . . +# F1 E . HM . LM + +# Bring both Microchips up one floor, where there is nothing to fry them: + +# F4 . . . . . +# F3 . HG . LG . +# F2 E . HM . LM +# F1 . . . . . + +# Bring both Microchips up again to floor three, where they can be +# temporarily connected to their corresponding generators while the elevator +# recharges, preventing either of them from being fried: + +# F4 . . . . . +# F3 E HG HM LG LM +# F2 . . . . . +# F1 . . . . . + +# Bring both Microchips to the fourth floor: + +# F4 E . HM . LM +# F3 . HG . LG . +# F2 . . . . . +# F1 . . . . . + +# Leave the Lithium-compatible microchip on the fourth floor, but bring the +# Hydrogen-compatible one so you can still use the elevator; this is safe +# because although the Lithium Generator is on the destination floor, you can +# connect Hydrogen-compatible microchip to the Hydrogen Generator there: + +# F4 . . . . LM +# F3 E HG HM LG . +# F2 . . . . . +# F1 . . . . . + +# Bring both Generators up to the fourth floor, which is safe because you +# can connect the Lithium-compatible Microchip to the Lithium Generator upon +# arrival: + +# F4 E HG . LG LM +# F3 . . HM . . +# F2 . . . . . +# F1 . . . . . + +# Bring the Lithium Microchip with you to the third floor so you can use +# the elevator: + +# F4 . HG . LG . +# F3 E . HM . LM +# F2 . . . . . +# F1 . . . . . + +# Bring both Microchips to the fourth floor: + +# F4 E HG HM LG LM +# F3 . . . . . +# F2 . . . . . +# F1 . . . . . + +# In this arrangement, it takes 11 steps to collect all of the objects at the +# fourth floor for assembly. (Each elevator stop counts as one step, even if +# nothing is added to or removed from it.) + +# In your situation, what is the minimum number of steps required to bring all +# of the objects to the fourth floor? + +import re +from collections import defaultdict, deque, namedtuple + +part1 = [1, 1, 2, 3, 2, 3, 2, 3, 2, 3] +part2 = [1, 1, 2, 3, 2, 3, 2, 3, 2, 3, 1, 1, 1, 1] + +floor_re = re.compile(r"The (\w+) floor contains") +gen_re = re.compile(r"a (\w+) generator") +chip_re = re.compile(r"a (\w+)-compatible microchip") + + +def parse_entry(): + with open("files/P11.txt", "r") as f: + my_list = [] + for idx, my_input in enumerate(f.readlines()): + gens = gen_re.findall(my_input) + chips = chip_re.findall(my_input) + my_list.append((idx + 1, gens, chips)) + + print(my_list) + + +# # f - floors, e - elevator, s - steps +# State = namedtuple('State', ['f', 'e', 's']) + +# def valid(state): +# if not 1 <= state.e <= 4: +# return False + +# for idx, val in enumerate(state.f[1::2]): +# idx = idx * 2 + 1 +# if val != state.f[idx - 1] and any(val == i for i in state.f[0::2]): +# return False +# return True + +# def solved(state): +# return all(i == 4 for i in state.f) + + +# def generalize(state): +# generators = [sum(1 for v in state.f[::2] if v == floor) for floor in range(1, 5)] +# microchips = [sum(1 for v in state.f[1::2] if v == floor) for floor in range(1, 5)] + +# return ''.join(map(str, generators + microchips)) + str(state.e) + + +# def bfs(floor_config): +# bfs_q = deque() +# bfs_q.append(State(floor_config, 1, 0)) +# seen = set() +# while bfs_q: +# state = bfs_q.popleft() +# if solved(state): +# print(f"We need {state.s} steps") +# return +# if generalize(state) in seen or not valid(state): +# continue +# seen.add(generalize(state)) + + +# for idx in range(len(state.f)): +# i = state.f[idx] +# if i != state.e: # item can't be moved bc not in elevator +# continue +# state.f[idx] -= 1 +# bfs_q.append(State(list(state.f), state.e - 1, state.s + 1)) +# state.f[idx] += 2 +# bfs_q.append(State(list(state.f), state.e + 1, state.s + 1)) +# state.f[idx] -= 1 + +# for jdx in range(idx + 1, len(state.f)): +# if state.f[jdx] != state.e: +# continue +# state.f[jdx] -= 1 +# state.f[idx] -= 1 +# bfs_q.append(State(list(state.f), state.e - 1, +# state.s + 1)) +# state.f[jdx] += 2 +# state.f[idx] += 2 +# bfs_q.append(State(list(state.f), state.e + 1, +# state.s + 1)) +# state.f[jdx] -= 1 +# state.f[idx] -= 1 + + +# def part_1(): +# p1 = parse_entry() +# bfs(p1) + +# # --- Part Two --- + +# # You step into the cleanroom separating the lobby from the isolated area and +# # put on the hazmat suit. + +# # Upon entering the isolated containment area, however, you notice some extra +# # parts on the first floor that weren't listed on the record outside: + +# # An elerium generator. +# # An elerium-compatible microchip. +# # A dilithium generator. +# # A dilithium-compatible microchip. + +# # These work just like the other generators and microchips. You'll have to get +# # them up to assembly as well. + +# # What is the minimum number of steps required to bring all of the objects, +# # including these four new ones, to the fourth floor? + + +# if __name__ == '__main__': +# parse_entry() +# # bfs(part1) +# # bfs(part2)