code.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. package main
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. "log"
  6. "os"
  7. "sort"
  8. "strconv"
  9. "strings"
  10. )
  11. func readInput(file string) (map[int]int, []int) {
  12. content, err := ioutil.ReadFile(file)
  13. if err != nil {
  14. log.Fatal(err)
  15. }
  16. numberStrings := strings.Split(string(content), ",")
  17. crabs := make(map[int]int)
  18. var orderedCrabs []int
  19. for _, numberString := range numberStrings {
  20. if numberString == "" {
  21. continue
  22. }
  23. if number, err := strconv.Atoi(numberString); err == nil {
  24. if _, ok := crabs[number]; !ok {
  25. orderedCrabs = append(orderedCrabs, number)
  26. }
  27. crabs[number]++
  28. } else {
  29. log.Fatal(err)
  30. }
  31. }
  32. sort.Ints(orderedCrabs)
  33. return crabs, orderedCrabs
  34. }
  35. func part1(crabs map[int]int, orderedCrabs []int) int {
  36. shortest := 10000000
  37. for _, crab := range orderedCrabs {
  38. route := 0
  39. for key, value := range crabs {
  40. if key == crab {
  41. continue
  42. }
  43. if key < crab {
  44. route += (crab - key) * value
  45. } else {
  46. route += (key - crab) * value
  47. }
  48. }
  49. if route < shortest {
  50. shortest = route
  51. }
  52. }
  53. return shortest
  54. }
  55. func part2(crabs map[int]int, orderedCrabs []int) int {
  56. shortest := 1000000000
  57. max := orderedCrabs[len(orderedCrabs)-1]
  58. for crab := orderedCrabs[0]; crab <= max; crab++ {
  59. route := 0
  60. for key, value := range crabs {
  61. if key == crab {
  62. continue
  63. }
  64. steps := 0
  65. if key < crab {
  66. steps = crab - key
  67. } else {
  68. steps = key - crab
  69. }
  70. for i := 0; i < steps; i++ {
  71. route += (i + 1) * value
  72. }
  73. }
  74. if route < shortest {
  75. shortest = route
  76. }
  77. }
  78. return shortest
  79. }
  80. func main() {
  81. if len(os.Args) < 2 {
  82. log.Fatal("Please provide a file name as argument")
  83. }
  84. crabs, orderedCrabs := readInput(os.Args[1])
  85. fmt.Println("Part1: ", part1(crabs, orderedCrabs))
  86. fmt.Println("Part2: ", part2(crabs, orderedCrabs))
  87. }