day15.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package main
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. "log"
  6. "os"
  7. "strings"
  8. )
  9. var rounds map[int]int
  10. var numbersSpoken map[int][2]int
  11. func readFile(filePath string) {
  12. content, err := ioutil.ReadFile(filePath)
  13. if err != nil {
  14. log.Fatal(err)
  15. }
  16. for i, item := range strings.Split(string(content), ",") {
  17. var number int
  18. n, err := fmt.Sscanf(item, "%d", &number)
  19. if err != nil || n < 1 {
  20. log.Fatal(err)
  21. }
  22. rounds[i+1] = number
  23. numbersSpoken[number] = [2]int{i + 1, 0}
  24. }
  25. }
  26. func playGame(limit int) int {
  27. currentRound := len(rounds) + 1
  28. var currentNumber int
  29. for ; currentRound <= limit; currentRound++ {
  30. lastNumber := rounds[currentRound-1]
  31. if spoken, ok := numbersSpoken[lastNumber]; !ok {
  32. currentNumber = rounds[1]
  33. } else {
  34. if spoken[1] == 0 {
  35. currentNumber = rounds[1]
  36. } else {
  37. currentNumber = spoken[1] - spoken[0]
  38. }
  39. }
  40. rounds[currentRound] = currentNumber
  41. if _, ok := numbersSpoken[currentNumber]; !ok {
  42. numbersSpoken[currentNumber] = [2]int{currentRound, 0}
  43. } else {
  44. if numbersSpoken[currentNumber][1] == 0 {
  45. numbersSpoken[currentNumber] = [2]int{numbersSpoken[currentNumber][0], currentRound}
  46. } else {
  47. numbersSpoken[currentNumber] = [2]int{numbersSpoken[currentNumber][1], currentRound}
  48. }
  49. }
  50. }
  51. return currentNumber
  52. }
  53. func init() {
  54. rounds = make(map[int]int)
  55. numbersSpoken = make(map[int][2]int)
  56. }
  57. func main() {
  58. if len(os.Args) < 2 {
  59. log.Fatal("You need to specify a file!")
  60. }
  61. readFile(os.Args[1])
  62. fmt.Println(playGame(2020))
  63. }