much better day13 after looking at others
This commit is contained in:
86
2022/go/day13/day13.go
Normal file
86
2022/go/day13/day13.go
Normal file
@@ -0,0 +1,86 @@
|
||||
package day13
|
||||
|
||||
import (
|
||||
_ "fmt"
|
||||
"encoding/json"
|
||||
"sort"
|
||||
)
|
||||
|
||||
func Part1(input []string) int {
|
||||
sum := 0
|
||||
for i := 0; i < len(input); i += 3 {
|
||||
left, right := input[i], input[i+1]
|
||||
|
||||
if isOrderRight(left, right) {
|
||||
sum += i/3 + 1
|
||||
}
|
||||
}
|
||||
return sum
|
||||
}
|
||||
|
||||
func Part2(input []string) int {
|
||||
var trimmed []string
|
||||
for _, str := range input {
|
||||
if str != "" {
|
||||
trimmed = append(trimmed, str)
|
||||
}
|
||||
}
|
||||
trimmed = append(trimmed, "[[2]]", "[[6]]")
|
||||
sort.Slice(trimmed, func(i, j int) bool {
|
||||
return isOrderRight(trimmed[i], trimmed[j])
|
||||
})
|
||||
|
||||
start := 0
|
||||
end := 0
|
||||
for i, value := range trimmed {
|
||||
if value == "[[2]]" {
|
||||
start = i + 1
|
||||
}
|
||||
if value == "[[6]]" {
|
||||
end = i + 1
|
||||
return start * end
|
||||
}
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func isOrderRight(left, right string) bool {
|
||||
var l, r = unmarshal(left, right)
|
||||
|
||||
if cmp(l, r) <= 0 {
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
func unmarshal(left, right string) (any, any) {
|
||||
var l, r any
|
||||
|
||||
json.Unmarshal([]byte(left), &l)
|
||||
json.Unmarshal([]byte(right), &r)
|
||||
|
||||
return l, r
|
||||
}
|
||||
|
||||
func cmp(left, right any) int {
|
||||
l, lok := left.([]any)
|
||||
r, rok := right.([]any)
|
||||
|
||||
switch {
|
||||
case !lok && !rok:
|
||||
return int(left.(float64) - right.(float64))
|
||||
case !lok:
|
||||
l = []any{left}
|
||||
case !rok:
|
||||
r = []any{right}
|
||||
}
|
||||
|
||||
for i := 0; i < len(l) && i < len(r); i++ {
|
||||
if res := cmp(l[i], r[i]); res != 0 {
|
||||
return res
|
||||
}
|
||||
}
|
||||
|
||||
return len(l) - len(r)
|
||||
}
|
||||
Reference in New Issue
Block a user