aoc_2024/one/one.go

82 lines
1.2 KiB
Go
Raw Normal View History

2024-12-01 21:06:28 +00:00
package main
import (
"bufio"
"fmt"
"os"
"slices"
"strconv"
"strings"
)
func check(e error) {
if e != nil {
panic(e)
}
}
func main() {
f, err := os.Open("./one.txt")
defer f.Close()
check(err)
var list [2][]int
list[0] = make([]int, 0, 10)
list[1] = make([]int, 0, 10)
scanner := bufio.NewScanner(f)
for scanner.Scan() {
line := scanner.Text()
fields := strings.Fields(line)
if len(fields) != 2 {
fmt.Println(line)
panic("Need exactly two ints per line")
}
for i, field := range fields {
int_field, err := strconv.Atoi(field)
check(err)
list[i] = append(list[i], int_field)
}
}
slices.Sort(list[0])
slices.Sort(list[1])
n_vals := len(list[0])
sum_of_diffs := 0
for i := 0; i < n_vals; i++ {
var abs_diff int
x := list[0][i]
y := list[1][i]
if x < y {
abs_diff = y - x
} else {
abs_diff = x - y
}
sum_of_diffs += abs_diff
}
fmt.Println(sum_of_diffs)
var numbers [2]map[int]int
numbers[0] = make(map[int]int)
numbers[1] = make(map[int]int)
for i := range list[0] {
numbers[0][list[0][i]] += 1
numbers[1][list[1][i]] += 1
}
similarity_score := 0
for number, n := range numbers[0] {
similarity_score += number * numbers[1][number] * n
}
fmt.Println(similarity_score)
}