[WIP]Solution to problem 11 in Python
This commit is contained in:
parent
49cc5f936e
commit
5e9a465064
|
@ -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)
|
Loading…
Reference in New Issue