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", 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 ConvertToUsefulDataPart2(s []string) [][]uint { a := make([][]uint, len(s)) for i := range a { a[i] = make([]uint, len(s[0])) } 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 WhichIsMore(data []uint) int { dict := make(map[uint]uint) for _, entry := range data { dict[entry] = dict[entry] + 1 } if dict[0] == dict[1] { return 1 } if dict[0] < dict[1] { return 1 } if dict[0] > dict[1] { return 0 } return 0 } func Part2(data [][]uint) (uint, uint) { oxygenRate := uint(0) for _, row := range data { fmt.Println(row) more := WhichIsMore(row) //countOnly := WhichIsMore(row) switch more { case 0: case 1: } } for _, row := range data { fmt.Println(row) } return 0, 0 }