From e8ef4a7c51343634e8a58a0770a594476724e2fe Mon Sep 17 00:00:00 2001 From: Seongbeom Park Date: Sun, 6 Feb 2022 01:24:36 +0900 Subject: [PATCH] finish level4/escape-pods --- README.md | 5 +++++ level4/escape-pods/solution.py | 31 +++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 level4/escape-pods/solution.py diff --git a/README.md b/README.md index e063cf9..3d06179 100644 --- a/README.md +++ b/README.md @@ -18,3 +18,8 @@ ### running-with-bunnies * Completed in: 1 day, 4 hrs, 40 mins, 40 secs. * Shortest Paths + +## Level4 +### escape-pods +* Completed in: 1 day, 2 hrs, 16 mins, 11 secs. +* Minimum cut diff --git a/level4/escape-pods/solution.py b/level4/escape-pods/solution.py new file mode 100644 index 0000000..63a7f15 --- /dev/null +++ b/level4/escape-pods/solution.py @@ -0,0 +1,31 @@ +import numpy as np + +def solution(entrances, exits, path): + p = np.array(path) + minimum_width = -1 + all_rooms = set(range(len(p))) + for rooms, others in generate_rooms(all_rooms, set(entrances), set(exits), p): + width = calculate_cut_width(rooms, others, p) + if width < minimum_width or minimum_width == -1: + minimum_width = width + return minimum_width + +def generate_rooms(all_rooms, prev_rooms, exits, path): + yield prev_rooms, all_rooms - set(prev_rooms) + for room, width in enumerate(sum(path[list(prev_rooms)])): + if room not in prev_rooms and room not in exits and width != 0: + next_rooms = prev_rooms | set([room]) + for result in generate_rooms(all_rooms, next_rooms, exits, path): + yield result + +def calculate_cut_width(rooms, others, p): + return np.sum(p[list(rooms)][:, list(others)]) + +tests = [ + [[[0], [3], [[0, 7, 0, 0], [0, 0, 6, 0], [0, 0, 0, 8], [9, 0, 0, 0]]], 6], + [[[0, 1], [4, 5], [[0, 0, 4, 6, 0, 0], [0, 0, 5, 2, 0, 0], [0, 0, 0, 0, 4, 4], [0, 0, 0, 0, 6, 6], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]], 16], + ] + +for test in tests: + result = solution(*test[0]) + print(test[0], result == test[1], result, test[1])