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