87 lines
1.9 KiB
Go
87 lines
1.9 KiB
Go
package main
|
|
|
|
import (
|
|
"bufio"
|
|
"os"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
func parseMap(path string) Map {
|
|
file, err := os.Open(path)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
defer func() {
|
|
file.Close()
|
|
}()
|
|
|
|
scanner := bufio.NewScanner(file)
|
|
|
|
scanner.Scan()
|
|
line := scanner.Text()
|
|
amountPaths, err := strconv.ParseInt(line, 10, 8)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
paths := parsePaths(scanner, int(amountPaths))
|
|
scanner.Scan()
|
|
line = scanner.Text()
|
|
amountPonds, err := strconv.ParseInt(line, 10, 8)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
ponds := parsePonds(scanner, int(amountPonds))
|
|
|
|
return Map{paths, ponds}
|
|
}
|
|
|
|
func parsePaths(scanner *bufio.Scanner, amount int) []Path {
|
|
paths := make([]Path, amount)
|
|
for i := 0; i < amount && scanner.Scan(); i++ {
|
|
line := scanner.Text()
|
|
numbers := strings.Split(line, " ")
|
|
startx, _ := strconv.ParseInt(numbers[0], 10, 8)
|
|
starty, _ := strconv.ParseInt(numbers[1], 10, 8)
|
|
endx, _ := strconv.ParseInt(numbers[2], 10, 8)
|
|
endy, _ := strconv.ParseInt(numbers[3], 10, 8)
|
|
|
|
startc := Coordinate{int(startx), int(starty)}
|
|
endc := Coordinate{int(endx), int(endy)}
|
|
paths[i] = Path{startc, endc}
|
|
}
|
|
if scanner.Err() != nil {
|
|
panic(scanner.Err())
|
|
}
|
|
|
|
return paths
|
|
}
|
|
|
|
func parsePonds(scanner *bufio.Scanner, amount int) []Pond {
|
|
ponds := make([]Pond, amount)
|
|
for i := 0; i < amount && scanner.Scan(); i++ {
|
|
line := scanner.Text()
|
|
amountVertices, err := strconv.ParseInt(line, 10, 8)
|
|
vertices := make([]Coordinate, amountVertices)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
for j := 0; j < int(amountVertices) && scanner.Scan(); j++ {
|
|
line := scanner.Text()
|
|
numbers := strings.Split(line, " ")
|
|
vx, _ := strconv.ParseInt(numbers[0], 10, 8)
|
|
vy, _ := strconv.ParseInt(numbers[1], 10, 8)
|
|
vertices[j] = Coordinate{int(vx), int(vy)}
|
|
}
|
|
if scanner.Err() != nil {
|
|
panic(scanner.Err())
|
|
}
|
|
ponds[i] = Pond{vertices}
|
|
}
|
|
if scanner.Err() != nil {
|
|
panic(scanner.Err())
|
|
}
|
|
return ponds
|
|
}
|