code.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  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 main() {
  56. if len(os.Args) < 2 {
  57. log.Fatal("Please provide a file name as argument")
  58. }
  59. crabs, orderedCrabs := readInput(os.Args[1])
  60. fmt.Println("Part1: ", part1(crabs, orderedCrabs))
  61. }