code.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. package main
  2. import (
  3. "fmt"
  4. "log"
  5. "os"
  6. )
  7. func getDisk(diskMap []byte) (int, []int) {
  8. var disk []int
  9. file := true
  10. var fileID int
  11. for _, block := range diskMap {
  12. if block < 48 || block > 57 {
  13. continue
  14. }
  15. number := int(block) - 48
  16. if file {
  17. file = false
  18. for j := 0; j < number; j++ {
  19. disk = append(disk, fileID)
  20. }
  21. fileID++
  22. } else {
  23. file = true
  24. for j := 0; j < number; j++ {
  25. disk = append(disk, -1)
  26. }
  27. }
  28. }
  29. return int(diskMap[0]) - 48, disk
  30. }
  31. func compact(disk []int, free int) []int {
  32. end := len(disk) - 1
  33. for free < end {
  34. if disk[free] != -1 {
  35. free++
  36. continue
  37. }
  38. if disk[end] == -1 {
  39. end--
  40. continue
  41. }
  42. disk[free], disk[end] = disk[end], disk[free]
  43. free++
  44. end--
  45. }
  46. return disk
  47. }
  48. func calculateChecksum(disk []int) int64 {
  49. var checksum int64
  50. for i := range disk {
  51. if disk[i] != -1 {
  52. checksum += int64(disk[i] * i)
  53. }
  54. }
  55. return checksum
  56. }
  57. func part1(diskMap []byte) int64 {
  58. free, disk := getDisk(diskMap)
  59. compacted := compact(disk, free)
  60. return calculateChecksum(compacted)
  61. }
  62. func main() {
  63. if len(os.Args) < 2 {
  64. log.Fatal("You need to specify a file!")
  65. }
  66. diskMap, err := os.ReadFile(os.Args[1])
  67. if err != nil {
  68. log.Fatal(err)
  69. }
  70. fmt.Println("Part1:", part1(diskMap))
  71. }