day7
This commit is contained in:
parent
d06708a9a2
commit
fb185bc74f
116
d6.rb
Normal file
116
d6.rb
Normal file
|
@ -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
|
155
d7.rb
Normal file
155
d7.rb
Normal file
|
@ -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.
|
22
day6.exs
Normal file
22
day6.exs
Normal file
|
@ -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()
|
55
day7.exs
Normal file
55
day7.exs
Normal file
|
@ -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())
|
50
input/day6.in
Normal file
50
input/day6.in
Normal file
|
@ -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
|
101
input/day7.in
Normal file
101
input/day7.in
Normal file
|
@ -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
Block a user