Here we have a “simple” maze solving problem.

I got some (recursive) algorithm from http://labix.org/snippets/labsolver to solve the maze, then wrote the few lines of code to use it to solve the challenge. You’re aMAZEing! (See what we did there? hehehe)

Final code :

from socket import create_connection

MAZE_SERVER = ('54.69.145.229', 16000)
RECV_SIZE = 8192

NONE, WALL, BEGN, FNSH, SEEN, GOOD = tuple(' #>X.+')

gmaze = []

def solve2(maze, posx, posy, sizex, sizey):
    global gmaze
    found = 0
    if 0 <= posx < sizex and 0 <= posy < sizey:
        if maze[posy][posx] in (NONE, BEGN):
            if maze[posy][posx] == NONE:
                maze[posy][posx] = SEEN
            if (solve2(maze, posx+1, posy, sizex, sizey) or
                solve2(maze, posx-1, posy, sizex, sizey) or
                solve2(maze, posx, posy+1, sizex, sizey) or
                solve2(maze, posx, posy-1, sizex, sizey)):
                if maze[posy][posx] == SEEN:
                    maze[posy][posx] = GOOD
                found = 1
        elif maze[posy][posx] == FNSH:
            found = 1
    gmaze = maze
    return found

def answer(posx, posy):
    global gmaze
    res = ''
    lastx = posx
    lasty = posy
    assert gmaze[posy][posx] == '>'
    while gmaze[posy][posx] != 'X':
        if gmaze[posy+1][posx] in ('+','X')  and (res == '' or res[-1] != '^'):
            res += 'V'
            lasty = posy
            posy += 1
        elif gmaze[posy-1][posx] in ('+','X') and (res == '' or res[-1] != 'V'):
            res += '^'
            lasty = posy
            posy -= 1
        elif gmaze[posy][posx+1] in ('+','X') and (res == '' or res[-1] != '<'):
            res += '>'
            lastx = posx
            posx += 1
        elif gmaze[posy][posx-1] in ('+','X') and (res == '' or res[-1] != '>'):
            res += '<'
            lastx = posx
            posx -= 1
        else:
            print("This should not happen")

    return res

def main():
    conn = create_connection(MAZE_SERVER)
    response = conn.recv(RECV_SIZE)
    global maze
    while True:
        print response
        if "Now " not in response:
            return

        response_lines = response.splitlines()
        find_delim = [x for x in response_lines if x.startswith('Now')][0]
        maze_lines = response_lines[response_lines.index(find_delim)+2:-1]
        i=0
        for l in maze_lines:
            maze_lines[i] = list(l)
            i+=1
        maze_text = '\n'.join([''.join(line) for line in maze_lines])

        # find position of start
        posx = 0
        posy = 0
        sizex = len(max(maze_lines, key=len))
        sizey = len(maze_lines)
        for line in maze_lines:
            if '>' in line:
                posx = line.index('>')
                break
            posy = posy + 1

        print("Trying to solve posx : %s, posy : %s, sizex : %s, sizey : %s" % (posx, posy, sizex, sizey))
        solve2(maze_lines, posx, posy, sizex, sizey)
        solution = answer(posx,posy)
        print("Res : %s" % solution)
        if not len(solution):
            return
        conn.send(solution)
        response = conn.recv(RECV_SIZE)


if __name__ == '__main__':
    main()

PAN{my_f1rst_labyM4z3.jpeg}