Archived
Compare commits
11
Commits
main
..
a7474d703c
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a7474d703c | ||
|
|
69bcb419ed | ||
|
|
692ff760d2 | ||
|
|
7d6fc6361c | ||
|
|
e8bc03c2a6 | ||
|
|
5a31176884 | ||
|
|
19f9b2999b | ||
|
|
4e18054987 | ||
|
|
d33f37336a | ||
|
|
2a0771a313 | ||
|
|
5cf912ae02 |
+17
@@ -0,0 +1,17 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"adventofcode/pkg/one"
|
||||
"adventofcode/pkg/three"
|
||||
"adventofcode/pkg/two"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
func main() {
|
||||
fmt.Println("Day 1")
|
||||
one.Run()
|
||||
fmt.Println("Day 2")
|
||||
two.Run()
|
||||
fmt.Println("Day 3")
|
||||
three.Run()
|
||||
}
|
||||
+2000
File diff suppressed because it is too large
Load Diff
@@ -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
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,192 @@
|
||||
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++ {
|
||||
frequencyMap := getMostCommonValues(valueStore[i])
|
||||
newValues := make([][]int, 0)
|
||||
for _, v := range valueStore[i] {
|
||||
if v[i] == frequencyMap[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++ {
|
||||
frequencyMap := getLeastCommonValues(valueStore[i])
|
||||
newValues := make([][]int, 0)
|
||||
for _, v := range valueStore[i] {
|
||||
if v[i] == frequencyMap[i] {
|
||||
newValues = append(newValues, v)
|
||||
}
|
||||
}
|
||||
|
||||
valueStore = append(valueStore, newValues)
|
||||
|
||||
if len(newValues) == 1 {
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
return convertToDecimal(valueStore[len(valueStore)-1][0])
|
||||
}
|
||||
|
||||
func getMostCommonValues(values [][]int) []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] {
|
||||
result[k] = 1
|
||||
} else {
|
||||
result[k] = 0
|
||||
}
|
||||
if ones[k] == zeros[k] {
|
||||
result[k] = 1
|
||||
}
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func getLeastCommonValues(values [][]int) []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] {
|
||||
result[k] = 0
|
||||
} else {
|
||||
result[k] = 1
|
||||
}
|
||||
if ones[k] == zeros[k] {
|
||||
result[k] = 0
|
||||
}
|
||||
}
|
||||
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
File diff suppressed because it is too large
Load Diff
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user