[WIP]Solution to problem 11 in Python

This commit is contained in:
David Doblas Jiménez 2022-06-20 20:45:56 +02:00
parent 49cc5f936e
commit 5e9a465064
1 changed files with 280 additions and 0 deletions

280
src/Year_2016/P11.py Normal file
View File

@ -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)