This commit is contained in:
Karl Spickermann 2021-12-03 14:02:20 +01:00
parent 79b00adf08
commit 6491807ab8
4 changed files with 1117 additions and 4 deletions

80
src/day3/day3.go Normal file
View File

@ -0,0 +1,80 @@
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(append([][]int(nil), intArray...), 0)
co2ScrubberRating, _ := filterNumbersPart2(append([][]int(nil), 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){
gammaArray := getGammaArray(intArray, invert)
i := 0
for len(intArray) > 1 {
n := 0
for _, number := range intArray {
if number[i] == gammaArray[i] {
intArray[n] = number
n++
}
}
intArray = intArray[:n]
gammaArray = getGammaArray(intArray, invert)
i++
}
s, _ := json.Marshal(intArray[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
}

1000
src/day3/day3Input.txt Normal file

File diff suppressed because it is too large Load Diff

12
src/day3/day3Test.txt Normal file
View File

@ -0,0 +1,12 @@
00100
11110
10110
10111
10101
01111
00111
11100
10000
11001
00010
01010

View File

@ -8,6 +8,8 @@ import (
"strings"
)
type convert func(int) string
func GetInput(filename string) ([]string, error) {
content, err := ioutil.ReadFile(filename)
if err != nil {
@ -37,6 +39,15 @@ func MapToNumber(strings []string) ([]int, error) {
return numbers, nil
}
func RunesToNumber(runes []rune) []int {
var numbers []int
for _, r := range runes {
number := int(r - '0')
numbers = append(numbers, number)
}
return numbers
}
func FindAddendsForSum(possibleAddends []int, sum int) (int, int, error) {
var array = make([]int, len(possibleAddends))
copy(array, possibleAddends)
@ -66,7 +77,7 @@ func SliceIndex(limit int, predicate func(i int) bool) int {
return -1
}
func DeleteAt(a []int, i int, ) []int {
func DeleteAt(a []int, i int) []int {
return append(a[:i], a[i+1:]...)
}
@ -82,9 +93,9 @@ func Equal(a, b []int) bool {
return true
}
func Contains(elem int, array []int) bool{
for _, val := range array{
if val == elem{
func Contains(elem int, array []int) bool {
for _, val := range array {
if val == elem {
return true
}
}
@ -98,3 +109,13 @@ func AddNummbers(numbers ...int) int {
}
return result
}
func Transpose(in [][]int) [][]int {
out := make([][]int, len(in[0]))
for i := 0; i < len(in); i += 1 {
for j := 0; j < len(in[0]); j += 1 {
out[j] = append(out[j], in[i][j])
}
}
return out
}