package main
import (
"fmt"
"testing"
)
func printPaths(pathA []Path, pathB []Path) {
minX := 999999
minY := 999999
maxX := -999999
maxY := -999999
for _, p := range pathA {
if p.Sx < minX {
minX = p.Sx
}
if p.Sy < minY {
minY = p.Sy
}
if p.Dx > maxX {
maxX = p.Dx
}
if p.Dy > maxY {
maxY = p.Dy
}
}
for _, p := range pathB {
if p.Sx < minX {
minX = p.Sx
}
if p.Sy < minY {
minY = p.Sy
}
if p.Dx > maxX {
maxX = p.Dx
}
if p.Dy > maxY {
maxY = p.Dy
}
}
gridX := maxX - minX + 3
gridY := maxY - minY + 3
offX := -minX
offY := -minY
grid := make([]rune, gridX*gridY)
for i := range grid {
grid[i] = '.'
}
for _, p := range pathA {
if p.Sx == p.Dx {
for y := p.Sy; y <= p.Dy; y++ {
i := ((y + offY + 1) * gridX) + p.Sx + offX + 1
grid[i] = 'a'
}
} else if p.Sy == p.Dy {
for x := p.Sx; x <= p.Dx; x++ {
i := ((p.Sy + offY + 1) * gridX) + x + offX + 1
grid[i] = 'a'
}
}
}
for _, p := range pathB {
if p.Sx == p.Dx {
for y := p.Sy; y <= p.Dy; y++ {
i := ((y + offY + 1) * gridX) + p.Sx + offX + 1
grid[i] = 'b'
}
} else if p.Sy == p.Dy {
for x := p.Sx; x <= p.Dx; x++ {
i := ((p.Sy + offY + 1) * gridX) + x + offX + 1
grid[i] = 'b'
}
}
}
grid[((offY+1)*gridX)+offX+1] = 'o'
for y := gridY - 1; y >= 0; y-- {
i := y * gridX
for x := 0; x < gridX; x++ {
fmt.Printf("%c", grid[i+x])
}
fmt.Println()
}
}
func TestPath(t *testing.T) {
tests := []struct {
pathA []string
pathB []string
expected int
}{
{
pathA: []string{"R8", "U5", "L5", "D3"},
pathB: []string{"U7", "R6", "D4", "L4"},
expected: 6,
},
{
pathA: []string{"R75", "D30", "R83", "U83", "L12", "D49", "R71", "U7", "L72"},
pathB: []string{"U62", "R66", "U55", "R34", "D71", "R55", "D58", "R83"},
expected: 159,
},
{
pathA: []string{"R98", "U47", "R26", "D63", "R33", "U87", "L62", "D20", "R33", "U53", "R51"},
pathB: []string{"U98", "R91", "D20", "R16", "D67", "R40", "U7", "R15", "U6", "R7"},
expected: 135,
},
}
for i, test := range tests {
a := ToPaths(test.pathA)
b := ToPaths(test.pathB)
printPaths(a, b)
got := FindClosestCrossing(a, b, false)
if got != test.expected {
t.Errorf("Test %d: Got %d, expected %d", i, got, test.expected)
}
}
}
func TestLength(t *testing.T) {
tests := []struct {
pathA []string
pathB []string
expected int
}{
{
pathA: []string{"R8", "U5", "L5", "D3"},
pathB: []string{"U7", "R6", "D4", "L4"},
expected: 30,
},
{
pathA: []string{"R75", "D30", "R83", "U83", "L12", "D49", "R71", "U7", "L72"},
pathB: []string{"U62", "R66", "U55", "R34", "D71", "R55", "D58", "R83"},
expected: 610,
},
{
pathA: []string{"R98", "U47", "R26", "D63", "R33", "U87", "L62", "D20", "R33", "U53", "R51"},
pathB: []string{"U98", "R91", "D20", "R16", "D67", "R40", "U7", "R15", "U6", "R7"},
expected: 410,
},
}
for i, test := range tests {
a := ToPaths(test.pathA)
b := ToPaths(test.pathB)
printPaths(a, b)
got := FindShortestCrossing(a, b, false)
if got != test.expected {
t.Errorf("Test %d: Got %d, expected %d", i, got, test.expected)
}
}
}