Files
aoc2020/one/day_one.go
James Griffin 1225256007 Day 1: Part 2
2020-12-02 12:12:46 -04:00

110 lines
2.2 KiB
Go

package one
import (
"bufio"
"fmt"
"os"
"strconv"
)
type expenseReport struct {
expenses []int
}
func (e *expenseReport) load(filename string) error {
file, err := os.Open(filename)
if err != nil {
return err
}
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
value, err := strconv.Atoi(scanner.Text())
if err != nil {
return err
}
e.expenses = append(e.expenses, value)
}
return nil
}
func (e *expenseReport) findPairAndMultiply(target int) (int, error) {
for i := 0; i < len(e.expenses); i++ {
if e.expenses[i] > target {
continue
}
for j := i + 1; j < len(e.expenses); j++ {
if e.expenses[j] > target {
continue
}
if (e.expenses[i] + e.expenses[j]) == target {
return e.expenses[i] * e.expenses[j], nil
}
}
}
return -1, fmt.Errorf("Unable to find target pair that sums to %d", target)
}
func (e *expenseReport) findTrioAndMultiply(target int) (int, error) {
for i := 0; i < len(e.expenses); i++ {
if e.expenses[i] > target {
continue
}
for j := i + 1; j < len(e.expenses); j++ {
if e.expenses[j] > target {
continue
}
for k := j + 1; k < len(e.expenses); k++ {
if e.expenses[k] > target {
continue
}
if (e.expenses[i] + e.expenses[j] + e.expenses[k]) == target {
return e.expenses[i] * e.expenses[j] * e.expenses[k], nil
}
}
}
}
return -1, fmt.Errorf("Unable to find target pair that sums to %d", target)
}
// PartOne Find the multiplied value of the two expenses totalling 2020
func PartOne() string {
report := expenseReport{}
err := report.load("one/expenses.txt")
if err != nil {
return fmt.Sprintf("Unable to load expenses: %s", err.Error())
}
result, err := report.findPairAndMultiply(2020)
if err != nil {
return err.Error()
}
return fmt.Sprintf("The output of the expenses summing to 2020 is %d", result)
}
func PartTwo() string {
report := expenseReport{}
err := report.load("one/expenses.txt")
if err != nil {
return fmt.Sprintf("Unable to load expenses: %s", err.Error())
}
result, err := report.findTrioAndMultiply(2020)
if err != nil {
return err.Error()
}
return fmt.Sprintf("The output of the expenses summing to 2020 is %d", result)
}