-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathday13.cr
44 lines (38 loc) · 1.05 KB
/
day13.cr
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
def horizontal(group, index, range)
range.times.sum do |row_i|
g1 = group[index + row_i]
g2 = group[index - row_i - 1]
cs = group[0].size.times.count { |col| g1[col] != g2[col] }
cs > 1 ? return(cs) : cs # shortcut
end
end
def vertical(group, index, range)
range.times.sum do |col_i|
cs = group.count { |row| row[index + col_i] != row[index - col_i - 1] }
cs > 1 ? return(cs) : cs # shortcut
end
end
def eval(size, smudges)
(1..(size - 1)).find(if_none: 0) do |c|
yield(c, {size - c, c}.min) == smudges
end
end
def find_best(groups, smudges)
groups.sum do |group|
100 * eval(group.size, smudges) { |c, range| horizontal(group, c, range) } +
eval(group[0].size, smudges) { |c, range| vertical(group, c, range) }
end
end
input = File.read("input.day13").lines
group = Array(String).new
groups = Array{group}
while line = input.shift?
if line.empty?
group = Array(String).new
groups << group
else
group << line
end
end
puts "part1: %s" % find_best(groups, 0)
puts "part2: %s" % find_best(groups, 1)