Jonathan D. Storm 3 months ago
parent
commit
4b3210d8e8
4 changed files with 104 additions and 0 deletions
  1. 62 0
      cmd/day_1/main.go
  2. 31 0
      cmd/day_1/main_test.go
  3. 8 0
      cmd/day_1/test.txt
  4. 3 0
      go.mod

+ 62 - 0
cmd/day_1/main.go

@@ -0,0 +1,62 @@
+package main
+
+import (
+	"errors"
+	"fmt"
+	"io"
+	"log"
+	"slices"
+	"strconv"
+)
+
+const (
+	MAX_LOOP = 1_000_000
+)
+
+var MAX_INT int = int(^uint(0) >> 1)
+var INT_SZ int = 1
+
+func main() {
+	tmp := MAX_INT
+	for tmp > 0 {
+		INT_SZ++
+		tmp >>= 1
+	}
+	left := make([]int, 0, 1024)
+	right := make([]int, 0, 1024)
+
+	var lStr, rStr string
+	for i := 0; i < MAX_LOOP; i++ {
+		n, err := fmt.Scan(&lStr, &rStr)
+		if errors.Is(err, io.EOF) {
+			break
+		}
+		if err != nil {
+			log.Fatal("Unexpected error while reading input: ", err)
+		}
+		if n != 2 {
+			log.Fatal(fmt.Sprintf("Unexpected number of fields at line %d of input", i+1))
+		}
+		l, err := strconv.ParseInt(lStr, 10, INT_SZ)
+		r, err := strconv.ParseInt(rStr, 10, INT_SZ)
+		left = append(left, int(l))
+		right = append(right, int(r))
+	}
+
+	fmt.Printf("distance = %d\n", distance(left, right))
+}
+
+func distance(left, right []int) int {
+	slices.Sort(left)
+	slices.Sort(right)
+
+	var sum int
+	for i := 0; i < len(left); i++ {
+		subSum := left[i] - right[i]
+		if subSum < 0 {
+			subSum *= -1
+		}
+		sum += subSum
+	}
+	return sum
+}

+ 31 - 0
cmd/day_1/main_test.go

@@ -0,0 +1,31 @@
+package main
+
+import (
+	"testing"
+)
+
+func TestDistanceOnTwoIds(t *testing.T) {
+	cases := []struct {
+		Name        string
+		Left, Right []int
+		Expected    int
+	}{
+		{"d(3, 4) = 1", []int{3}, []int{4}, 1},
+		{"d(4, 3) = 1", []int{4}, []int{3}, 1},
+		{"d(2, 5) = 3", []int{2}, []int{5}, 3},
+		{"d(1, 3) = 2", []int{1}, []int{3}, 2},
+		{"d(3, 9) = 6", []int{3}, []int{9}, 6},
+		{"d(3, 3) = 0", []int{3}, []int{3}, 0},
+		{"d([3,4,2,1,3,3], [4,3,5,3,9,3]) = 11",
+			[]int{3, 4, 2, 1, 3, 3},
+			[]int{4, 3, 5, 3, 9, 3},
+			11,
+		},
+	}
+	for _, c := range cases {
+		actual := distance(c.Left, c.Right)
+		if actual != c.Expected {
+			t.Errorf("Expected %s; got %d", c.Name, actual)
+		}
+	}
+}

+ 8 - 0
cmd/day_1/test.txt

@@ -0,0 +1,8 @@
+3		4
+4		3
+2		5
+1		3
+3		9
+
+3		3
+

+ 3 - 0
go.mod

@@ -0,0 +1,3 @@
+module aoc_2024
+
+go 1.22.3