AoC2021/src/day3/day3.go

83 lines
2.0 KiB
Go

package main
import (
"AOC2021/src/helper"
"encoding/json"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
args := os.Args[1:]
input, err := helper.GetInput(args[0])
if err != nil {
fmt.Println(err)
}
intArray := make([][]int, len(input))
for i,line := range input {
runes := []rune(line)
numbers := helper.RunesToNumber(runes)
intArray[i] = numbers
}
part1(intArray)
part2(intArray)
}
func part2(intArray [][]int) {
oxygenGeneratorRating, _ := filterNumbersPart2(intArray, 0)
co2ScrubberRating, _ := filterNumbersPart2(intArray, 1)
fmt.Println(co2ScrubberRating * oxygenGeneratorRating)
}
func part1(intArray [][]int) {
gammaArray := getGammaArray(intArray, 0)
s, _ := json.Marshal(gammaArray)
gammaString := strings.Replace(strings.Trim(string(s), "[]"),",","",-1)
gamma, _ := strconv.ParseInt(gammaString, 2, 64)
invertBinary, _ := strconv.ParseInt(strings.Repeat("1", len(gammaString)), 2, 64)
fmt.Println(gamma * (gamma ^ invertBinary))
}
func filterNumbersPart2(intArray [][]int, invert int) (int64, error){
intArrayCopy := make([][]int, len(intArray))
copy(intArrayCopy, intArray)
gammaArray := getGammaArray(intArrayCopy, invert)
i := 0
for len(intArrayCopy) > 1 {
n := 0
for _, number := range intArrayCopy {
if number[i] == gammaArray[i] {
intArrayCopy[n] = number
n++
}
}
intArrayCopy = intArrayCopy[:n]
gammaArray = getGammaArray(intArrayCopy, invert)
i++
}
s, _ := json.Marshal(intArrayCopy[0])
intString := strings.Replace(strings.Trim(string(s), "[]"),",","",-1)
return strconv.ParseInt(intString, 2, 64)
}
func getGammaArray(intArray [][]int, invert int) []int {
transposedIntArray := helper.Transpose(intArray)
var gammaArray []int
for _, numbers := range transposedIntArray {
gammaArray = append(gammaArray, getBit(numbers, len(transposedIntArray[0]), invert))
}
return gammaArray
}
func getBit(numbers []int, length int, invert int) int{
sum := helper.AddNummbers(numbers...)
returnvalue := 1
if sum * 2 < length {
returnvalue = 0
}
return returnvalue ^ invert
}