code.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. package main
  2. import (
  3. "bufio"
  4. "fmt"
  5. "log"
  6. "os"
  7. "strings"
  8. )
  9. const Time = "Time: "
  10. const Distance = "Distance: "
  11. func readInput(file *os.File) [][]int {
  12. scanner := bufio.NewScanner(file)
  13. var matrix [][]int
  14. for scanner.Scan() {
  15. line := scanner.Text()
  16. if line == "" {
  17. break
  18. }
  19. if strings.HasPrefix(line, Time) {
  20. line = strings.TrimLeft(line, Time)
  21. } else {
  22. line = strings.TrimLeft(line, Distance)
  23. }
  24. parts := strings.Split(line, " ")
  25. if len(parts) == 0 {
  26. log.Fatalf("Wrong input: %s", line)
  27. }
  28. var numbers []int
  29. for i := range parts {
  30. if parts[i] == "" {
  31. continue
  32. }
  33. var number int
  34. n, err := fmt.Sscanf(parts[i], "%d", &number)
  35. if n != 1 || err != nil {
  36. log.Fatalf("Failed to read number: %s\n%s", parts[i], err)
  37. }
  38. numbers = append(numbers, number)
  39. }
  40. matrix = append(matrix, numbers)
  41. if len(matrix) == 2 {
  42. break
  43. }
  44. }
  45. return matrix
  46. }
  47. func part1(matrix [][]int) int {
  48. result := 1
  49. for i := range matrix[0] {
  50. min := matrix[1][i] / matrix[0][i]
  51. for {
  52. if min*(matrix[0][i]-min) > matrix[1][i] {
  53. break
  54. }
  55. min++
  56. }
  57. result *= matrix[0][i] - min - min + 1
  58. }
  59. return result
  60. }
  61. func main() {
  62. if len(os.Args) < 2 {
  63. log.Fatal("You need to specify a file!")
  64. }
  65. filePath := os.Args[1]
  66. file, err := os.Open(filePath)
  67. if err != nil {
  68. log.Fatalf("Failed to open %s!\n", filePath)
  69. }
  70. matrix := readInput(file)
  71. fmt.Println(part1(matrix))
  72. }