SimoCode

AOC_03

Dec 6th, 2021 (edited)
777
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. package main
  2.  
  3. import (
  4.     "bufio"
  5.     "fmt"
  6.     "os"
  7.     "strconv"
  8. )
  9.  
  10. func findValue(sl *[]string, ox bool) {
  11.     var c byte
  12.     if ox {
  13.         c = '1'
  14.     } else {
  15.         c = '0'
  16.     }
  17.     if sl != nil && len(*sl) > 0 {
  18.         size := len((*sl)[0])
  19.  
  20.         for i := 0; i < size && len(*sl) != 1; i++ {
  21.             var z = make([]string, 0)
  22.             // Check common bit //
  23.             count := 0
  24.  
  25.             for _, s := range *sl {
  26.                 if s[i] == c {
  27.                     count++
  28.                 }
  29.             }
  30.             var flag bool
  31.             if ox {
  32.                 flag = 2*count >= len(*sl)
  33.             } else {
  34.                 flag = 2*count > len(*sl)
  35.             }
  36.  
  37.             // Save with bit criteria //
  38.             for _, s := range *sl {
  39.                 if flag && s[i] == '1' || !flag && s[i] == '0' {
  40.                     z = append(z, s)
  41.                 }
  42.             }
  43.  
  44.             *sl = z
  45.         }
  46.     }
  47. }
  48.  
  49. func main() {
  50.     fin, _ := os.Open("input.txt")
  51.     defer fin.Close()
  52.  
  53.     scan := bufio.NewScanner(fin)
  54.     file := make([]string, 0)
  55.     count := 0
  56.     var counters []int
  57.     var gamma []byte
  58.     var epsilon []byte
  59.  
  60.     var size int
  61.     for scan.Scan() {
  62.         str := scan.Text()
  63.         file = append(file, str)
  64.  
  65.         if count == 0 {
  66.             size = len(str)
  67.             counters = make([]int, size)
  68.             gamma = make([]byte, size)
  69.             epsilon = make([]byte, size)
  70.         }
  71.  
  72.         for i := 0; i < size; i++ {
  73.             if str[i] == '1' {
  74.                 counters[i]++
  75.             }
  76.         }
  77.  
  78.         count++
  79.     }
  80.  
  81.     // Calc gamma & epsilon
  82.  
  83.     for i := 0; i < size; i++ {
  84.         if counters[i] > count/2 {
  85.             gamma[i] = '1'
  86.             epsilon[i] = '0'
  87.         } else {
  88.             gamma[i] = '0'
  89.             epsilon[i] = '1'
  90.         }
  91.     }
  92.  
  93.     g := string(gamma[:])
  94.     e := string(epsilon[:])
  95.  
  96.     gi, _ := strconv.ParseUint(g, 2, size)
  97.     ei, _ := strconv.ParseUint(e, 2, size)
  98.  
  99.     fmt.Printf("gamma * epsilon = %d\n", gi*ei)
  100.  
  101.     /////////////////////////////////////////////////////////////////////////////
  102.     // Second Part //////////////////////////////////////////////////////////////
  103.     var slOx []string = make([]string, len(file))
  104.     var slCO2 []string = make([]string, len(file))
  105.  
  106.     copy(slOx, file)
  107.     copy(slCO2, file)
  108.  
  109.     findValue(&slOx, true)
  110.     findValue(&slCO2, false)
  111.  
  112.     // Print values
  113.     sNum := slOx[0]
  114.     oxRate, _ := strconv.ParseUint(sNum, 2, size)
  115.     fmt.Printf("Oxygen generator rating = %d\n", oxRate)
  116.  
  117.     sNum = slCO2[0]
  118.     co2Rate, _ := strconv.ParseUint(sNum, 2, size)
  119.     fmt.Printf("CO2 scrubber rating = %d\n", co2Rate)
  120.  
  121.     fmt.Printf("Life support rating = %d\n", oxRate*co2Rate)
  122. }
  123.  
RAW Paste Data