diff --git a/io/writer/strings_test.go b/io/writer/strings_test.go index 554f761..e8611b9 100644 --- a/io/writer/strings_test.go +++ b/io/writer/strings_test.go @@ -86,291 +86,3 @@ func TestStringsWriter(t *testing.T) { } } } - -func trivial() *maze.SolvedMaze { - /* trivial.txt - ## ## - # # - ### # - - Nodes are - ##0## - #123# - ###4# - */ - ret := &maze.SolvedMaze{} - nodes := make([]*maze.Node, 5) - - nodes[0] = maze.NewNode(maze.Coordinates{X: 2, Y: 0}) - - nodes[1] = maze.NewNode(maze.Coordinates{X: 1, Y: 1}) - nodes[2] = maze.NewNode(maze.Coordinates{X: 2, Y: 1}) - nodes[3] = maze.NewNode(maze.Coordinates{X: 3, Y: 1}) - - nodes[4] = maze.NewNode(maze.Coordinates{X: 3, Y: 2}) - - nodes[0].Down = nodes[2] - - nodes[1].Right = nodes[2] - - nodes[2].Up = nodes[0] - nodes[2].Left = nodes[1] - nodes[2].Right = nodes[3] - - nodes[3].Left = nodes[2] - nodes[3].Down = nodes[4] - - nodes[4].Up = nodes[3] - - solution := []*maze.Node{ - nodes[0], nodes[2], nodes[3], nodes[4], - } - - ret.Nodes = nodes - ret.Width = 5 - ret.Height = 3 - - ret.Solution = solution - - return ret -} - -func bigger() *maze.SolvedMaze { - /* trivial-bigger.txt - ### ### - ### ### - # # - ##### # - ##### # - - Nodes are - ###0### - ### ### - #1 2 3# - ##### # - #####4# - */ - nodes := make([]*maze.Node, 5) - - nodes[0] = maze.NewNode(maze.Coordinates{X: 3, Y: 0}) - - nodes[1] = maze.NewNode(maze.Coordinates{X: 1, Y: 2}) - nodes[2] = maze.NewNode(maze.Coordinates{X: 3, Y: 2}) - nodes[3] = maze.NewNode(maze.Coordinates{X: 5, Y: 2}) - - nodes[4] = maze.NewNode(maze.Coordinates{X: 5, Y: 4}) - - nodes[0].Down = nodes[2] - - nodes[1].Right = nodes[2] - - nodes[2].Up = nodes[0] - nodes[2].Left = nodes[1] - nodes[2].Right = nodes[3] - - nodes[3].Left = nodes[2] - nodes[3].Down = nodes[4] - - nodes[4].Up = nodes[3] - - ret := &maze.SolvedMaze{ - Maze: maze.Maze{ - Width: 7, - Height: 5, - Nodes: nodes, - }, - Solution: []*maze.Node{ - nodes[0], nodes[2], nodes[3], nodes[4], - }, - } - - return ret -} - -func bigger_staggered() *maze.SolvedMaze { - /* trivial-bigger-staggered.txt - ### ### - ### ### - # # - #### ## - #### ## - - Nodes are - ###0### - ### ### - #1 243# - #### ## - ####5## - */ - nodes := make([]*maze.Node, 6) - - nodes[0] = maze.NewNode(maze.Coordinates{X: 3, Y: 0}) - - nodes[1] = maze.NewNode(maze.Coordinates{X: 1, Y: 2}) - nodes[2] = maze.NewNode(maze.Coordinates{X: 3, Y: 2}) - nodes[3] = maze.NewNode(maze.Coordinates{X: 5, Y: 2}) - - nodes[4] = maze.NewNode(maze.Coordinates{X: 4, Y: 2}) - - nodes[5] = maze.NewNode(maze.Coordinates{X: 4, Y: 4}) - - nodes[0].Down = nodes[2] - - nodes[1].Right = nodes[2] - - nodes[2].Up = nodes[0] - nodes[2].Left = nodes[1] - nodes[2].Right = nodes[4] - - nodes[3].Left = nodes[4] - - nodes[4].Left = nodes[2] - nodes[4].Right = nodes[3] - nodes[4].Down = nodes[5] - - nodes[5].Up = nodes[4] - - ret := &maze.SolvedMaze{ - Maze: maze.Maze{ - Width: 7, - Height: 5, - Nodes: nodes, - }, - Solution: []*maze.Node{ - nodes[0], nodes[2], nodes[4], nodes[5], - }, - } - - return ret -} - -func normal() *maze.SolvedMaze { - /* normal.txt - ##### ##### - # # # - ##### ### # - # # # - # # ##### # - # # # - ### ### # # - # # # # - # ####### # - # # # - ##### ##### - - Nodes are - #####0##### - #1 2#3 4# - ##### ### # - #5 6#7 8# - # # ##### # - #9#A F B# - ### ### # # - #C D#E G# # - # ####### # - #H I#J K# - #####L##### - */ - nodes := make([]*maze.Node, 22) - - // ---- Node creation ---- - coords := []struct{ x, y int }{ - {5, 0}, // 0 - - {1, 1}, // 1 - {5, 1}, // 2 - {7, 1}, // 3 - {9, 1}, // 4 - - {1, 3}, // 5 - {3, 3}, // 6 - {5, 3}, // 7 - {9, 3}, // 8 - - {1, 5}, // 9 - {3, 5}, // A (10) - {9, 5}, // B (11) - - {1, 7}, // C (12) - {3, 7}, // D (13) - {5, 7}, // E (14) - {7, 5}, // F (15) - {7, 7}, // G (16) - - {1, 9}, // H (17) - {5, 9}, // I (18) - {7, 9}, // J (19) - {9, 9}, // K (20) - - {5, 10}, // L (21) - } - - for i, coord := range coords { - nodes[i] = maze.NewNode(maze.Coordinates{X: coord.x, Y: coord.y}) - } - - // ---- Node linking ---- - // Vertical - links := []struct { - from, to int - }{ - {0, 2}, - {2, 7}, - {4, 8}, - {5, 9}, - {6, 10}, - {8, 11}, - {10, 13}, - {15, 16}, - {11, 20}, - {12, 17}, - {18, 21}, - } - for _, link := range links { - nodes[link.from].Down = nodes[link.to] - nodes[link.to].Up = nodes[link.from] - } - - links = []struct { - from, to int - }{ - {1, 2}, - {3, 4}, - {5, 6}, - {7, 8}, - {10, 15}, - {15, 11}, - {12, 13}, - {14, 16}, - {17, 18}, - {19, 20}, - } - for _, link := range links { - nodes[link.from].Right = nodes[link.to] - nodes[link.to].Left = nodes[link.from] - } - - ret := &maze.SolvedMaze{ - Maze: maze.Maze{ - Width: 11, - Height: 11, - Nodes: nodes, - }, - Solution: []*maze.Node{ - nodes[0], - nodes[2], - nodes[7], - nodes[8], - nodes[11], - nodes[15], - nodes[10], - nodes[13], - nodes[12], - nodes[17], - nodes[18], - nodes[21], - }, - } - - return ret -} diff --git a/io/writer/utils.go b/io/writer/utils.go new file mode 100644 index 0000000..1dfc15d --- /dev/null +++ b/io/writer/utils.go @@ -0,0 +1,291 @@ +package writer + +import "maze-solver/maze" + +func trivial() *maze.SolvedMaze { + /* trivial.txt + ## ## + # # + ### # + + Nodes are + ##0## + #123# + ###4# + */ + ret := &maze.SolvedMaze{} + nodes := make([]*maze.Node, 5) + + nodes[0] = maze.NewNode(maze.Coordinates{X: 2, Y: 0}) + + nodes[1] = maze.NewNode(maze.Coordinates{X: 1, Y: 1}) + nodes[2] = maze.NewNode(maze.Coordinates{X: 2, Y: 1}) + nodes[3] = maze.NewNode(maze.Coordinates{X: 3, Y: 1}) + + nodes[4] = maze.NewNode(maze.Coordinates{X: 3, Y: 2}) + + nodes[0].Down = nodes[2] + + nodes[1].Right = nodes[2] + + nodes[2].Up = nodes[0] + nodes[2].Left = nodes[1] + nodes[2].Right = nodes[3] + + nodes[3].Left = nodes[2] + nodes[3].Down = nodes[4] + + nodes[4].Up = nodes[3] + + solution := []*maze.Node{ + nodes[0], nodes[2], nodes[3], nodes[4], + } + + ret.Nodes = nodes + ret.Width = 5 + ret.Height = 3 + + ret.Solution = solution + + return ret +} + +func bigger() *maze.SolvedMaze { + /* trivial-bigger.txt + ### ### + ### ### + # # + ##### # + ##### # + + Nodes are + ###0### + ### ### + #1 2 3# + ##### # + #####4# + */ + nodes := make([]*maze.Node, 5) + + nodes[0] = maze.NewNode(maze.Coordinates{X: 3, Y: 0}) + + nodes[1] = maze.NewNode(maze.Coordinates{X: 1, Y: 2}) + nodes[2] = maze.NewNode(maze.Coordinates{X: 3, Y: 2}) + nodes[3] = maze.NewNode(maze.Coordinates{X: 5, Y: 2}) + + nodes[4] = maze.NewNode(maze.Coordinates{X: 5, Y: 4}) + + nodes[0].Down = nodes[2] + + nodes[1].Right = nodes[2] + + nodes[2].Up = nodes[0] + nodes[2].Left = nodes[1] + nodes[2].Right = nodes[3] + + nodes[3].Left = nodes[2] + nodes[3].Down = nodes[4] + + nodes[4].Up = nodes[3] + + ret := &maze.SolvedMaze{ + Maze: maze.Maze{ + Width: 7, + Height: 5, + Nodes: nodes, + }, + Solution: []*maze.Node{ + nodes[0], nodes[2], nodes[3], nodes[4], + }, + } + + return ret +} + +func bigger_staggered() *maze.SolvedMaze { + /* trivial-bigger-staggered.txt + ### ### + ### ### + # # + #### ## + #### ## + + Nodes are + ###0### + ### ### + #1 243# + #### ## + ####5## + */ + nodes := make([]*maze.Node, 6) + + nodes[0] = maze.NewNode(maze.Coordinates{X: 3, Y: 0}) + + nodes[1] = maze.NewNode(maze.Coordinates{X: 1, Y: 2}) + nodes[2] = maze.NewNode(maze.Coordinates{X: 3, Y: 2}) + nodes[3] = maze.NewNode(maze.Coordinates{X: 5, Y: 2}) + + nodes[4] = maze.NewNode(maze.Coordinates{X: 4, Y: 2}) + + nodes[5] = maze.NewNode(maze.Coordinates{X: 4, Y: 4}) + + nodes[0].Down = nodes[2] + + nodes[1].Right = nodes[2] + + nodes[2].Up = nodes[0] + nodes[2].Left = nodes[1] + nodes[2].Right = nodes[4] + + nodes[3].Left = nodes[4] + + nodes[4].Left = nodes[2] + nodes[4].Right = nodes[3] + nodes[4].Down = nodes[5] + + nodes[5].Up = nodes[4] + + ret := &maze.SolvedMaze{ + Maze: maze.Maze{ + Width: 7, + Height: 5, + Nodes: nodes, + }, + Solution: []*maze.Node{ + nodes[0], nodes[2], nodes[4], nodes[5], + }, + } + + return ret +} + +func normal() *maze.SolvedMaze { + /* normal.txt + ##### ##### + # # # + ##### ### # + # # # + # # ##### # + # # # + ### ### # # + # # # # + # ####### # + # # # + ##### ##### + + Nodes are + #####0##### + #1 2#3 4# + ##### ### # + #5 6#7 8# + # # ##### # + #9#A F B# + ### ### # # + #C D#E G# # + # ####### # + #H I#J K# + #####L##### + */ + nodes := make([]*maze.Node, 22) + + // ---- Node creation ---- + coords := []struct{ x, y int }{ + {5, 0}, // 0 + + {1, 1}, // 1 + {5, 1}, // 2 + {7, 1}, // 3 + {9, 1}, // 4 + + {1, 3}, // 5 + {3, 3}, // 6 + {5, 3}, // 7 + {9, 3}, // 8 + + {1, 5}, // 9 + {3, 5}, // A (10) + {9, 5}, // B (11) + + {1, 7}, // C (12) + {3, 7}, // D (13) + {5, 7}, // E (14) + {7, 5}, // F (15) + {7, 7}, // G (16) + + {1, 9}, // H (17) + {5, 9}, // I (18) + {7, 9}, // J (19) + {9, 9}, // K (20) + + {5, 10}, // L (21) + } + + for i, coord := range coords { + nodes[i] = maze.NewNode(maze.Coordinates{X: coord.x, Y: coord.y}) + } + + // ---- Node linking ---- + // Vertical + links := []struct { + from, to int + }{ + {0, 2}, + {2, 7}, + {4, 8}, + {5, 9}, + {6, 10}, + {8, 11}, + {10, 13}, + {15, 16}, + {11, 20}, + {12, 17}, + {18, 21}, + } + for _, link := range links { + nodes[link.from].Down = nodes[link.to] + nodes[link.to].Up = nodes[link.from] + } + + links = []struct { + from, to int + }{ + {1, 2}, + {3, 4}, + {5, 6}, + {7, 8}, + {10, 15}, + {15, 11}, + {12, 13}, + {14, 16}, + {17, 18}, + {19, 20}, + } + for _, link := range links { + nodes[link.from].Right = nodes[link.to] + nodes[link.to].Left = nodes[link.from] + } + + ret := &maze.SolvedMaze{ + Maze: maze.Maze{ + Width: 11, + Height: 11, + Nodes: nodes, + }, + Solution: []*maze.Node{ + nodes[0], + nodes[2], + nodes[7], + nodes[8], + nodes[11], + nodes[15], + nodes[10], + nodes[13], + nodes[12], + nodes[17], + nodes[18], + nodes[21], + }, + } + + return ret +}