day23.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. package main
  2. import (
  3. "fmt"
  4. "log"
  5. "os"
  6. "strconv"
  7. )
  8. func processSequence(input string) []int {
  9. var sequence []int
  10. for _, letter := range input {
  11. cup, err := strconv.Atoi(string(letter))
  12. if err != nil {
  13. log.Fatalf("Error processing cup for %s: %s", letter, err)
  14. }
  15. sequence = append(sequence, cup)
  16. }
  17. return sequence
  18. }
  19. func minMax(sequence []int) (int, int) {
  20. max := 0
  21. min := 9
  22. for _, cup := range sequence {
  23. if cup > max {
  24. max = cup
  25. }
  26. if cup < min {
  27. min = cup
  28. }
  29. }
  30. return min, max
  31. }
  32. func inSequence(value int, sequence []int) bool {
  33. for _, item := range sequence {
  34. if item == value {
  35. return true
  36. }
  37. }
  38. return false
  39. }
  40. func indexOf(value int, sequence []int) int {
  41. for i, item := range sequence {
  42. if item == value {
  43. return i
  44. }
  45. }
  46. return -1
  47. }
  48. func getThreeCups(sequence []int, index int) []int {
  49. count := 0
  50. length := len(sequence) - 1
  51. var cups []int
  52. for count < 3 {
  53. if index > length {
  54. index = 0
  55. }
  56. cups = append(cups, sequence[index])
  57. count++
  58. index++
  59. }
  60. return cups
  61. }
  62. func part1(sequence []int, min, max int) {
  63. index := 0
  64. size := len(sequence)
  65. for iterations := 0; iterations < 10; iterations++ {
  66. pickup := getThreeCups(sequence, index+1)
  67. for j, _ := range sequence {
  68. if j > index && j < index+4 {
  69. sequence[j] = 0
  70. }
  71. }
  72. destination := sequence[index] - 1
  73. fmt.Println(index, destination)
  74. for {
  75. if destination < min {
  76. _, newDestination := minMax(sequence)
  77. destination = newDestination
  78. break
  79. }
  80. if !inSequence(destination, pickup) {
  81. break
  82. }
  83. destination--
  84. }
  85. fmt.Println(pickup, destination)
  86. newSequence := make([]int, size)
  87. i := index + 1
  88. j := index + 4
  89. if j > size-1 {
  90. j = j - size
  91. }
  92. count := 0
  93. for count < size {
  94. count++
  95. if i > size-1 {
  96. i = 0
  97. }
  98. if j > size-1 {
  99. j = 0
  100. }
  101. newSequence[i] = sequence[j]
  102. if sequence[j] == destination {
  103. i++
  104. for _, cup := range pickup {
  105. if i > size-1 {
  106. i = 0
  107. }
  108. newSequence[i] = cup
  109. i++
  110. }
  111. count += 3
  112. j++
  113. continue
  114. }
  115. j++
  116. i++
  117. }
  118. fmt.Println(newSequence)
  119. sequence = newSequence
  120. index++
  121. if index > size-1 {
  122. index = 0
  123. }
  124. }
  125. }
  126. func main() {
  127. if len(os.Args) < 2 {
  128. log.Fatal("You need to specify a sequence!")
  129. }
  130. sequence := processSequence(os.Args[1])
  131. min, max := minMax(sequence)
  132. part1(sequence, min, max)
  133. }