Advertisement
Guest User

Untitled

a guest
Dec 3rd, 2021
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 2.26 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "strconv"
  5.     "strings"
  6. )
  7.  
  8. func GammaRate(values []string) (g string) {
  9.     c := make([]int, len(values[0]))
  10.     for _, s := range values {
  11.         for i, v := range s {
  12.             if v == '1' {
  13.                 c[i]++
  14.             }
  15.         }
  16.     }
  17.     for _, v := range c {
  18.         if v >= len(values)/2 {
  19.             g += "1"
  20.         } else {
  21.             g += "0"
  22.         }
  23.     }
  24.     return
  25. }
  26.  
  27. func EpsilonRate(g string) (e string) {
  28.     for _, v := range g {
  29.         if v == '1' {
  30.             e += "0"
  31.         } else {
  32.             e += "1"
  33.         }
  34.     }
  35.     return
  36. }
  37.  
  38. func PartOne(values []string) int {
  39.     gs := GammaRate(values)
  40.     es := EpsilonRate(gs)
  41.     g, _ := strconv.ParseInt(gs, 2, 64)
  42.     e, _ := strconv.ParseInt(es, 2, 64)
  43.     return int(g * e)
  44. }
  45.  
  46. func OxygenGeneratorRating(s []string, seed string) []string {
  47.     // condizione finale ambigua
  48.     if len(s) == 2 {
  49.         if s[0] > s[1] {
  50.             return []string{s[0]}
  51.         }
  52.         return []string{s[1]}
  53.     }
  54.     // conta il valore in prevalenza nella posizione len(seed)
  55.     var one, zero int
  56.     for _, v := range s {
  57.         if v[len(seed)] == '1' {
  58.             one++
  59.         } else {
  60.             zero++
  61.         }
  62.     }
  63.     if one >= zero {
  64.         seed += "1"
  65.     } else {
  66.         seed += "0"
  67.     }
  68.     // filtra gli elementi che iniziano con seed
  69.     f := make([]string, 0)
  70.     for _, v := range s {
  71.         if strings.HasPrefix(v, seed) {
  72.             f = append(f, v)
  73.         }
  74.     }
  75.     // fine
  76.     if len(seed) == len(s[0]) {
  77.         return f
  78.     } else {
  79.         return OxygenGeneratorRating(f, seed)
  80.     }
  81. }
  82.  
  83. func CO2ScrubberRating(s []string, seed string) []string {
  84.     // condizione finale ambigua
  85.     if len(s) == 2 {
  86.         if s[0] < s[1] {
  87.             return []string{s[0]}
  88.         }
  89.         return []string{s[1]}
  90.     }
  91.     // conta il valore in prevalenza nella posizione len(seed)
  92.     var one, zero int
  93.     for _, v := range s {
  94.         if v[len(seed)] == '1' {
  95.             one++
  96.         } else {
  97.             zero++
  98.         }
  99.     }
  100.     if one >= zero {
  101.         seed += "0"
  102.     } else {
  103.         seed += "1"
  104.     }
  105.     // filtra gli elementi che iniziano con seed
  106.     f := make([]string, 0)
  107.     for _, v := range s {
  108.         if strings.HasPrefix(v, seed) {
  109.             f = append(f, v)
  110.         }
  111.     }
  112.     // fine
  113.     if len(seed) == len(s[0]) {
  114.         return f
  115.     } else {
  116.         return CO2ScrubberRating(f, seed)
  117.     }
  118. }
  119.  
  120. func PartTwo(values []string) int {
  121.     ogr := OxygenGeneratorRating(values, "")[0]
  122.     csr := CO2ScrubberRating(values, "")[0]
  123.     o, _ := strconv.ParseInt(ogr, 2, 64)
  124.     c, _ := strconv.ParseInt(csr, 2, 64)
  125.     return int(c * o)
  126. }
  127.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement