parent
cb7d65b004
commit
fc1e8e4c33
@ -0,0 +1,44 @@
|
|||||||
|
0: 3
|
||||||
|
1: 2
|
||||||
|
2: 4
|
||||||
|
4: 8
|
||||||
|
6: 5
|
||||||
|
8: 6
|
||||||
|
10: 6
|
||||||
|
12: 4
|
||||||
|
14: 6
|
||||||
|
16: 6
|
||||||
|
18: 17
|
||||||
|
20: 8
|
||||||
|
22: 8
|
||||||
|
24: 8
|
||||||
|
26: 9
|
||||||
|
28: 8
|
||||||
|
30: 12
|
||||||
|
32: 12
|
||||||
|
34: 10
|
||||||
|
36: 12
|
||||||
|
38: 12
|
||||||
|
40: 8
|
||||||
|
42: 12
|
||||||
|
44: 12
|
||||||
|
46: 10
|
||||||
|
48: 12
|
||||||
|
50: 12
|
||||||
|
52: 14
|
||||||
|
54: 14
|
||||||
|
56: 12
|
||||||
|
58: 14
|
||||||
|
60: 14
|
||||||
|
62: 14
|
||||||
|
64: 14
|
||||||
|
66: 14
|
||||||
|
68: 12
|
||||||
|
70: 14
|
||||||
|
72: 14
|
||||||
|
74: 14
|
||||||
|
76: 14
|
||||||
|
80: 18
|
||||||
|
82: 14
|
||||||
|
90: 18
|
||||||
|
|
@ -0,0 +1,62 @@
|
|||||||
|
input = ARGF.read.strip
|
||||||
|
# input = <<INPUT
|
||||||
|
# 0: 3
|
||||||
|
# 1: 2
|
||||||
|
# 4: 4
|
||||||
|
# 6: 4
|
||||||
|
# INPUT
|
||||||
|
@input = Hash[input.scan(/(\d+): (\d+)/).map {|x| x.map(&:to_i) }]
|
||||||
|
|
||||||
|
class Firewall
|
||||||
|
def initialize(input)
|
||||||
|
@layers = input
|
||||||
|
@scanners = Hash[input.map {|d,_| [d, 0] }]
|
||||||
|
@deltas = Hash[input.map {|d,_| [d, 1] }]
|
||||||
|
end
|
||||||
|
|
||||||
|
def each
|
||||||
|
return enum_for(__method__) unless block_given?
|
||||||
|
|
||||||
|
loop do
|
||||||
|
yield @scanners
|
||||||
|
|
||||||
|
@layers.each do |depth, range|
|
||||||
|
@scanners[depth] += @deltas[depth]
|
||||||
|
@deltas[depth] = case @scanners[depth]
|
||||||
|
when 0
|
||||||
|
1
|
||||||
|
when range - 1
|
||||||
|
-1
|
||||||
|
else
|
||||||
|
@deltas[depth]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
def pass?(delay)
|
||||||
|
f = Firewall.new(@input).each
|
||||||
|
delay.times do
|
||||||
|
f.next
|
||||||
|
end
|
||||||
|
|
||||||
|
severity = 0
|
||||||
|
(0..@input.map(&:first).max).each do |pos|
|
||||||
|
scanners = f.next
|
||||||
|
return false if scanners[pos] == 0
|
||||||
|
end
|
||||||
|
true
|
||||||
|
end
|
||||||
|
|
||||||
|
def s(t, r)
|
||||||
|
r - (t % (2*r) - r).abs
|
||||||
|
end
|
||||||
|
|
||||||
|
(0..Float::INFINITY).each do |delay|
|
||||||
|
if @input.all? {|d,r| s(d + delay, r-1) != 0 }
|
||||||
|
p delay
|
||||||
|
exit
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in new issue