day15.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. package main
  2. import (
  3. "fmt"
  4. "log"
  5. "os"
  6. "strings"
  7. )
  8. var lastNumber 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. lastNumber = number
  18. numbersSpoken[number] = [2]int{i + 1, 0}
  19. }
  20. }
  21. func playGame(currentRound, end int) int {
  22. var currentNumber int
  23. for ; currentRound <= end; currentRound++ {
  24. if spoken, ok := numbersSpoken[lastNumber]; !ok {
  25. currentNumber = 0
  26. } else {
  27. if spoken[1] == 0 {
  28. currentNumber = 0
  29. } else {
  30. currentNumber = spoken[1] - spoken[0]
  31. }
  32. }
  33. if _, ok := numbersSpoken[currentNumber]; !ok {
  34. numbersSpoken[currentNumber] = [2]int{currentRound, 0}
  35. } else {
  36. if numbersSpoken[currentNumber][1] == 0 {
  37. numbersSpoken[currentNumber] = [2]int{numbersSpoken[currentNumber][0], currentRound}
  38. } else {
  39. numbersSpoken[currentNumber] = [2]int{numbersSpoken[currentNumber][1], currentRound}
  40. }
  41. }
  42. lastNumber = currentNumber
  43. }
  44. return currentNumber
  45. }
  46. func init() {
  47. numbersSpoken = make(map[int][2]int)
  48. }
  49. func main() {
  50. if len(os.Args) < 2 {
  51. log.Fatal("You need to specify starting numbers!")
  52. }
  53. readNumbers(os.Args[1])
  54. fmt.Println("Part1:", playGame(len(numbersSpoken)+1, 2020))
  55. fmt.Println("Part2:", playGame(2021, 30000000))
  56. }