Advertisement
Guest User

Advent of Code 2020 Day 3 Part 1

a guest
Dec 3rd, 2020
283
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 1.78 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "fmt"
  5.     "io/ioutil"
  6.     "log"
  7.     "os"
  8. )
  9.  
  10. func parse() map[int][]byte {
  11.     f, err := os.Open("input.txt")
  12.     if err != nil {
  13.         log.Println(err)
  14.     }
  15.     defer func() {
  16.         err = f.Close()
  17.         if err != nil {
  18.             log.Println(err)
  19.         }
  20.     }()
  21.  
  22.     fb, err := ioutil.ReadAll(f)
  23.     if err != nil {
  24.         log.Println(err)
  25.     }
  26.  
  27.     var (
  28.         rows     = make(map[int][]byte)
  29.         sequence []byte
  30.         count    = 0
  31.     )
  32.     for i := range fb {
  33.         switch fb[i] {
  34.         case 10: // \n
  35.             rows[count] = sequence
  36.             sequence = nil
  37.             count++
  38.         default:
  39.             sequence = append(sequence, fb[i])
  40.         }
  41.     }
  42.     return rows
  43. }
  44.  
  45. func build_map(receive chan int, send chan []byte, rows map[int][]byte) {
  46.     for {
  47.         result := <-receive
  48.         switch {
  49.         case result <= len(rows):
  50.             send <- rows[result]
  51.         default:
  52.             fmt.Println("waiting...")
  53.         }
  54.     }
  55. }
  56.  
  57. var tree_warning int
  58.  
  59. func walk_map(send chan int, receive chan []byte, done chan bool) {
  60.     var row = 1
  61.     var position = 3
  62.     for {
  63.         send <- row
  64.         result := <-receive
  65.         var c int
  66.         for i := 0; i <= position; i++ {
  67.             if c >= len(result) {
  68.                 c = 0
  69.             }
  70.             if len(result) != 0 {
  71.                 switch {
  72.                 case i == position:
  73.                     if result[c] == 35 {
  74.                         fmt.Print("☆")
  75.                         tree_warning++
  76.                     } else {
  77.                         fmt.Print("♡")
  78.                     }
  79.                 case result[c] == 35: // #
  80.                     fmt.Print("#")
  81.                 case result[c] == 46: // .
  82.                     fmt.Print(".")
  83.                 }
  84.             }
  85.             c++
  86.         }
  87.  
  88.         switch {
  89.         case row == 323:
  90.             done <- true
  91.             return
  92.         default:
  93.             row++
  94.             position = position + 3
  95.         }
  96.         fmt.Println()
  97.     }
  98.     done <- true
  99. }
  100.  
  101. func main() {
  102.     var (
  103.         done    = make(chan bool)
  104.         send    = make(chan int)
  105.         receive = make(chan []byte)
  106.     )
  107.     rows := parse()
  108.     go build_map(send, receive, rows)
  109.     go walk_map(send, receive, done)
  110.     <-done
  111.     fmt.Println(tree_warning)
  112. }
  113.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement