Day3
This commit is contained in:
parent
79b00adf08
commit
6491807ab8
|
@ -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
|
||||
}
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,12 @@
|
|||
00100
|
||||
11110
|
||||
10110
|
||||
10111
|
||||
10101
|
||||
01111
|
||||
00111
|
||||
11100
|
||||
10000
|
||||
11001
|
||||
00010
|
||||
01010
|
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user