68 lines
1.3 KiB
Go
68 lines
1.3 KiB
Go
package main
|
|
|
|
import (
|
|
"flag"
|
|
"fmt"
|
|
"math"
|
|
"os"
|
|
"regexp"
|
|
"sort"
|
|
"strconv"
|
|
)
|
|
|
|
var (
|
|
inputFile = flag.String("input", "input.txt", "input filename")
|
|
reLine = regexp.MustCompile(`(?m)^(\d+)\s+(\d+)$`)
|
|
)
|
|
|
|
func main() {
|
|
flag.Parse()
|
|
input, err := os.ReadFile(*inputFile)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
var leftList, rightList []int
|
|
for _, match := range reLine.FindAllStringSubmatch(string(input), -1) {
|
|
leftNumber, err := strconv.Atoi(match[1])
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
rightNumber, err := strconv.Atoi(match[2])
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
leftList = append(leftList, leftNumber)
|
|
rightList = append(rightList, rightNumber)
|
|
}
|
|
|
|
sort.SliceStable(leftList, func(i, j int) bool {
|
|
return leftList[i] < leftList[j]
|
|
})
|
|
sort.SliceStable(rightList, func(i, j int) bool {
|
|
return rightList[i] < rightList[j]
|
|
})
|
|
|
|
simMap := make(map[int]int)
|
|
totalDistance := 0
|
|
for i := 0; i < len(leftList); i++ {
|
|
for _, rightItem := range rightList {
|
|
if rightItem == leftList[i] {
|
|
simMap[leftList[i]]++
|
|
}
|
|
}
|
|
|
|
totalDistance += int(math.Abs(float64(leftList[i] - rightList[i])))
|
|
}
|
|
|
|
simScore := 0
|
|
for number, count := range simMap {
|
|
simScore += number * count
|
|
}
|
|
|
|
fmt.Printf("total distance: %d\n", totalDistance)
|
|
fmt.Printf("total sim score: %d\n", simScore)
|
|
}
|