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