package main import ( "bufio" "fmt" "os" "strconv" ) func findValue(sl *[]string, ox bool) { var c byte if ox { c = '1' } else { c = '0' } if sl != nil && len(*sl) > 0 { size := len((*sl)[0]) for i := 0; i < size && len(*sl) != 1; i++ { var z = make([]string, 0) // Check common bit // count := 0 for _, s := range *sl { if s[i] == c { count++ } } var flag bool if ox { flag = 2*count >= len(*sl) } else { flag = 2*count > len(*sl) } // Save with bit criteria // for _, s := range *sl { if flag && s[i] == '1' || !flag && s[i] == '0' { z = append(z, s) } } *sl = z } } } func main() { fin, _ := os.Open("input.txt") defer fin.Close() scan := bufio.NewScanner(fin) file := make([]string, 0) count := 0 var counters []int var gamma []byte var epsilon []byte var size int for scan.Scan() { str := scan.Text() file = append(file, str) if count == 0 { size = len(str) counters = make([]int, size) gamma = make([]byte, size) epsilon = make([]byte, size) } for i := 0; i < size; i++ { if str[i] == '1' { counters[i]++ } } count++ } // Calc gamma & epsilon for i := 0; i < size; i++ { if counters[i] > count/2 { gamma[i] = '1' epsilon[i] = '0' } else { gamma[i] = '0' epsilon[i] = '1' } } g := string(gamma[:]) e := string(epsilon[:]) gi, _ := strconv.ParseUint(g, 2, size) ei, _ := strconv.ParseUint(e, 2, size) fmt.Printf("gamma * epsilon = %d\n", gi*ei) ///////////////////////////////////////////////////////////////////////////// // Second Part ////////////////////////////////////////////////////////////// var slOx []string = make([]string, len(file)) var slCO2 []string = make([]string, len(file)) copy(slOx, file) copy(slCO2, file) findValue(&slOx, true) findValue(&slCO2, false) // Print values sNum := slOx[0] oxRate, _ := strconv.ParseUint(sNum, 2, size) fmt.Printf("Oxygen generator rating = %d\n", oxRate) sNum = slCO2[0] co2Rate, _ := strconv.ParseUint(sNum, 2, size) fmt.Printf("CO2 scrubber rating = %d\n", co2Rate) fmt.Printf("Life support rating = %d\n", oxRate*co2Rate) }