solve day 1
This commit is contained in:
commit
9c97386cef
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
aoc-2024
|
||||||
|
input.txt
|
93
day1.go
Normal file
93
day1.go
Normal 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
|
||||||
|
}
|
45
main.go
Normal file
45
main.go
Normal 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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user