day23.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  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 i := 0; i < 10; i++ {
  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. for {
  74. if !inSequence(destination, pickup) {
  75. break
  76. }
  77. destination--
  78. if destination < min {
  79. _, newDestination := minMax(sequence)
  80. destination = newDestination
  81. break
  82. }
  83. }
  84. fmt.Println(pickup, destination)
  85. newSequence := make([]int, size)
  86. i = index + 1
  87. j := index + 4
  88. count := 0
  89. for count < size {
  90. count++
  91. if i > size-1 {
  92. i = 0
  93. }
  94. if j > size-1 {
  95. j = 0
  96. }
  97. newSequence[i] = sequence[j]
  98. if sequence[j] == destination {
  99. i++
  100. for _, cup := range pickup {
  101. if i > size-1 {
  102. i = 0
  103. }
  104. newSequence[i] = cup
  105. i++
  106. }
  107. count += 3
  108. j++
  109. continue
  110. }
  111. j++
  112. i++
  113. }
  114. fmt.Println(newSequence)
  115. sequence = newSequence
  116. index++
  117. if index < 0 {
  118. index = 0
  119. }
  120. }
  121. }
  122. func main() {
  123. if len(os.Args) < 2 {
  124. log.Fatal("You need to specify a sequence!")
  125. }
  126. sequence := processSequence(os.Args[1])
  127. min, max := minMax(sequence)
  128. part1(sequence, min, max)
  129. }