mirror of
https://github.com/onyx-and-iris/aoc2024.git
synced 2026-04-08 18:13:36 +00:00
first commit
This commit is contained in:
50
day-01/internal/one/solve.go
Normal file
50
day-01/internal/one/solve.go
Normal file
@@ -0,0 +1,50 @@
|
||||
package one
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"bytes"
|
||||
"embed"
|
||||
"io"
|
||||
"math"
|
||||
"regexp"
|
||||
|
||||
"github.com/onyx-and-iris/aoc2024/day-01/internal/util"
|
||||
)
|
||||
|
||||
//go:embed testdata
|
||||
var files embed.FS
|
||||
|
||||
var reNums = regexp.MustCompile(`[0-9]+`)
|
||||
|
||||
func Solve() (int, error) {
|
||||
data, _ := files.ReadFile("testdata/input.txt")
|
||||
|
||||
r := bytes.NewReader(data)
|
||||
left, right, err := parseLines(r)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
var sum int
|
||||
for i, n := range left {
|
||||
sum += int(math.Abs(float64(n - right[i])))
|
||||
}
|
||||
return sum, nil
|
||||
}
|
||||
|
||||
func parseLines(r io.Reader) ([]int, []int, error) {
|
||||
var left, right []int
|
||||
|
||||
scanner := bufio.NewScanner(r)
|
||||
for scanner.Scan() {
|
||||
nums := reNums.FindAllString(scanner.Text(), -1)
|
||||
left = util.InsertSorted(left, util.MustConv(nums[0]))
|
||||
right = util.InsertSorted(right, util.MustConv(nums[1]))
|
||||
}
|
||||
|
||||
if err := scanner.Err(); err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
return left, right, nil
|
||||
}
|
||||
63
day-01/internal/two/solve.go
Normal file
63
day-01/internal/two/solve.go
Normal file
@@ -0,0 +1,63 @@
|
||||
package two
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"bytes"
|
||||
"embed"
|
||||
"io"
|
||||
"regexp"
|
||||
"slices"
|
||||
|
||||
"github.com/onyx-and-iris/aoc2024/day-01/internal/util"
|
||||
)
|
||||
|
||||
//go:embed testdata
|
||||
var files embed.FS
|
||||
|
||||
var reNums = regexp.MustCompile(`[0-9]+`)
|
||||
|
||||
func Solve() (int, error) {
|
||||
data, _ := files.ReadFile("testdata/input.txt")
|
||||
|
||||
r := bytes.NewReader(data)
|
||||
left, right, err := parseLines(r)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
var similarity int
|
||||
for k, v := range left {
|
||||
indx := slices.Index(right, k)
|
||||
if indx == -1 {
|
||||
continue
|
||||
}
|
||||
|
||||
var occurrences int
|
||||
for _, n := range right[indx:] {
|
||||
if n == k {
|
||||
occurrences++
|
||||
}
|
||||
}
|
||||
similarity += k * v * occurrences
|
||||
}
|
||||
|
||||
return similarity, nil
|
||||
}
|
||||
|
||||
func parseLines(r io.Reader) (map[int]int, []int, error) {
|
||||
var left map[int]int = make(map[int]int)
|
||||
var right []int
|
||||
|
||||
scanner := bufio.NewScanner(r)
|
||||
for scanner.Scan() {
|
||||
nums := reNums.FindAllString(scanner.Text(), -1)
|
||||
left[util.MustConv(nums[0])] = left[util.MustConv(nums[0])] + 1
|
||||
right = util.InsertSorted(right, util.MustConv(nums[1]))
|
||||
}
|
||||
|
||||
if err := scanner.Err(); err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
return left, right, nil
|
||||
}
|
||||
20
day-01/internal/util/util.go
Normal file
20
day-01/internal/util/util.go
Normal file
@@ -0,0 +1,20 @@
|
||||
package util
|
||||
|
||||
import (
|
||||
"cmp"
|
||||
"slices"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
func MustConv(s string) int {
|
||||
n, err := strconv.Atoi(s)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return n
|
||||
}
|
||||
|
||||
func InsertSorted[T cmp.Ordered](ts []T, t T) []T {
|
||||
i, _ := slices.BinarySearch(ts, t)
|
||||
return slices.Insert(ts, i, t)
|
||||
}
|
||||
Reference in New Issue
Block a user