day7
This commit is contained in:
parent
d06708a9a2
commit
fb185bc74f
|
@ -0,0 +1,116 @@
|
|||
points = (ARGV.empty? ? DATA : ARGF).each_line.map { |l|
|
||||
l.split(', ').map(&:to_i).freeze
|
||||
}.freeze
|
||||
|
||||
ymin, ymax = points.map(&:first).minmax
|
||||
xmin, xmax = points.map(&:last).minmax
|
||||
|
||||
owned = [0] * points.size
|
||||
infinite = [false] * points.size
|
||||
within = 0
|
||||
|
||||
# Part 1
|
||||
# Calculate closest labeled point for all points within the bounding box.
|
||||
# Anything that keeps growing beyond the box we'll call "infinite"
|
||||
#
|
||||
# Theretically, we *should* allow a margin to deal w/ cases like this:
|
||||
# A B
|
||||
# C
|
||||
# D
|
||||
# ... even though no such margin is necessary for my input.
|
||||
#
|
||||
# So I'll just arbitrarily set a small one.
|
||||
#
|
||||
# (Do part 2 while we're here too)
|
||||
MARGIN = 2
|
||||
yrange = (ymin - MARGIN * 2)..(ymax + MARGIN * 2)
|
||||
xrange = (xmin - MARGIN * 2)..(xmax + MARGIN * 2)
|
||||
yrange.each { |y|
|
||||
inside_y = ((ymin - MARGIN)..(ymax + MARGIN)).cover?(y)
|
||||
edge_y = y == yrange.begin || y == yrange.end
|
||||
|
||||
xrange.each { |x|
|
||||
best_dist = 1.0 / 0.0
|
||||
best = nil
|
||||
dist_sum = 0
|
||||
|
||||
points.each_with_index { |(yy, xx), i|
|
||||
dist_sum += dist = (yy - y).abs + (xx - x).abs
|
||||
if dist < best_dist
|
||||
best = i
|
||||
best_dist = dist
|
||||
elsif dist == best_dist
|
||||
best = nil
|
||||
end
|
||||
}
|
||||
|
||||
if dist_sum < 10000
|
||||
within += 1
|
||||
edge_x = x == xrange.begin || x == xrange.end
|
||||
puts "DANGER! SAFE ON EDGE #{y}, #{x}" if edge_y || edge_x
|
||||
end
|
||||
|
||||
next unless best
|
||||
|
||||
if inside_y && ((xmin - MARGIN)..(xmax + MARGIN)).cover?(x)
|
||||
owned[best] += 1
|
||||
else
|
||||
infinite[best] = true
|
||||
end
|
||||
}
|
||||
}
|
||||
|
||||
puts owned.zip(infinite).reject(&:last).map(&:first).max
|
||||
puts within
|
||||
|
||||
__END__
|
||||
267, 196
|
||||
76, 184
|
||||
231, 301
|
||||
241, 76
|
||||
84, 210
|
||||
186, 243
|
||||
251, 316
|
||||
265, 129
|
||||
142, 124
|
||||
107, 134
|
||||
265, 191
|
||||
216, 226
|
||||
67, 188
|
||||
256, 211
|
||||
317, 166
|
||||
110, 41
|
||||
347, 332
|
||||
129, 91
|
||||
217, 327
|
||||
104, 57
|
||||
332, 171
|
||||
257, 287
|
||||
230, 105
|
||||
131, 209
|
||||
110, 282
|
||||
263, 146
|
||||
113, 217
|
||||
193, 149
|
||||
280, 71
|
||||
357, 160
|
||||
356, 43
|
||||
321, 123
|
||||
272, 70
|
||||
171, 49
|
||||
288, 196
|
||||
156, 139
|
||||
268, 163
|
||||
188, 141
|
||||
156, 182
|
||||
199, 242
|
||||
330, 47
|
||||
89, 292
|
||||
351, 329
|
||||
292, 353
|
||||
290, 158
|
||||
167, 116
|
||||
268, 235
|
||||
124, 139
|
||||
116, 119
|
||||
142, 259
|
|
@ -0,0 +1,155 @@
|
|||
TEST = ARGV.delete('-t')
|
||||
VERBOSE = ARGV.delete('-v')
|
||||
|
||||
def work(deps, parallelism, work_factor)
|
||||
remaining = deps.flatten.uniq
|
||||
|
||||
doable = -> {
|
||||
remaining.select { |t|
|
||||
deps.none? { |_, y| y == t }
|
||||
}.min
|
||||
}
|
||||
|
||||
goal = remaining.size
|
||||
done = ''
|
||||
# each element is [task_id, finish_time]
|
||||
workers = [nil] * parallelism
|
||||
deps = deps.dup
|
||||
|
||||
0.step { |t|
|
||||
# Has anyone finished a task?
|
||||
workers.each_with_index { |(task, finish_time), i|
|
||||
next unless finish_time&.<=(t)
|
||||
done << task
|
||||
workers[i] = nil
|
||||
deps.reject! { |x, _| x == task }
|
||||
puts "t=#{t} worker #{i} finishes #{task}" if VERBOSE
|
||||
}
|
||||
# Assign tasks to anyone free
|
||||
workers.each_index { |i|
|
||||
next if workers[i]
|
||||
break unless (todo = doable[])
|
||||
finish_time = t + work_factor + todo.ord - ?A.ord
|
||||
puts "t=#{t} assign task #{todo} to #{i}, finishes at #{finish_time}" if VERBOSE
|
||||
workers[i] = [todo, finish_time]
|
||||
remaining.delete(todo)
|
||||
}
|
||||
break [done, t] if done.size == goal
|
||||
}
|
||||
end
|
||||
|
||||
deps = (ARGV.empty? ? DATA : ARGF).each_line.map { |l|
|
||||
l.scan(/[A-Z]/).drop(1).freeze
|
||||
}.freeze
|
||||
|
||||
if TEST
|
||||
deps = %w(CA CF AB AD BE DE FE).map(&:chars).map(&:freeze).freeze
|
||||
puts work(deps, 1, -30)[0]
|
||||
puts work(deps, 2, 1)[1]
|
||||
else
|
||||
puts work(deps, 1, -30)[0]
|
||||
puts work(deps, 5, 61)[1]
|
||||
end
|
||||
|
||||
__END__
|
||||
Step T must be finished before step X can begin.
|
||||
Step G must be finished before step O can begin.
|
||||
Step X must be finished before step B can begin.
|
||||
Step I must be finished before step W can begin.
|
||||
Step N must be finished before step V can begin.
|
||||
Step K must be finished before step H can begin.
|
||||
Step S must be finished before step R can begin.
|
||||
Step P must be finished before step J can begin.
|
||||
Step L must be finished before step V can begin.
|
||||
Step D must be finished before step E can begin.
|
||||
Step J must be finished before step R can begin.
|
||||
Step U must be finished before step W can begin.
|
||||
Step M must be finished before step Q can begin.
|
||||
Step B must be finished before step F can begin.
|
||||
Step F must be finished before step E can begin.
|
||||
Step V must be finished before step Q can begin.
|
||||
Step C must be finished before step A can begin.
|
||||
Step H must be finished before step Z can begin.
|
||||
Step A must be finished before step Y can begin.
|
||||
Step O must be finished before step Y can begin.
|
||||
Step W must be finished before step Q can begin.
|
||||
Step E must be finished before step Y can begin.
|
||||
Step Y must be finished before step Z can begin.
|
||||
Step Q must be finished before step R can begin.
|
||||
Step R must be finished before step Z can begin.
|
||||
Step S must be finished before step E can begin.
|
||||
Step O must be finished before step W can begin.
|
||||
Step G must be finished before step B can begin.
|
||||
Step I must be finished before step N can begin.
|
||||
Step G must be finished before step I can begin.
|
||||
Step H must be finished before step R can begin.
|
||||
Step N must be finished before step C can begin.
|
||||
Step M must be finished before step W can begin.
|
||||
Step Y must be finished before step R can begin.
|
||||
Step T must be finished before step B can begin.
|
||||
Step G must be finished before step D can begin.
|
||||
Step J must be finished before step O can begin.
|
||||
Step I must be finished before step A can begin.
|
||||
Step J must be finished before step H can begin.
|
||||
Step T must be finished before step Y can begin.
|
||||
Step N must be finished before step H can begin.
|
||||
Step B must be finished before step V can begin.
|
||||
Step M must be finished before step R can begin.
|
||||
Step Y must be finished before step Q can begin.
|
||||
Step X must be finished before step J can begin.
|
||||
Step A must be finished before step E can begin.
|
||||
Step P must be finished before step Z can begin.
|
||||
Step P must be finished before step C can begin.
|
||||
Step N must be finished before step Q can begin.
|
||||
Step A must be finished before step O can begin.
|
||||
Step G must be finished before step X can begin.
|
||||
Step P must be finished before step U can begin.
|
||||
Step T must be finished before step S can begin.
|
||||
Step I must be finished before step V can begin.
|
||||
Step V must be finished before step H can begin.
|
||||
Step U must be finished before step F can begin.
|
||||
Step D must be finished before step Q can begin.
|
||||
Step D must be finished before step O can begin.
|
||||
Step G must be finished before step H can begin.
|
||||
Step I must be finished before step Z can begin.
|
||||
Step N must be finished before step D can begin.
|
||||
Step B must be finished before step Y can begin.
|
||||
Step J must be finished before step M can begin.
|
||||
Step V must be finished before step Y can begin.
|
||||
Step W must be finished before step Y can begin.
|
||||
Step E must be finished before step Z can begin.
|
||||
Step T must be finished before step N can begin.
|
||||
Step L must be finished before step U can begin.
|
||||
Step S must be finished before step A can begin.
|
||||
Step Q must be finished before step Z can begin.
|
||||
Step T must be finished before step F can begin.
|
||||
Step F must be finished before step Z can begin.
|
||||
Step J must be finished before step C can begin.
|
||||
Step X must be finished before step Y can begin.
|
||||
Step K must be finished before step V can begin.
|
||||
Step T must be finished before step I can begin.
|
||||
Step I must be finished before step O can begin.
|
||||
Step C must be finished before step W can begin.
|
||||
Step B must be finished before step Q can begin.
|
||||
Step W must be finished before step Z can begin.
|
||||
Step D must be finished before step H can begin.
|
||||
Step K must be finished before step A can begin.
|
||||
Step M must be finished before step E can begin.
|
||||
Step T must be finished before step U can begin.
|
||||
Step I must be finished before step J can begin.
|
||||
Step O must be finished before step Q can begin.
|
||||
Step M must be finished before step Z can begin.
|
||||
Step U must be finished before step C can begin.
|
||||
Step N must be finished before step F can begin.
|
||||
Step C must be finished before step H can begin.
|
||||
Step X must be finished before step E can begin.
|
||||
Step F must be finished before step O can begin.
|
||||
Step P must be finished before step O can begin.
|
||||
Step J must be finished before step A can begin.
|
||||
Step H must be finished before step Y can begin.
|
||||
Step A must be finished before step Q can begin.
|
||||
Step V must be finished before step Z can begin.
|
||||
Step S must be finished before step L can begin.
|
||||
Step H must be finished before step E can begin.
|
||||
Step X must be finished before step I can begin.
|
||||
Step O must be finished before step R can begin.
|
|
@ -0,0 +1,22 @@
|
|||
defmodule Day6 do
|
||||
@margin 2
|
||||
|
||||
def input() do
|
||||
File.stream!("input/day6.in")
|
||||
|> Enum.map(fn x ->
|
||||
x
|
||||
|> String.split(", ")
|
||||
|> Enum.map(&String.to_integer(String.trim(&1)))
|
||||
end)
|
||||
end
|
||||
|
||||
def part1() do
|
||||
{xmin, xmax} = Enum.map(input(), &hd/1) |> Enum.min_max()
|
||||
{ymin, ymax} = Enum.map(input(), &tl/1) |> Enum.min_max()
|
||||
|
||||
input()
|
||||
|> IO.inspect(label: "xmin: #{xmin}, xmax: #{xmax}, ymin: #{ymin}, ymax: #{ymax}")
|
||||
end
|
||||
end
|
||||
|
||||
Day6.part1()
|
|
@ -0,0 +1,55 @@
|
|||
defmodule Day7 do
|
||||
def input() do
|
||||
File.stream!("input/day7.in")
|
||||
|> Enum.map(fn x ->
|
||||
Regex.scan(~r/[A-Z]/, x)
|
||||
|> Enum.drop(1)
|
||||
|> Enum.map(&hd/1)
|
||||
end)
|
||||
end
|
||||
|
||||
def part1() do
|
||||
input()
|
||||
|> IO.inspect()
|
||||
|> work(1, -30)
|
||||
|> Enum.at(0)
|
||||
end
|
||||
|
||||
def part2() do
|
||||
input()
|
||||
|> work(5, 61)
|
||||
|> Enum.at(1)
|
||||
end
|
||||
|
||||
def work(deps, paral, factor) do
|
||||
remaining =
|
||||
deps
|
||||
|> flatten()
|
||||
|> Enum.uniq()
|
||||
|
||||
doable = fn ->
|
||||
remaining
|
||||
|> Enum.find(fn x ->
|
||||
!Enum.any?(fn _, y -> y == x)
|
||||
end)
|
||||
|> Enum.min()
|
||||
end
|
||||
|
||||
goal = length(remaining)
|
||||
done = ""
|
||||
workers = List.duplicate(nil, paral)
|
||||
|
||||
Enum.reduce_while(deps, [], fn t, acc ->
|
||||
|
||||
end)
|
||||
end
|
||||
|
||||
def flatten(list), do: flatten(list, []) |> Enum.reverse()
|
||||
def flatten([h | t], acc) when h == [], do: flatten(t, acc)
|
||||
def flatten([h | t], acc) when is_list(h), do: flatten(t, flatten(h, acc))
|
||||
def flatten([h | t], acc), do: flatten(t, [h | acc])
|
||||
def flatten([], acc), do: acc
|
||||
end
|
||||
|
||||
IO.puts(Day7.part1())
|
||||
IO.puts(Day7.part2())
|
|
@ -0,0 +1,50 @@
|
|||
267, 196
|
||||
76, 184
|
||||
231, 301
|
||||
241, 76
|
||||
84, 210
|
||||
186, 243
|
||||
251, 316
|
||||
265, 129
|
||||
142, 124
|
||||
107, 134
|
||||
265, 191
|
||||
216, 226
|
||||
67, 188
|
||||
256, 211
|
||||
317, 166
|
||||
110, 41
|
||||
347, 332
|
||||
129, 91
|
||||
217, 327
|
||||
104, 57
|
||||
332, 171
|
||||
257, 287
|
||||
230, 105
|
||||
131, 209
|
||||
110, 282
|
||||
263, 146
|
||||
113, 217
|
||||
193, 149
|
||||
280, 71
|
||||
357, 160
|
||||
356, 43
|
||||
321, 123
|
||||
272, 70
|
||||
171, 49
|
||||
288, 196
|
||||
156, 139
|
||||
268, 163
|
||||
188, 141
|
||||
156, 182
|
||||
199, 242
|
||||
330, 47
|
||||
89, 292
|
||||
351, 329
|
||||
292, 353
|
||||
290, 158
|
||||
167, 116
|
||||
268, 235
|
||||
124, 139
|
||||
116, 119
|
||||
142, 259
|
|
@ -0,0 +1,101 @@
|
|||
Step Q must be finished before step I can begin.
|
||||
Step B must be finished before step M can begin.
|
||||
Step R must be finished before step F can begin.
|
||||
Step G must be finished before step S can begin.
|
||||
Step M must be finished before step A can begin.
|
||||
Step Z must be finished before step W can begin.
|
||||
Step J must be finished before step C can begin.
|
||||
Step K must be finished before step O can begin.
|
||||
Step C must be finished before step I can begin.
|
||||
Step Y must be finished before step L can begin.
|
||||
Step N must be finished before step P can begin.
|
||||
Step S must be finished before step X can begin.
|
||||
Step E must be finished before step U can begin.
|
||||
Step U must be finished before step V can begin.
|
||||
Step D must be finished before step F can begin.
|
||||
Step W must be finished before step H can begin.
|
||||
Step T must be finished before step I can begin.
|
||||
Step H must be finished before step V can begin.
|
||||
Step L must be finished before step O can begin.
|
||||
Step P must be finished before step A can begin.
|
||||
Step A must be finished before step I can begin.
|
||||
Step F must be finished before step O can begin.
|
||||
Step V must be finished before step X can begin.
|
||||
Step I must be finished before step O can begin.
|
||||
Step X must be finished before step O can begin.
|
||||
Step F must be finished before step V can begin.
|
||||
Step L must be finished before step P can begin.
|
||||
Step Y must be finished before step P can begin.
|
||||
Step Y must be finished before step X can begin.
|
||||
Step Y must be finished before step O can begin.
|
||||
Step D must be finished before step A can begin.
|
||||
Step T must be finished before step F can begin.
|
||||
Step W must be finished before step X can begin.
|
||||
Step R must be finished before step A can begin.
|
||||
Step E must be finished before step F can begin.
|
||||
Step H must be finished before step I can begin.
|
||||
Step K must be finished before step Y can begin.
|
||||
Step W must be finished before step P can begin.
|
||||
Step V must be finished before step O can begin.
|
||||
Step N must be finished before step E can begin.
|
||||
Step L must be finished before step I can begin.
|
||||
Step B must be finished before step G can begin.
|
||||
Step D must be finished before step T can begin.
|
||||
Step J must be finished before step L can begin.
|
||||
Step M must be finished before step Y can begin.
|
||||
Step T must be finished before step A can begin.
|
||||
Step K must be finished before step D can begin.
|
||||
Step H must be finished before step P can begin.
|
||||
Step P must be finished before step I can begin.
|
||||
Step T must be finished before step L can begin.
|
||||
Step J must be finished before step N can begin.
|
||||
Step U must be finished before step F can begin.
|
||||
Step U must be finished before step I can begin.
|
||||
Step A must be finished before step F can begin.
|
||||
Step U must be finished before step P can begin.
|
||||
Step R must be finished before step H can begin.
|
||||
Step G must be finished before step V can begin.
|
||||
Step P must be finished before step F can begin.
|
||||
Step B must be finished before step D can begin.
|
||||
Step U must be finished before step X can begin.
|
||||
Step K must be finished before step A can begin.
|
||||
Step G must be finished before step D can begin.
|
||||
Step N must be finished before step U can begin.
|
||||
Step U must be finished before step L can begin.
|
||||
Step M must be finished before step J can begin.
|
||||
Step I must be finished before step X can begin.
|
||||
Step H must be finished before step L can begin.
|
||||
Step M must be finished before step S can begin.
|
||||
Step E must be finished before step O can begin.
|
||||
Step Q must be finished before step F can begin.
|
||||
Step A must be finished before step O can begin.
|
||||
Step T must be finished before step P can begin.
|
||||
Step F must be finished before step X can begin.
|
||||
Step D must be finished before step P can begin.
|
||||
Step A must be finished before step X can begin.
|
||||
Step G must be finished before step Z can begin.
|
||||
Step W must be finished before step F can begin.
|
||||
Step Q must be finished before step X can begin.
|
||||
Step C must be finished before step V can begin.
|
||||
Step L must be finished before step V can begin.
|
||||
Step E must be finished before step L can begin.
|
||||
Step B must be finished before step X can begin.
|
||||
Step M must be finished before step V can begin.
|
||||
Step F must be finished before step I can begin.
|
||||
Step P must be finished before step X can begin.
|
||||
Step C must be finished before step A can begin.
|
||||
Step Z must be finished before step H can begin.
|
||||
Step Q must be finished before step S can begin.
|
||||
Step G must be finished before step X can begin.
|
||||
Step T must be finished before step O can begin.
|
||||
Step P must be finished before step O can begin.
|
||||
Step T must be finished before step V can begin.
|
||||
Step N must be finished before step V can begin.
|
||||
Step Z must be finished before step X can begin.
|
||||
Step L must be finished before step X can begin.
|
||||
Step Z must be finished before step Y can begin.
|
||||
Step N must be finished before step T can begin.
|
||||
Step S must be finished before step T can begin.
|
||||
Step G must be finished before step K can begin.
|
||||
Step T must be finished before step X can begin.
|
||||
Step R must be finished before step X can begin.
|
Loading…
Reference in New Issue