-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathday3.go
More file actions
118 lines (107 loc) · 3.09 KB
/
day3.go
File metadata and controls
118 lines (107 loc) · 3.09 KB
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
package main
import (
"cmp"
"fmt"
"regexp"
"strconv"
"strings"
)
var regDigit = regexp.MustCompile("^\\d$")
func day3(input string) int {
board := [][]string{}
fromInput(input, func(line string) {
board = append(board, strings.Split(line, ""))
})
total := 0
for j := range len(board) {
for i := 0; i < len(board[j]); i++ {
if !regDigit.MatchString(board[j][i]) {
continue
}
n, hasSiblingSymbal := identifySiblings(board, j, i, len(board), len(board[j]))
if hasSiblingSymbal {
d, _ := strconv.Atoi(n)
total += d
}
i += len(n) - 1
}
}
return total
}
func identifySiblings(board [][]string, j, i, jlength, ilength int) (string, bool) {
n := board[j][i]
hasSiblingSymbol := isNotADot(board, j-1, i-1, jlength, ilength) ||
isNotADot(board, j-1, i, jlength, ilength) ||
isNotADot(board, j-1, i+1, jlength, ilength) ||
isNotADot(board, j, i-1, jlength, ilength) ||
isNotADot(board, j, i+1, jlength, ilength) ||
isNotADot(board, j+1, i-1, jlength, ilength) ||
isNotADot(board, j+1, i, jlength, ilength) ||
isNotADot(board, j+1, i+1, jlength, ilength)
// recursive if the digit has another digit on its right
if i+1 < ilength && regDigit.MatchString(board[j][i+1]) {
neighbourDigit, hasNeighbourSiblingSymbol := identifySiblings(board, j, i+1, jlength, ilength)
return fmt.Sprintf("%s%s", n, neighbourDigit), cmp.Or(hasSiblingSymbol, hasNeighbourSiblingSymbol)
}
return n, hasSiblingSymbol
}
func isNotADot(board [][]string, j, i, jlength, ilength int) bool {
return j >= 0 && i >= 0 && j < jlength && i < ilength && !regDigit.MatchString(board[j][i]) && board[j][i] != "."
}
func day3_2(input string) int {
board := [][]string{}
fromInput(input, func(line string) {
board = append(board, strings.Split(line, ""))
})
total := 0
numberCoordinates := map[string]string{}
starCoordinates := []string{}
for j := range len(board) {
for i := 0; i < len(board[j]); i++ {
if board[j][i] == "*" {
starCoordinates = append(starCoordinates, fmt.Sprintf("%d-%d", j, i))
continue
}
if !regDigit.MatchString(board[j][i]) {
continue
}
n, _ := identifySiblings(board, j, i, len(board), len(board[j]))
numberCoordinates[fmt.Sprintf("%d-%d", j, i)] = n
i += len(n) - 1
}
}
totalStarSiblings := 0
for _, sCoord := range starCoordinates {
sCoords := strings.Split(sCoord, "-")
o, _ := strconv.Atoi(sCoords[0])
x, _ := strconv.Atoi(sCoords[1])
minO := o - 1
minX := x - 1
maxO := o + 1
maxX := x + 1
numbersSibling := []string{}
for coord, number := range numberCoordinates {
ords := strings.Split(coord, "-")
on, _ := strconv.Atoi(ords[0])
xn, _ := strconv.Atoi(ords[1])
isSiblings := false
maxNumberX := xn + len(number)
for ; xn < maxNumberX; xn++ {
if on >= minO && on <= maxO && xn >= minX && xn <= maxX {
isSiblings = true
break
}
}
if isSiblings {
numbersSibling = append(numbersSibling, number)
}
}
if len(numbersSibling) == 2 {
n1, _ := strconv.Atoi(numbersSibling[0])
n2, _ := strconv.Atoi(numbersSibling[1])
total += (n1 * n2)
totalStarSiblings++
}
}
return total
}