Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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)
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement