day15.go 1.4 KB

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