code.go 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package main
  2. import (
  3. "bufio"
  4. "fmt"
  5. "log"
  6. "os"
  7. "sort"
  8. )
  9. type tile struct {
  10. x, y int
  11. }
  12. func readInput(file *os.File) []tile {
  13. scanner := bufio.NewScanner(file)
  14. var tiles []tile
  15. for scanner.Scan() {
  16. line := scanner.Text()
  17. if line == "" {
  18. continue
  19. }
  20. var x, y int
  21. n, err := fmt.Sscanf(line, "%d,%d", &x, &y)
  22. if n != 2 || err != nil {
  23. log.Fatalf("Bad input: %s", line)
  24. }
  25. tiles = append(tiles, tile{x: x, y: y})
  26. }
  27. return tiles
  28. }
  29. func abs(a int) int {
  30. if a < 0 {
  31. return -a
  32. }
  33. return a
  34. }
  35. func part1(tiles []tile) int {
  36. last := len(tiles) - 1
  37. return abs(tiles[last].x-tiles[0].x+1) * abs(tiles[last].y-tiles[0].y+1)
  38. }
  39. func main() {
  40. if len(os.Args) < 2 {
  41. log.Fatal("You need to specify a file!")
  42. }
  43. filePath := os.Args[1]
  44. file, err := os.Open(filePath)
  45. if err != nil {
  46. log.Fatalf("Failed to open %s!\n", filePath)
  47. }
  48. tiles := readInput(file)
  49. sort.Slice(tiles, func(i, j int) bool {
  50. if tiles[i].x == tiles[j].x {
  51. return tiles[i].y < tiles[j].y
  52. }
  53. return tiles[i].x < tiles[j].x
  54. })
  55. fmt.Println("Part1:", part1(tiles))
  56. }