From 5644b23e33bfebb97a3c49685c8f4e73accdd7e8 Mon Sep 17 00:00:00 2001 From: semblanceofsense Date: Sat, 1 Feb 2025 15:09:47 -0700 Subject: [PATCH] Non recursive Queue/Tree solution implementation --- internal/bot/bot.go | 42 +++++++++++++++++------------- internal/getmaze/getmaze.go | 3 ++- internal/solvemaze/solvemaze.go | 45 +++++++++++++++++++++++++++++++-- util/queue/queue.go | 14 +++++----- 4 files changed, 77 insertions(+), 27 deletions(-) diff --git a/internal/bot/bot.go b/internal/bot/bot.go index b42a26f..7e4382a 100644 --- a/internal/bot/bot.go +++ b/internal/bot/bot.go @@ -64,18 +64,7 @@ func Run(BotToken string) { outputmaze.EditMaze(points, "/tmp/maze.png", "/tmp/outputmaze.png") }}}} - if responseData != "" { - err = s.InteractionRespond( - i.Interaction, - &discordgo.InteractionResponse{ - Type: discordgo.InteractionResponseChannelMessageWithSource, - Data: &discordgo.InteractionResponseData{ - Flags: 1 << 6, - Content: responseData, - }, - }, - ) - } else { + if responseData == "" { fileName := "/tmp/outputmaze.png" f, _ := os.Open(fileName) defer f.Close() @@ -93,12 +82,27 @@ func Run(BotToken string) { }, }, ) - } - if err != nil { - fmt.Println(err) + if err != nil { + if strings.Contains(err.Error(), "413") { + responseData = "Solution file is too large!" + } else { + responseData = err.Error() + } + } + if responseData != "" { + err = s.InteractionRespond( + i.Interaction, + &discordgo.InteractionResponse{ + Type: discordgo.InteractionResponseChannelMessageWithSource, + Data: &discordgo.InteractionResponseData{ + Flags: 1 << 6, + Content: responseData, + }, + }, + ) } } - }) + }}) discord.AddHandler(func ( s *discordgo.Session, @@ -141,7 +145,11 @@ func Run(BotToken string) { }, }) if err != nil { - fmt.Println(err) + if strings.Contains(err.Error(), "413") { + s.ChannelMessageSendReply(m.ChannelID, "Solution file is too large!", m.Reference()) + } else { + s.ChannelMessageSendReply(m.ChannelID, err.Error(), m.Reference()) + } } } } diff --git a/internal/getmaze/getmaze.go b/internal/getmaze/getmaze.go index 871a514..cc7ed0f 100644 --- a/internal/getmaze/getmaze.go +++ b/internal/getmaze/getmaze.go @@ -22,7 +22,8 @@ Pixel types: type Point struct { X int; Y int; - Value int + Value int; + Parent *Point } type Maze [][]Point diff --git a/internal/solvemaze/solvemaze.go b/internal/solvemaze/solvemaze.go index ecca205..28c8b1c 100644 --- a/internal/solvemaze/solvemaze.go +++ b/internal/solvemaze/solvemaze.go @@ -2,12 +2,14 @@ package solvemaze import ( "mazesolver/internal/getmaze" + "mazesolver/util/queue" ) func FindPath(maze getMaze.Maze) []getMaze.Point { returnSlice := make([]getMaze.Point, 0) - debugMaze := GetDebugMaze(maze) - findPathRecursive(maze[1][1], maze, &returnSlice, debugMaze) + //debugMaze := GetDebugMaze(maze) + //findPathRecursive(maze[1][1], maze, &returnSlice, debugMaze) + findPathNonRecursive(maze, maze[1][1], &returnSlice) return returnSlice } @@ -49,3 +51,42 @@ func GetDebugMaze(maze getMaze.Maze) getMaze.Maze { } return a } + +func findPathNonRecursive(maze getMaze.Maze, root getMaze.Point, slice *[]getMaze.Point) { + next := buildMaze(maze, root) + for next != nil { + *slice = append(*slice, *next) + next = next.Parent + } +} + +func buildMaze(maze getMaze.Maze, root getMaze.Point) *getMaze.Point { + Q := make(queue.Queue[getMaze.Point], 0) + root.Value = -1 + Q.Enqueue(root) + for len(Q) > 0 { + v := Q.Dequeue() + if v.Value == 9 { + return (&v) + } + for _, w := range getAdjacent(v, maze) { + if (w.Value == 0 || w.Value == 9) { + maze[w.Y][w.X].Value = -1 + w.Parent = &v + Q.Enqueue(w) + } + } + } + return nil +} + +func contains(maze getMaze.Maze, val int) bool { + for _, v := range maze { + for _, vv := range v { + if vv.Value == val { + return true + } + } + } + return false +} diff --git a/util/queue/queue.go b/util/queue/queue.go index f90a2a1..da9aadf 100644 --- a/util/queue/queue.go +++ b/util/queue/queue.go @@ -7,18 +7,18 @@ type QueueInterface interface { type Queue[T any] []T -func (q Queue[T]) Enqueue(v T) { - q = append(q, v) +func (q *Queue[T]) Enqueue(v T) { + *q = append(*q, v) } -func (q Queue[T]) Dequeue() T { - x := q[0] - q = q[1:] +func (q *Queue[T]) Dequeue() T { + x := (*q)[0] + *q = (*q)[1:] return x } -func (q Queue[T]) IsEmpty() bool { - if len(q) == 0 { +func (q *Queue[T]) IsEmpty() bool { + if len(*q) == 0 { return true } return false;