2021-12-03 14:02:20 +01:00
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 ) {
2021-12-03 23:16:30 +01:00
oxygenGeneratorRating , _ := filterNumbersPart2 ( intArray , 0 )
co2ScrubberRating , _ := filterNumbersPart2 ( intArray , 1 )
2021-12-03 14:02:20 +01:00
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 ) {
2021-12-03 23:16:30 +01:00
intArrayCopy := make ( [ ] [ ] int , len ( intArray ) )
copy ( intArrayCopy , intArray )
gammaArray := getGammaArray ( intArrayCopy , invert )
2021-12-03 14:02:20 +01:00
i := 0
2021-12-03 23:16:30 +01:00
for len ( intArrayCopy ) > 1 {
2021-12-03 14:02:20 +01:00
n := 0
2021-12-03 23:16:30 +01:00
for _ , number := range intArrayCopy {
2021-12-03 14:02:20 +01:00
if number [ i ] == gammaArray [ i ] {
2021-12-03 23:16:30 +01:00
intArrayCopy [ n ] = number
2021-12-03 14:02:20 +01:00
n ++
}
}
2021-12-03 23:16:30 +01:00
intArrayCopy = intArrayCopy [ : n ]
gammaArray = getGammaArray ( intArrayCopy , invert )
2021-12-03 14:02:20 +01:00
i ++
}
2021-12-03 23:16:30 +01:00
s , _ := json . Marshal ( intArrayCopy [ 0 ] )
2021-12-03 14:02:20 +01:00
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
}