96 lines
1.9 KiB
Go
96 lines
1.9 KiB
Go
package main
|
|
|
|
import (
|
|
"bufio"
|
|
"fmt"
|
|
"math/bits"
|
|
"os"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
func GetData(s string) []string {
|
|
var result []string
|
|
fileReader, err := os.Open(s)
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
lines := bufio.NewScanner(fileReader)
|
|
lines.Split(bufio.ScanLines)
|
|
for lines.Scan() {
|
|
result = append(result, lines.Text())
|
|
}
|
|
return result
|
|
}
|
|
func ConvertToUsefulData(s []string) [][]uint {
|
|
a := make([][]uint, len(s[0]))
|
|
for i := range a {
|
|
a[i] = make([]uint, len(s))
|
|
}
|
|
for i, data := range s {
|
|
split := strings.Split(data, "")
|
|
for j, data2 := range split {
|
|
x, _ := strconv.Atoi(data2)
|
|
a[j][i] = uint(x)
|
|
}
|
|
}
|
|
return a
|
|
}
|
|
func main() {
|
|
result := Part1(ConvertToUsefulData(GetData("./data")))
|
|
fmt.Printf("The Power consumption is: %d\n", result)
|
|
}
|
|
|
|
func Part1(data [][]uint) uint {
|
|
gammaRate := uint(0)
|
|
epsilonRate := uint(0)
|
|
for _, rows := range data {
|
|
dict := make(map[uint]uint)
|
|
for _, entry := range rows {
|
|
dict[entry] = dict[entry] + 1
|
|
}
|
|
if dict[0] > dict[1] {
|
|
gammaRate = gammaRate << 1
|
|
epsilonRate = epsilonRate << 1
|
|
epsilonRate, _ = bits.Add(epsilonRate, 1, 0)
|
|
} else {
|
|
gammaRate = gammaRate << 1
|
|
epsilonRate = epsilonRate << 1
|
|
gammaRate, _ = bits.Add(gammaRate, 1, 0)
|
|
}
|
|
}
|
|
//fmt.Printf("Gamma Rate: %b as int (%d)\n", gammaRate, gammaRate)
|
|
//fmt.Printf("Epsilon Rate: %b as int (%d)\n", epsilonRate, epsilonRate)
|
|
|
|
return gammaRate * epsilonRate
|
|
}
|
|
|
|
func dataSliceConvert(data [][]uint) [][]uint {
|
|
a := make([][]uint, len(data[0]))
|
|
for i := range a {
|
|
a[i] = make([]uint, len(data))
|
|
}
|
|
for i, row := range data {
|
|
for j, dataEntry := range row {
|
|
a[j][i] = dataEntry
|
|
}
|
|
}
|
|
return a
|
|
}
|
|
|
|
func OxygenRate(data [][]uint) uint {
|
|
return 0
|
|
}
|
|
func Co2Rate(data [][]uint) uint {
|
|
|
|
return 0
|
|
}
|
|
|
|
func Part2(data [][]uint) (uint, uint) {
|
|
ordered := dataSliceConvert(data)
|
|
for _, d := range ordered {
|
|
fmt.Println(d)
|
|
}
|
|
|
|
return 0, 0
|
|
}
|