-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpart1.go
118 lines (112 loc) · 1.97 KB
/
part1.go
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 (
"bbawj/aoc2022/utils"
"bufio"
"fmt"
"log"
"os"
"strconv"
)
func main() {
utils.GetInput(13)
f, err := os.Open("input.txt")
if err != nil {
log.Fatal(err)
}
defer f.Close()
index := 1
valid := 0
scanner := bufio.NewScanner(f)
for scanner.Scan() {
line := scanner.Text()
// fmt.Println(line)
var a, b any
if line == "" {
index++
continue
} else {
a, _ = parseExpression(line)
scanner.Scan()
b, _ = parseExpression(scanner.Text())
if less(a, b) >= 0 {
valid += index
}
}
}
fmt.Println(valid)
}
func less(a, b any) int {
aInt, aIsInt := a.(int)
bInt, bIsInt := b.(int)
if aIsInt && bIsInt {
if bInt < aInt {
return -1
} else if bInt > aInt {
return 1
}
return 0
}
aArr, aIsArr := a.([]any)
bArr, bIsArr := b.([]any)
if !aIsArr {
aArr = []any{aInt}
}
if !bIsArr {
bArr = []any{bInt}
}
if len(aArr) == 0 && len(bArr) == 0 {
return 0
} else if len(aArr) == 0 && len(bArr) > 0 {
return 1
} else if len(aArr) > 0 && len(bArr) == 0 {
return -1
}
for i := 0; i < len(aArr); i++ {
if i >= len(bArr) {
return -1
}
if sub := less(aArr[i], bArr[i]); sub != 0 {
return sub
}
}
if len(aArr) < len(bArr) {
return 1
} else if len(aArr) == len(bArr) {
return less(aArr[len(aArr)-1], bArr[len(bArr)-1])
}
return 0
}
func parseExpression(expr string) (any, int) {
chars := []rune(expr)
idx := 0
out := make([]any, 0)
nChars := make([]rune, 0)
for idx < len(chars) {
char := chars[idx]
switch char {
case '[':
x, i := parseExpression(string(chars[idx+1:]))
out = append(out, x)
idx += i + 1
case ']':
if len(nChars) > 0 {
n, _ := strconv.Atoi(string(nChars))
out = append(out, n)
nChars = make([]rune, 0)
}
idx++
return out, idx
case ',':
if len(nChars) > 0 {
n, _ := strconv.Atoi(string(nChars))
out = append(out, n)
nChars = make([]rune, 0)
}
idx++
default:
nChars = append(nChars, char)
idx++
}
}
return out, idx
}