Guest User

Adventofcode.com day7 solution

a guest
Dec 6th, 2016
219
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 2.03 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "bufio"
  5.     "fmt"
  6.     "os"
  7.     "regexp"
  8.     "strings"
  9. )
  10.  
  11. func main() {
  12.     fmt.Println("Day 7 for Advent of Code 2016")
  13.  
  14.     information := read_input()
  15.  
  16.     var count_tls, count_ssl int
  17.     for i := 0; i < len(information); i++ {
  18.         brackets := extract_brackets(information[i])
  19.         supernet := information[i]
  20.         for _, str := range brackets {
  21.             supernet = strings.Replace(supernet, str, "", -1)
  22.         }
  23.         ABAs := get_abas(supernet)
  24.         var BABs []string
  25.         for _, str := range brackets {
  26.             BABs = append(BABs, get_abas(str[1:len(str)-1])...)
  27.         }
  28.         if validate_abas(ABAs, BABs) {
  29.             count_ssl += 1
  30.         }
  31.         if valid_brackets(brackets) {
  32.             if has_abba(information[i]) {
  33.                 count_tls += 1
  34.             }
  35.         }
  36.     }
  37.  
  38.     fmt.Printf("Part 1: %d IPs support TLS\n", count_tls)
  39.     fmt.Printf("Part 2: %d IPs support SSL\n", count_ssl)
  40. }
  41.  
  42. func get_abas(str string) []string {
  43.     var abas []string
  44.     for i := 1; i < len(str)-1; i++ {
  45.         if str[i-1] == str[i+1] {
  46.             abas = append(abas, str[i-1:i+2])
  47.         }
  48.     }
  49.     return abas
  50. }
  51.  
  52. func validate_abas(ABAs, BABs []string) bool {
  53.     for _, aba := range ABAs {
  54.         for _, bab := range BABs {
  55.             if aba_match(aba, bab) {
  56.                 return true
  57.             }
  58.         }
  59.     }
  60.     return false
  61. }
  62.  
  63. func aba_match(aba, bab string) bool {
  64.     return aba[1] == bab[0] && aba[0] == bab[1]
  65. }
  66.  
  67. func valid_brackets(b []string) bool {
  68.     for _, str := range b {
  69.         if has_abba(str) {
  70.             return false
  71.         }
  72.     }
  73.     return true
  74. }
  75.  
  76. func has_abba(str string) bool {
  77.     var a, b byte
  78.     a, b = str[0], str[1]
  79.     for i := 2; i < len(str)-1; i++ {
  80.         if b == str[i] && a == str[i+1] && a != b {
  81.             return true
  82.         }
  83.         a, b = str[i-1], str[i]
  84.     }
  85.     return false
  86. }
  87.  
  88. func extract_brackets(str string) []string {
  89.     re := regexp.MustCompile("\\[[[:alpha:]]+\\]")
  90.  
  91.     return re.FindAllString(str, -1)
  92. }
  93.  
  94. func read_input() []string {
  95.     f, err := os.Open("input")
  96.     check(err)
  97.  
  98.     scanner := bufio.NewScanner(f)
  99.  
  100.     var data []string
  101.     for scanner.Scan() {
  102.         data = append(data, scanner.Text())
  103.     }
  104.     return data
  105. }
  106.  
  107. func check(e error) {
  108.     if e != nil {
  109.         panic(e)
  110.     }
  111. }
Advertisement
Add Comment
Please, Sign In to add comment