1
0

solve day 1

This commit is contained in:
Rokas Puzonas 2024-12-04 21:49:56 +02:00
commit 9c97386cef
4 changed files with 143 additions and 0 deletions

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
aoc-2024
input.txt

93
day1.go Normal file
View File

@ -0,0 +1,93 @@
package main
import (
"fmt"
"sort"
"strconv"
"strings"
)
type Day1Input struct {
column1 []int64
column2 []int64
}
func day1_parse(lines []string) (*Day1Input, error) {
column1 := make([]int64, len(lines))
column2 := make([]int64, len(lines))
for i, line := range lines {
parts := strings.SplitN(line, " ", 2)
column1_value, err := strconv.ParseInt(strings.TrimSpace(parts[0]), 10, 0)
if err != nil {
return nil, err
}
column2_value, err := strconv.ParseInt(strings.TrimSpace(parts[1]), 10, 0)
if err != nil {
return nil, err
}
column1[i] = column1_value
column2[i] = column2_value
}
parsed := Day1Input{
column1,
column2,
}
return &parsed, nil
}
func day1_part1(lines []string) (error) {
input, err := day1_parse(lines)
if err != nil {
return err
}
sort.Slice(input.column1, func(i, j int) bool {
return input.column1[i] < input.column1[j]
})
sort.Slice(input.column2, func(i, j int) bool {
return input.column2[i] < input.column2[j]
})
var answer int64 = 0
for i := range len(input.column1) {
if input.column1[i] > input.column2[i] {
answer += input.column1[i] - input.column2[i];
} else {
answer += input.column2[i] - input.column1[i];
}
}
fmt.Println(answer)
return nil
}
func day1_part2(lines []string) (error) {
input, err := day1_parse(lines)
if err != nil {
return err
}
var answer int64 = 0
for _, value1 := range input.column1 {
var count int64 = 0
for _, value2 := range input.column2 {
if value1 == value2 {
count += 1
}
}
answer += count * value1
}
fmt.Println(answer)
return nil
}

3
go.mod Normal file
View File

@ -0,0 +1,3 @@
module aoc-2024
go 1.23.2

45
main.go Normal file
View File

@ -0,0 +1,45 @@
package main
import (
"fmt"
"log"
"os"
"strings"
)
func showUsage() {
print(len(os.Args))
fmt.Printf("Usage: %s <day> <part> [input.txt]\n", os.Args[0])
}
func main() {
if (len(os.Args) < 3) {
showUsage()
return
}
day := os.Args[1]
part := os.Args[2]
var input_filename string
if len(os.Args) <= 3 {
input_filename = "input.txt"
} else {
input_filename = os.Args[3]
}
contents, err := os.ReadFile(input_filename)
if err != nil {
log.Fatal(err)
}
lines := strings.Split(strings.TrimRight(string(contents), "\n"), "\n")
if day == "1" {
if part == "1" {
day1_part1(lines)
} else if part == "2" {
day1_part2(lines)
}
}
}