93 lines
1.6 KiB
Go
93 lines
1.6 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"math"
|
|
"os"
|
|
)
|
|
|
|
func main() {
|
|
if len(os.Args) < 2 {
|
|
panic("Provide input file")
|
|
}
|
|
inputFile := os.Args[1]
|
|
|
|
part1 := part1(inputFile)
|
|
fmt.Printf("(%s) Part 1: %d\n", inputFile, part1)
|
|
|
|
part2 := part2(inputFile)
|
|
fmt.Printf("(%s) Part 2: %d\n", inputFile, part2)
|
|
}
|
|
|
|
func part2(inputFile string) int {
|
|
input, err := os.Open(inputFile)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
defer input.Close()
|
|
|
|
// simMap tracks occurence count of right list
|
|
simMap := make(map[int]int)
|
|
|
|
// vals are values to check from left list
|
|
vals := make([]int, 0)
|
|
|
|
for {
|
|
var x, y int
|
|
_, err := fmt.Fscanf(input, "%d %d\n", &x, &y)
|
|
if err != nil {
|
|
break
|
|
}
|
|
vals = append(vals, x)
|
|
simMap[y] += 1
|
|
}
|
|
|
|
totalSimilarity := 0
|
|
for _, val := range vals {
|
|
totalSimilarity += val * simMap[val]
|
|
}
|
|
|
|
return totalSimilarity
|
|
}
|
|
|
|
func part1(inputFile string) int {
|
|
input, err := os.Open(inputFile)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
defer input.Close()
|
|
|
|
left := make([]int, 0)
|
|
right := make([]int, 0)
|
|
|
|
for {
|
|
var x, y int
|
|
_, err := fmt.Fscanf(input, "%d %d\n", &x, &y)
|
|
if err != nil {
|
|
break
|
|
}
|
|
left = append(left, x)
|
|
right = append(right, y)
|
|
}
|
|
sortedLeft := sort(left)
|
|
sortedRight := sort(right)
|
|
|
|
totalDifference := 0
|
|
for i := 0; i < len(sortedLeft); i++ {
|
|
totalDifference += int(math.Abs(float64(sortedLeft[i]) - float64(sortedRight[i])))
|
|
}
|
|
|
|
return totalDifference
|
|
}
|
|
|
|
func sort(arr []int) []int {
|
|
for i := 0; i < len(arr); i++ {
|
|
for j := i; j < len(arr); j++ {
|
|
if arr[i] > arr[j] {
|
|
arr[i], arr[j] = arr[j], arr[i]
|
|
}
|
|
}
|
|
}
|
|
return arr
|
|
}
|