From 8e4fbf44bc487a5c7201632fcc5b115e9cca065e Mon Sep 17 00:00:00 2001 From: Gerd Sattler Date: Fri, 7 Dec 2018 21:19:27 +0800 Subject: [PATCH] wooo day7 --- day7.exs | 64 +++++++++++++++++++++++++++++++++ input7.txt | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 165 insertions(+) create mode 100644 day7.exs create mode 100644 input7.txt diff --git a/day7.exs b/day7.exs new file mode 100644 index 0000000..ac4f224 --- /dev/null +++ b/day7.exs @@ -0,0 +1,64 @@ +defmodule DaySeven do + def part_one(input) do + deps = parse_input(input) + letters = Enum.map(?A..?Z, &(<<&1>>)) + Enum.reverse resolve_instructions(deps, letters, []) + end + + def part_two(input) do + deps = parse_input(input) + letters = Enum.map(?A..?Z, &(<<&1>>)) + resolve_workers(deps, letters, [], 5, 0) - 1 + end + + def parse_input(input) do + regex = ~r/Step (\w) must be finished before step (\w) can begin\./ + String.split(input, "\n") + |> Enum.filter(&(&1 != "")) + |> Enum.map(fn line -> + [[_, on, dep]] = Regex.scan(regex, line) + {on, dep} + end) + end + + def resolve_instructions([], [ letter ], acc), do: [letter | acc ] + def resolve_instructions(deps, remletters, acc) do + firsts = Enum.filter(remletters, fn letter -> not Enum.member?(Enum.map(deps, fn {_on, dep} -> dep end), letter) end) + [first | _ ] = firsts |> Enum.sort + rem = Enum.filter(deps, fn {on, _dep} -> on != first end) + rletters = Enum.filter(remletters, fn letter -> letter != first end) + resolve_instructions(rem, rletters, [first | acc]) + end + + def resolve_workers(_deps, [], _workers, _, acc), do: acc + def resolve_workers(deps, remletters, workers, maxworkers, acc) do + sworkers = Enum.map(workers, fn {task, time} -> {task, time - 1} end) + step_workers = Enum.filter(sworkers, fn {_, time} -> time != 0 end) + completed = Enum.filter(sworkers, fn {_, time} -> time == 0 end) + |> Enum.map(fn {task, _} -> task end) + uremletters = Enum.filter(remletters, &(not Enum.member?(completed, &1))) + udeps = Enum.filter(deps, fn {on, _dep} -> not Enum.member?(completed, on) end) + canwork = Enum.filter(uremletters, fn letter -> not Enum.member?(Enum.map(udeps, fn {_on, dep} -> dep end), letter) end) |> Enum.filter(fn letter -> not Enum.member?(Enum.map(step_workers, fn {task, _} -> task end), letter) end) + uworkers = if length(step_workers) < maxworkers and length(canwork) > 0 do + schedule_work(canwork, maxworkers - length(step_workers), step_workers) + else + step_workers + end + + # IO.puts "Move #{acc}, now working on #{Enum.map(uworkers, fn {task, time} -> "(#{task}: #{time})" end) |> Enum.join(", ")}" + resolve_workers(udeps, uremletters, uworkers, maxworkers, acc + 1) + end + + def schedule_work([], _, workers), do: workers + def schedule_work(_, 0, workers), do: workers + def schedule_work([work | tail], numworkers, workers) do + schedule_work(tail, numworkers - 1, [{work, time_taken(work)} | workers]) + end + + def time_taken(<< letter >>), do: letter - 4 +end + +{:ok, content} = File.read("input7.txt") + +IO.puts("Part 1: #{DaySeven.part_one(content)}") +IO.puts("Part 2: #{DaySeven.part_two(content)}") diff --git a/input7.txt b/input7.txt new file mode 100644 index 0000000..3c7b77e --- /dev/null +++ b/input7.txt @@ -0,0 +1,101 @@ +Step X must be finished before step C can begin. +Step C must be finished before step G can begin. +Step F must be finished before step G can begin. +Step U must be finished before step Y can begin. +Step O must be finished before step S can begin. +Step D must be finished before step N can begin. +Step M must be finished before step H can begin. +Step J must be finished before step Q can begin. +Step G must be finished before step R can begin. +Step I must be finished before step N can begin. +Step R must be finished before step K can begin. +Step A must be finished before step Z can begin. +Step Y must be finished before step L can begin. +Step H must be finished before step P can begin. +Step K must be finished before step S can begin. +Step Z must be finished before step P can begin. +Step T must be finished before step S can begin. +Step N must be finished before step P can begin. +Step E must be finished before step S can begin. +Step S must be finished before step W can begin. +Step W must be finished before step V can begin. +Step L must be finished before step V can begin. +Step P must be finished before step B can begin. +Step Q must be finished before step V can begin. +Step B must be finished before step V can begin. +Step P must be finished before step Q can begin. +Step S must be finished before step V can begin. +Step C must be finished before step Q can begin. +Step I must be finished before step H can begin. +Step A must be finished before step E can begin. +Step H must be finished before step Q can begin. +Step G must be finished before step V can begin. +Step N must be finished before step L can begin. +Step R must be finished before step Q can begin. +Step W must be finished before step L can begin. +Step X must be finished before step L can begin. +Step X must be finished before step J can begin. +Step W must be finished before step P can begin. +Step U must be finished before step B can begin. +Step P must be finished before step V can begin. +Step O must be finished before step P can begin. +Step W must be finished before step Q can begin. +Step S must be finished before step Q can begin. +Step U must be finished before step Z can begin. +Step Z must be finished before step T can begin. +Step M must be finished before step T can begin. +Step A must be finished before step P can begin. +Step Z must be finished before step B can begin. +Step N must be finished before step S can begin. +Step H must be finished before step N can begin. +Step J must be finished before step E can begin. +Step M must be finished before step J can begin. +Step R must be finished before step A can begin. +Step A must be finished before step Y can begin. +Step F must be finished before step V can begin. +Step L must be finished before step P can begin. +Step K must be finished before step L can begin. +Step F must be finished before step P can begin. +Step G must be finished before step L can begin. +Step I must be finished before step Q can begin. +Step C must be finished before step L can begin. +Step I must be finished before step Y can begin. +Step G must be finished before step B can begin. +Step H must be finished before step L can begin. +Step X must be finished before step U can begin. +Step I must be finished before step K can begin. +Step R must be finished before step N can begin. +Step I must be finished before step L can begin. +Step M must be finished before step I can begin. +Step K must be finished before step V can begin. +Step G must be finished before step E can begin. +Step F must be finished before step B can begin. +Step O must be finished before step Y can begin. +Step Y must be finished before step Q can begin. +Step F must be finished before step K can begin. +Step N must be finished before step W can begin. +Step O must be finished before step R can begin. +Step N must be finished before step E can begin. +Step M must be finished before step V can begin. +Step H must be finished before step T can begin. +Step Y must be finished before step T can begin. +Step F must be finished before step J can begin. +Step F must be finished before step O can begin. +Step W must be finished before step B can begin. +Step T must be finished before step E can begin. +Step T must be finished before step P can begin. +Step F must be finished before step M can begin. +Step U must be finished before step I can begin. +Step H must be finished before step S can begin. +Step S must be finished before step P can begin. +Step T must be finished before step W can begin. +Step A must be finished before step N can begin. +Step O must be finished before step N can begin. +Step L must be finished before step B can begin. +Step U must be finished before step K can begin. +Step Z must be finished before step W can begin. +Step X must be finished before step D can begin. +Step Z must be finished before step L can begin. +Step I must be finished before step T can begin. +Step O must be finished before step W can begin. +Step I must be finished before step B can begin.