Advertisement
Guest User

Advent of Code 2020 Day 6

a guest
Dec 6th, 2020
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 3.66 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "log"
  5.     "os"
  6. )
  7.  
  8. type group struct { // groups parties together
  9.     answers []map[int]bool // each party gets there own set
  10.     size    int         // how many parties in group
  11. }
  12.  
  13. func get_group_sizes() (gs []int, gc int) {
  14.     f, err := os.Open("input.txt")
  15.     if err != nil {
  16.         log.Println(err)
  17.     }
  18.     defer func() {
  19.         err = f.Close()
  20.         if err != nil {
  21.             log.Println(err)
  22.         }
  23.     }()
  24.  
  25.     buf := make([]byte, 1)
  26.     previous_byte := make([]byte, 1)
  27.     count := 0
  28.     var group_count int
  29.     var group_sizes []int
  30.     for {
  31.         _, err := f.Read(buf)
  32.         if err != nil { // EOF, append last group
  33.             group_sizes = append(group_sizes, count)
  34.             group_count++
  35.             break
  36.         }
  37.  
  38.         // count newlines: "people"
  39.         // on double newline, "group end", append group
  40.         switch {
  41.         case buf[0] == 10 && previous_byte[0] == 10:
  42.             group_sizes = append(group_sizes, count)
  43.             count = 0
  44.             group_count++
  45.         case buf[0] == 10:
  46.             count++
  47.         }
  48.  
  49.         previous_byte[0] = buf[0]
  50.     }
  51.     return group_sizes, group_count
  52. }
  53.  
  54. func get_group_answers(group_sizes []int, group_count int) []group {
  55.     // 2195 lines
  56.     f, err := os.Open("input.txt")
  57.     if err != nil {
  58.         log.Println(err)
  59.     }
  60.     defer func() {
  61.         err = f.Close()
  62.         if err != nil {
  63.             log.Println(err)
  64.         }
  65.     }()
  66.  
  67.     groups := make([]group, group_count)
  68.     for i := range groups {
  69.         groups[i].answers = make([]map[int]bool, group_sizes[i]+1)
  70.         for z := range groups[i].answers {
  71.             groups[i].answers[z] = make(map[int]bool, 0)
  72.         }
  73.     }
  74.  
  75.     i := 0; l := 0
  76.     buf := make([]byte, 1)
  77.     previous_byte := make([]byte, 1)
  78.  
  79.     for {
  80.         _, err = f.Read(buf)
  81.         if err != nil {
  82.             groups[i].size = group_sizes[i]
  83.             break // EOF
  84.         }
  85.  
  86.         // a-z mapping
  87.         switch string(buf[0]) {
  88.         case "a":
  89.             groups[i].answers[l][0] = true
  90.         case "b":
  91.             groups[i].answers[l][1] = true
  92.         case "c":
  93.             groups[i].answers[l][2] = true
  94.         case "d":
  95.             groups[i].answers[l][3] = true
  96.         case "e":
  97.             groups[i].answers[l][4] = true
  98.         case "f":
  99.             groups[i].answers[l][5] = true
  100.         case "g":
  101.             groups[i].answers[l][6] = true
  102.         case "h":
  103.             groups[i].answers[l][7] = true
  104.         case "i":
  105.             groups[i].answers[l][8] = true
  106.         case "j":
  107.             groups[i].answers[l][9] = true
  108.         case "k":
  109.             groups[i].answers[l][10] = true
  110.         case "l":
  111.             groups[i].answers[l][11] = true
  112.         case "m":
  113.             groups[i].answers[l][12] = true
  114.         case "n":
  115.             groups[i].answers[l][13] = true
  116.         case "o":
  117.             groups[i].answers[l][14] = true
  118.         case "p":
  119.             groups[i].answers[l][15] = true
  120.         case "q":
  121.             groups[i].answers[l][16] = true
  122.         case "r":
  123.             groups[i].answers[l][17] = true
  124.         case "s":
  125.             groups[i].answers[l][18] = true
  126.         case "t":
  127.             groups[i].answers[l][19] = true
  128.         case "u":
  129.             groups[i].answers[l][20] = true
  130.         case "v":
  131.             groups[i].answers[l][21] = true
  132.         case "w":
  133.             groups[i].answers[l][22] = true
  134.         case "x":
  135.             groups[i].answers[l][23] = true
  136.         case "y":
  137.             groups[i].answers[l][24] = true
  138.         case "z":
  139.             groups[i].answers[l][25] = true
  140.         case "\n":
  141.             if string(previous_byte[0]) == "\n" {
  142.                 groups[i].size = group_sizes[i]
  143.                 i++
  144.                 l = 0
  145.             } else {
  146.                 l++
  147.             }
  148.         default:
  149.             print(buf[0])
  150.         }
  151.  
  152.         previous_byte[0] = buf[0]
  153.     }
  154.  
  155.     return groups
  156. }
  157.  
  158. func check_answers(groups []group, x int, c int) {
  159.     for x != len(groups) {
  160.         question := 0
  161.         for question < 26 { // a-z
  162.             person := 0
  163.             for groups[x].answers[person][question] != false {
  164.                 person++
  165.             }
  166.             if person == groups[x].size {
  167.                 c++
  168.             }
  169.             // cycle to next question
  170.             question++
  171.         }
  172.  
  173.         x++ // cycle to next group
  174.     }
  175.     print(c)
  176. }
  177.  
  178. func main() {
  179.     group_sizes, group_count := get_group_sizes()
  180.     groups := get_group_answers(group_sizes, group_count)
  181.     check_answers(groups, 0, 0)
  182. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement