-
Notifications
You must be signed in to change notification settings - Fork 0
/
13.awk
71 lines (58 loc) · 1.16 KB
/
13.awk
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
BEGIN {
RS = ""
}
{
delete rows
delete cols
for (i = 1; i <= NF; i++) {
row = rows[i] = $i
gsub(/./, "& ", row)
ncells = split(row, cells)
for (j = 1; j <= ncells; j++)
cols[j] = cols[j] cells[j]
}
sum1 += find_mirror(rows)*100 + find_mirror(cols)
sum2 += find_mirror(rows, 1)*100 + find_mirror(cols, 1)
}
END {
print sum1
print sum2
}
function find_mirror(lines, smudged,
i, j, k, n, count, perfect) {
n = length(lines)
for (i = 1; i < n; i++) {
count = count_matching(lines, i, i+1)
perfect = (count == i || count == n-i)
if (smudged == perfect)
continue
else if (perfect)
return i
j = i-count
k = i+1+count
if (!differ_by_one(lines[j], lines[k]))
continue
count = count_matching(lines, j-1, k+1)+1
if (count == j || count == n-k+1)
return i
}
return 0
}
function count_matching(lines, i, j, ret, k) {
for (k = 0; i-k in lines && j+k in lines; k++) {
if (lines[i-k] != lines[j+k])
break
ret++
}
return ret
}
function differ_by_one(line1, line2, i, yes) {
for (i = 1; i <= length(line1); i++)
if (substr(line1, i, 1) != substr(line2, i, 1)) {
if (yes)
return 0
else
yes = 1
}
return yes
}