AdventOfCode2020/01/main.go

101 lines
2.0 KiB
Go

package main
import (
"bufio"
"fmt"
"os"
"strconv"
"time"
)
func main() {
start := time.Now()
partOne()
duration := time.Since(start)
partTwo()
duration2 := time.Since(start)
fmt.Printf("p1: %s, p2: %s\n", duration, duration2-duration)
}
// [...] they need you to find the two entries that sum to 2020 and then multiply those two numbers together.
// For example, suppose your expense report contained the following:
// 1721
// 979
// 366
// 299
// 675
// 1456
// In this list, the two entries that sum to 2020 are 1721 and 299.
// Multiplying them together produces 1721 * 299 = 514579, so the correct answer is 514579.
func partOne() {
f, _ := os.Open("input")
reader := bufio.NewReader(f)
scanner := bufio.NewScanner(reader)
numbers := []int{}
for scanner.Scan() {
i, _ := strconv.Atoi(scanner.Text())
numbers = append(numbers, i)
}
solution := make(chan int, 1)
for i := range numbers {
go func(a int) {
if r := checkTwoSums(numbers[a], numbers[a+1:]); r != 0 {
solution <- r
}
}(i)
}
fmt.Println(<-solution)
}
func checkTwoSums(i int, rest []int) int {
for _, j := range rest {
if i+j == 2020 {
return i * j
}
}
return 0
}
// Can find three numbers in your expense report that meet the same criteria?
// Using the above example again, the three entries that sum to 2020 are 979, 366, and 675.
// Multiplying them together produces the answer, 241861950.
func partTwo() {
f, _ := os.Open("input")
reader := bufio.NewReader(f)
scanner := bufio.NewScanner(reader)
numbers := []int{}
for scanner.Scan() {
i, _ := strconv.Atoi(scanner.Text())
numbers = append(numbers, i)
}
solution := make(chan int, 1)
for i := range numbers {
go func(a int) {
for j := range numbers[a+1:] {
if r := checkThreeSums(numbers[a], numbers[j], numbers[j+1:]); r != 0 {
solution <- r
}
}
}(i)
}
fmt.Println(<-solution)
}
func checkThreeSums(i int, j int, rest []int) int {
for _, k := range rest {
if i+j+k == 2020 {
return i * j * k
}
}
return 0
}