Compare commits

..
13 Commits
8 changed files with 4349 additions and 0 deletions
+18
View File
@@ -0,0 +1,18 @@
package main
import (
"adventofcode/pkg/one"
"adventofcode/pkg/three"
"adventofcode/pkg/two"
"fmt"
)
func main() {
fmt.Println("🎄 MERRY CHRISTMAS 🎄")
fmt.Println("Day 1️⃣")
one.Run()
fmt.Println("Day 2️⃣")
two.Run()
fmt.Println("Day 3️⃣")
three.Run()
}
+3
View File
@@ -0,0 +1,3 @@
module adventofcode
go 1.17
+2000
View File
File diff suppressed because it is too large Load Diff
+80
View File
@@ -0,0 +1,80 @@
package one
import (
"bufio"
"fmt"
"log"
"os"
"strconv"
)
func Run() {
fmt.Printf("1st solution: %d\n", solveFirst())
fmt.Printf("2nd solution: %d\n", solveSecond())
}
func readInput() []int {
file, err := os.Open("./pkg/one/input.txt")
if err != nil {
log.Fatal(err)
}
defer file.Close()
numbers := make([]int, 0)
scanner := bufio.NewScanner(file)
for scanner.Scan() {
num, err := strconv.Atoi(scanner.Text())
if err != nil {
log.Fatal(err)
}
numbers = append(numbers, num)
}
if err := scanner.Err(); err != nil {
log.Fatal(err)
}
return numbers
}
func solveFirst() int {
p := 0
i := 0
for k, v := range readInput() {
if k == 0 {
p = v
continue
}
if p < v {
i++
}
p = v
}
return i
}
func solveSecond() int {
increasedMeasurements := 0
a := make([]int, 3)
b := make([]int, 3)
numbers := readInput()
for i := 0; i < len(numbers); i++ {
if i+4 <= len(numbers) {
a = numbers[i : i+3]
b = numbers[i+1 : i+4]
aSum := 0
bSum := 0
for _, v := range a {
aSum += v
}
for _, v := range b {
bSum += v
}
if bSum > aSum {
increasedMeasurements++
}
}
}
return increasedMeasurements
}
+1000
View File
File diff suppressed because it is too large Load Diff
+178
View File
@@ -0,0 +1,178 @@
package three
import (
"bufio"
"fmt"
"log"
"os"
"strconv"
"strings"
)
func Run() {
values := readInput()
heatmap := createHeatmap(values)
fmt.Printf("power: %d\n", calcPower(calcGamma(heatmap, len(values)), calcEpsilon(heatmap, len(values))))
fmt.Printf("oxygen * co2 (life support): %d\n", calcOxygen(values)*calcCO2(values))
}
func calcOxygen(values [][]int) int {
valueStore := make([][][]int, 0)
valueStore = append(valueStore, values)
for i := 0; i < len(values[0]); i++ {
commonValues := getCommonValues(valueStore[i], false)
newValues := make([][]int, 0)
for _, v := range valueStore[i] {
if v[i] == commonValues[i] {
newValues = append(newValues, v)
}
}
valueStore = append(valueStore, newValues)
if len(newValues) == 1 {
break
}
}
return convertToDecimal(valueStore[len(valueStore)-1][0])
}
func calcCO2(values [][]int) int {
valueStore := make([][][]int, 0)
valueStore = append(valueStore, values)
for i := 0; i < len(values[0]); i++ {
commonValues := getCommonValues(valueStore[i], true)
newValues := make([][]int, 0)
for _, v := range valueStore[i] {
if v[i] == commonValues[i] {
newValues = append(newValues, v)
}
}
valueStore = append(valueStore, newValues)
if len(newValues) == 1 {
break
}
}
return convertToDecimal(valueStore[len(valueStore)-1][0])
}
func getCommonValues(values [][]int, least bool) []int {
ones := make([]int, len(values[0]))
zeros := make([]int, len(values[0]))
result := make([]int, len(values[0]))
for _, v := range values {
for i, b := range v {
if b == 1 {
ones[i]++
} else if b == 0 {
zeros[i]++
}
}
}
for k := range result {
if ones[k] > zeros[k] {
if least {
result[k] = 0
} else {
result[k] = 1
}
} else {
if least {
result[k] = 1
} else {
result[k] = 0
}
}
if ones[k] == zeros[k] {
if least {
result[k] = 0
} else {
result[k] = 1
}
}
}
return result
}
func calcPower(gamma []int, epsilon []int) int {
return convertToDecimal(gamma) * convertToDecimal(epsilon)
}
func convertToDecimal(i []int) int {
s := []string{}
for _, v := range i {
s = append(s, strconv.Itoa(v))
}
r, _ := strconv.ParseInt(strings.Join(s, ""), 2, 64)
return int(r)
}
func calcGamma(heatmap []int, lines int) []int {
gamma := make([]int, len(heatmap))
for k, v := range heatmap {
if v > lines/2 {
gamma[k] = 1
} else {
gamma[k] = 0
}
}
return gamma
}
func calcEpsilon(heatmap []int, lines int) []int {
gamma := make([]int, len(heatmap))
for k, v := range heatmap {
if v < lines/2 {
gamma[k] = 1
} else {
gamma[k] = 0
}
}
return gamma
}
func createHeatmap(values [][]int) []int {
heatmap := make([]int, len(values[0]))
for _, v := range values {
for k2, v2 := range v {
if v2 == 1 {
heatmap[k2]++
}
}
}
return heatmap
}
func readInput() [][]int {
file, err := os.Open("./pkg/three/input.txt")
if err != nil {
log.Fatal(err)
}
defer file.Close()
values := make([][]int, 0)
scanner := bufio.NewScanner(file)
for scanner.Scan() {
line := strings.Split(scanner.Text(), "")
val := make([]int, 0)
for _, v := range line {
x, err := strconv.Atoi(v)
if err != nil {
log.Fatal(err)
}
val = append(val, x)
}
values = append(values, val)
}
if err := scanner.Err(); err != nil {
log.Fatal(err)
}
return values
}
+1000
View File
File diff suppressed because it is too large Load Diff
+70
View File
@@ -0,0 +1,70 @@
package two
import (
"bufio"
"fmt"
"log"
"os"
"strconv"
"strings"
)
func Run() {
commands := readInput()
fmt.Printf("1st final position: %d\n", solve(commands, false))
fmt.Printf("2nd final position: %d\n", solve(commands, true))
}
func solve(commands []string, alt bool) int {
depth := 0
horizontalPosition := 0
aim := 0
for _, v := range commands {
command := strings.Split(v, " ")
x, err := strconv.Atoi(command[1])
if err != nil {
log.Fatal(err)
}
switch command[0] {
case "forward":
horizontalPosition += x
if alt {
depth += aim * x
}
case "up":
if !alt {
depth -= x
} else {
aim -= x
}
case "down":
if !alt {
depth += x
} else {
aim += x
}
}
}
return horizontalPosition * depth
}
func readInput() []string {
file, err := os.Open("./pkg/two/input.txt")
if err != nil {
log.Fatal(err)
}
defer file.Close()
commands := make([]string, 0)
scanner := bufio.NewScanner(file)
for scanner.Scan() {
commands = append(commands, scanner.Text())
}
if err := scanner.Err(); err != nil {
log.Fatal(err)
}
return commands
}