├── utils ├── __init__.py ├── cursor.py ├── input.py └── board.py ├── .gitignore ├── .gitattributes ├── requirements.txt ├── .github ├── knight-1-5.gif ├── knight-2-5.gif ├── knight-3-7.gif ├── knight-5-6.gif ├── knight-7-2.gif ├── knight-tour.gif └── visualizer.gif ├── SAMPLES.md ├── README.md ├── main.py └── visualizer.yml /utils/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .vscode/ 2 | .mypy_cache/ 3 | __pycache__/ -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | *.gif filter=lfs diff=lfs merge=lfs -text 2 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | windows-curses ; platform_system == 'Windows' 2 | mypy 3 | colorama -------------------------------------------------------------------------------- /.github/knight-1-5.gif: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:77c61a81f2b4368ad79f5f1b4542909ca30f60508eb6bddcd20f3acea5b45924 3 | size 1023125 4 | -------------------------------------------------------------------------------- /.github/knight-2-5.gif: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:77eccfb0cc884552b0b222b0f853bae541f6b5312de6b9d48fc27195839c99c3 3 | size 1031873 4 | -------------------------------------------------------------------------------- /.github/knight-3-7.gif: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:dc8d5ffb7ad587fa85403880c4fc7aa09d05c0974832686b310fd471210a9432 3 | size 1033454 4 | -------------------------------------------------------------------------------- /.github/knight-5-6.gif: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:c73a333ff21d860789f7faccc8c5dbae1ee5a52a1d0c123f0cae5a866a8ecf75 3 | size 1033951 4 | -------------------------------------------------------------------------------- /.github/knight-7-2.gif: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:a38698074ca54c41f7f7007347101c8c00748a82d1c488dc37eeb83d5bbf0ce9 3 | size 1032930 4 | -------------------------------------------------------------------------------- /.github/knight-tour.gif: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:8592a37d27bcbbc694add49d0c7aa1d47496f5200eae7acd8c5f59d94438b066 3 | size 51088 4 | -------------------------------------------------------------------------------- /.github/visualizer.gif: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:4d7d62cd4f4a24351d0eaa89e16c2f87d90e235a24720b9b71c1b897e5f17da8 3 | size 1138891 4 | -------------------------------------------------------------------------------- /utils/cursor.py: -------------------------------------------------------------------------------- 1 | class Cursor(object): 2 | x: int 3 | y: int 4 | max_x: int 5 | max_y: int 6 | 7 | def __init__(self, max_x: int, max_y: int) -> None: 8 | self.max_x = max_x 9 | self.max_y = max_y 10 | self.x = self.max_x // 2 - 15 11 | self.y = self.max_y // 2 - 8 12 | 13 | def get_x(self) -> int: 14 | return self.x 15 | 16 | def get_y(self) -> int: 17 | return self.y 18 | 19 | def set_x(self, x: int) -> None: 20 | self.x += x 21 | 22 | def set_y(self, y: int) -> None: 23 | self.y += y 24 | 25 | def reset_x(self) -> None: 26 | self.x = self.max_x // 2 - 15 27 | 28 | def reset_y(self) -> None: 29 | self.y = self.max_y // 2 - 8 30 | -------------------------------------------------------------------------------- /SAMPLES.md: -------------------------------------------------------------------------------- 1 | # Samples 2 | 3 |
4 | knight@1,5 5 |

Fig.1 Knight @ 1,5

6 |
7 | 8 |
9 | knight@2,5 10 |

Fig.2 Knight @ 2,5

11 |
12 | 13 |
14 | knight@3,7 15 |

Fig.3 Knight @ 3,7

16 |
17 | 18 |
19 | knight@5,6 20 |

Fig.4 Knight @ 5,6

21 |
22 | 23 |
24 | knight@7,2 25 |

Fig.5 Knight @ 7,2

26 |
-------------------------------------------------------------------------------- /utils/input.py: -------------------------------------------------------------------------------- 1 | from colorama import Fore 2 | from os import system, name 3 | 4 | 5 | def clear() -> None: 6 | ''' 7 | clears the console 8 | ''' 9 | # for windows 10 | if name == 'nt': 11 | _ = system('cls') 12 | 13 | # for mac and linux 14 | else: 15 | _ = system('clear') 16 | 17 | 18 | def print_dummy_board() -> None: 19 | ''' 20 | print a dummy board with indexes for all the cells 21 | ''' 22 | j: int = 0 23 | for i in range(9): 24 | if i != 0: 25 | print( 26 | str(j) + ' ' + Fore.YELLOW + 27 | '| | | | | | | | |') 28 | print(' ' + Fore.YELLOW + '---------------------------------') 29 | j += 1 30 | else: 31 | print(' ' + '0 1 2 3 4 5 6 7\n') 32 | print(' ' + Fore.YELLOW + '---------------------------------') 33 | print('\n') 34 | 35 | 36 | def validate(pos: str) -> bool: 37 | ''' 38 | check if user's input is valid 39 | ''' 40 | try: 41 | row, col = list(map(int, pos.split(','))) 42 | 43 | if not 0 <= row <= 7 or not 0 <= col <= 7: 44 | raise ValueError() 45 | except: 46 | return False 47 | return True 48 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Warnsdorff's Algorithm 2 | 3 |
4 | visualizer 5 |

Fig.1 Algorithm Visualization

6 |
7 | 8 | ## Build 9 | 10 | ``` 11 | $ pip install -r requirements.txt 12 | ``` 13 | 14 | ## Intro 15 | 16 | A **knight's tour** (See `Fig.2`) is a sequence of moves of a knight on a chessboard such that the knight visits every square only once. If the knight ends on a square that is one knight's move from the beginning square (so that it could tour the board again immediately, following the same path), the tour is closed, otherwise it is open. 17 | 18 |
19 | sample knight's tour 20 |

Fig.2 Sample Knight's Tour

21 |
22 | 23 | We can solve the **knight's tour** problem using warnsdorff's algorithm, which states that:- 24 | 25 | - We can start from any initial position of the knight on the board. 26 | - We can always move to an adjacent, unvisited square with minimal degree(minimum number of unvisited adjacent). 27 | 28 | ## Sample Run 29 | 30 | `Fig.1` demonstrates a sample run of the visualizer when knight is placed at `0, 0`, you can find other samples [here](https://github.com/muj-programmer/warnsdorff-algorithm-visualizer/blob/master/SAMPLES.md). 31 | 32 | | Symbol | Meaning | 33 | |:--------:|-------------------| 34 | | 0 | Unvisited Cell | 35 | | 1 | Visited Cell | 36 | | 2 | Knight's Position | 37 | 38 | ## Fun Fact 39 | 40 | On an *8 × 8 board*, there are exactly *26,534,728,821,064 directed closed tours* (i.e. two tours along the same path that travel in opposite directions are counted separately, as are rotations and reflections). The number of *undirected closed tours is half this number*, since every tour can be traced in reverse! 41 | 42 | ## Facing a Issue 43 | 44 | If you are in this situation _first and foremost_ Don't panic :cry: I'm here to help you get over it. Simply click [this](https://github.com/muj-programmer/warnsdorff-algorithm-visualizer/issues) and properly state your issue (be as verbose as you can be), After that sit tight and watch :movie_camera: the movie you have been postponing for so long while I :construction_worker: fix the issue. 45 | 46 | ## Want to Contribute 47 | 48 | I will be glad :smiley: to work with you on a new idea or fixing a invisible bug :bug: or if you have already done the work :hammer: just create a pull request and I will merge it asap. 49 | 50 | Well that's all for now but before you close this browser tab hit the star :star: button (it motivates me to make new stuff). 51 | 52 | Have a great day :sunglasses:. 53 | -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | import curses 4 | from typing import List, Tuple 5 | from colorama import init, Fore 6 | from time import sleep 7 | from heapq import heappush, heappop 8 | from utils.cursor import Cursor 9 | from utils.input import print_dummy_board, clear, validate 10 | from utils.board import print_board, update_board 11 | 12 | 13 | def algorithm(stdscr, cursor: Cursor, board: List[List[int]], krow: int, 14 | kcol: int) -> None: 15 | ''' 16 | warnsdorff's algorithm implementation 17 | ''' 18 | # directions the Knight can move on the chessboard 19 | dx: List[int] = [1, 2, 2, 1, -1, -2, -2, -1] 20 | dy: List[int] = [-2, -1, 1, 2, 2, 1, -1, -2] 21 | 22 | for _ in range(64): 23 | board[krow][kcol] = 1 24 | pq: List[Tuple[int, int]] = [] # priority queue of avialable neighbors 25 | 26 | # degree of neighbors 27 | for i in range(8): 28 | nrow: int = krow + dx[i] 29 | ncol: int = kcol + dy[i] 30 | 31 | if 0 <= nrow <= 7 and 0 <= ncol <= 7 and board[nrow][ncol] == 0: 32 | # count the available neighbors of the neighbor 33 | count = 0 34 | for j in range(8): 35 | nnrow: int = nrow + dx[j] 36 | nncol: int = ncol + dy[j] 37 | 38 | if 0 <= nnrow <= 7 and 0 <= nncol <= 7 and board[nnrow][ 39 | nncol] == 0: 40 | count += 1 41 | heappush(pq, (count, i)) 42 | 43 | if len(pq) > 0: 44 | (p, m) = heappop(pq) # knight's next position 45 | krow += dx[m] 46 | kcol += dy[m] 47 | board[krow][kcol] = 2 48 | update_board(stdscr, cursor, board) 49 | else: 50 | board[krow][kcol] = 1 51 | update_board(stdscr, cursor, board) 52 | 53 | 54 | def visualize(stdscr, pos: Tuple[int, int]) -> None: 55 | # clear the window 56 | stdscr.clear() 57 | 58 | # hide the cursor 59 | curses.curs_set(0) 60 | 61 | # colors 62 | curses.init_pair(1, curses.COLOR_YELLOW, curses.COLOR_BLACK) # boundry 63 | curses.init_pair(2, curses.COLOR_GREEN, curses.COLOR_BLACK) # visited cell 64 | curses.init_pair(3, curses.COLOR_RED, curses.COLOR_BLACK) # knight's cell 65 | curses.init_pair(4, curses.COLOR_WHITE, 66 | curses.COLOR_BLACK) # unvisited cell 67 | curses.init_pair(5, curses.COLOR_MAGENTA, 68 | curses.COLOR_BLACK) # progress bar 69 | 70 | # get max x and y co-ordinates of the window 71 | max_y, max_x = stdscr.getmaxyx() 72 | 73 | # 8 x 8 chess board 74 | board: List[List[int]] = [[0] * 8 for _ in range(8)] 75 | 76 | # initialize the cursor 77 | cursor: Cursor = Cursor(max_x, max_y) 78 | 79 | # place the knight on the board 80 | board[pos[0]][pos[1]] = 2 81 | 82 | # print the chess board 83 | print_board(stdscr, cursor, board, sleep_value=2.0, initialize=True) 84 | 85 | # start the warnsdorff algorithm 86 | algorithm(stdscr, cursor, board, pos[0], pos[1]) 87 | 88 | sleep(5.0) 89 | 90 | 91 | def main() -> None: 92 | # initialize colorama 93 | init(autoreset=True) 94 | 95 | while True: 96 | clear() 97 | 98 | # print dummy chess board to help user decide knight's position 99 | print_dummy_board() 100 | 101 | pos = input('knight\'s position (row, col): ') 102 | 103 | # check user's input 104 | if validate(pos): 105 | break 106 | else: 107 | print(Fore.RED + 'Invalid, Try Again.') 108 | sleep(1) 109 | 110 | # start visualization 111 | curses.wrapper(visualize, tuple(map(int, pos.split(',')))) 112 | 113 | clear() 114 | 115 | 116 | if __name__ == '__main__': 117 | # Get the size 118 | # of the terminal 119 | size = os.get_terminal_size() 120 | 121 | if size[0] < 55 or size[1] < 25: 122 | sys.exit('Maximize your terminal window. (Req: column=55, lines=25)') 123 | 124 | main() 125 | -------------------------------------------------------------------------------- /utils/board.py: -------------------------------------------------------------------------------- 1 | import curses 2 | from .cursor import Cursor 3 | from typing import List 4 | from time import sleep 5 | 6 | 7 | def horizontal_line(stdscr, cursor: Cursor) -> None: 8 | ''' 9 | horizontal boundry line 10 | ''' 11 | cursor.set_x(1) 12 | stdscr.addstr(cursor.get_y(), cursor.get_x(), '-' * 29, 13 | curses.color_pair(1)) 14 | cursor.set_y(1) 15 | 16 | 17 | def vertical_line(stdscr, cursor: Cursor, side: str) -> None: 18 | ''' 19 | vertical boundry line 20 | ''' 21 | if side == 'L': 22 | stdscr.addstr(cursor.get_y(), cursor.get_x(), '|', 23 | curses.color_pair(1)) 24 | cursor.set_x(1) 25 | elif side == 'R': 26 | stdscr.addstr(cursor.get_y(), cursor.get_x(), '|', 27 | curses.color_pair(1)) 28 | cursor.set_y(1) 29 | else: 30 | raise ValueError('invalid value for argument \'side\'') 31 | 32 | 33 | def get_progress(board) -> str: 34 | ''' 35 | returns the progress of the algorithm 36 | ''' 37 | visited_cell_count = 0 38 | total_cell_count = 64 39 | 40 | for row in range(8): 41 | visited_cell_count += board[row].count(1) 42 | 43 | progress = (visited_cell_count / total_cell_count) * 100 44 | 45 | return f'{progress}%' 46 | 47 | 48 | def update_board(stdscr, cursor: Cursor, board: List[List[int]]) -> None: 49 | ''' 50 | paint the updated board on the window 51 | ''' 52 | cursor.reset_x() 53 | cursor.reset_y() 54 | print_board(stdscr, cursor, board, progress=True) 55 | 56 | 57 | def print_progress_bar(stdscr, cursor: Cursor, board: List[List[int]]) -> None: 58 | ''' 59 | paint the progress bar on the window 60 | ''' 61 | cursor.set_x(-cursor.get_x()) 62 | cursor.set_y(-cursor.get_y()) 63 | stdscr.addstr(cursor.get_y(), cursor.get_x(), 'completed: ') 64 | stdscr.addstr(cursor.get_y(), cursor.get_x() + 11, ' ' * cursor.max_x) 65 | stdscr.addstr(cursor.get_y(), 66 | cursor.get_x() + 11, get_progress(board), 67 | curses.color_pair(5)) 68 | 69 | 70 | def print_board(stdscr, 71 | cursor: Cursor, 72 | board: List[List[int]], 73 | progress: bool = False, 74 | sleep_value: float = 0.5, 75 | initialize: bool = False) -> None: 76 | ''' 77 | paint the board on the window 78 | ''' 79 | horizontal_line(stdscr, cursor) 80 | for row in range(8): 81 | cursor.reset_x() 82 | 83 | # print empty line 84 | if 0 < row <= 7: 85 | stdscr.addstr(cursor.get_y(), cursor.get_x(), '|' + ' ' * 29 + '|', 86 | curses.color_pair(1)) 87 | cursor.set_y(1) 88 | 89 | # print left border 90 | vertical_line(stdscr, cursor, side='L') 91 | 92 | for col in range(8): 93 | # cell is visited 94 | if board[row][col] == 1: 95 | stdscr.addstr(cursor.get_y(), cursor.get_x(), 96 | str(board[row][col]), curses.color_pair(2)) 97 | # knight's cell 98 | elif board[row][col] == 2: 99 | stdscr.addstr(cursor.get_y(), cursor.get_x(), 100 | str(board[row][col]), curses.color_pair(3)) 101 | # cell is unvisited 102 | else: 103 | stdscr.addstr(cursor.get_y(), cursor.get_x(), 104 | str(board[row][col]), curses.color_pair(4)) 105 | cursor.set_x(1) 106 | 107 | if col != 7: 108 | cursor.set_x(3) 109 | 110 | # print right border 111 | vertical_line(stdscr, cursor, side='R') 112 | 113 | cursor.reset_x() 114 | horizontal_line(stdscr, cursor) 115 | 116 | if progress: 117 | # print the progress bar 118 | print_progress_bar(stdscr, cursor, board) 119 | 120 | if initialize: 121 | cursor.set_x(-cursor.get_x()) 122 | cursor.set_y(-cursor.get_y()) 123 | stdscr.addstr(cursor.get_y(), cursor.get_x(), 'initializing......', curses.color_pair(2)) 124 | 125 | stdscr.refresh() 126 | sleep(sleep_value) -------------------------------------------------------------------------------- /visualizer.yml: -------------------------------------------------------------------------------- 1 | # The configurations that used for the recording, feel free to edit them 2 | config: 3 | 4 | # Specify a command to be executed 5 | # like `/bin/bash -l`, `ls`, or any other commands 6 | # the default is bash for Linux 7 | # or powershell.exe for Windows 8 | command: zsh 9 | 10 | # Specify the current working directory path 11 | # the default is the current working directory path 12 | cwd: /Users/muj-programmer/warnsdorff-algorithm-visualizer 13 | 14 | # Export additional ENV variables 15 | env: 16 | recording: true 17 | 18 | # Explicitly set the number of columns 19 | # or use `auto` to take the current 20 | # number of columns of your shell 21 | cols: 96 22 | 23 | # Explicitly set the number of rows 24 | # or use `auto` to take the current 25 | # number of rows of your shell 26 | rows: 31 27 | 28 | # Amount of times to repeat GIF 29 | # If value is -1, play once 30 | # If value is 0, loop indefinitely 31 | # If value is a positive number, loop n times 32 | repeat: 0 33 | 34 | # Quality 35 | # 1 - 100 36 | quality: 100 37 | 38 | # Delay between frames in ms 39 | # If the value is `auto` use the actual recording delays 40 | frameDelay: auto 41 | 42 | # Maximum delay between frames in ms 43 | # Ignored if the `frameDelay` isn't set to `auto` 44 | # Set to `auto` to prevent limiting the max idle time 45 | maxIdleTime: 2000 46 | 47 | # The surrounding frame box 48 | # The `type` can be null, window, floating, or solid` 49 | # To hide the title use the value null 50 | # Don't forget to add a backgroundColor style with a null as type 51 | frameBox: 52 | type: floating 53 | title: visualizer 54 | style: 55 | border: 0px black solid 56 | # boxShadow: none 57 | # margin: 0px 58 | 59 | # Add a watermark image to the rendered gif 60 | # You need to specify an absolute path for 61 | # the image on your machine or a URL, and you can also 62 | # add your own CSS styles 63 | watermark: 64 | imagePath: null 65 | style: 66 | position: absolute 67 | right: 15px 68 | bottom: 15px 69 | width: 100px 70 | opacity: 0.9 71 | 72 | # Cursor style can be one of 73 | # `block`, `underline`, or `bar` 74 | cursorStyle: bar 75 | 76 | # Font family 77 | # You can use any font that is installed on your machine 78 | # in CSS-like syntax 79 | fontFamily: "Hack Nerd Font, Lucida Console, Ubuntu Mono, Monospace" 80 | 81 | # The size of the font 82 | fontSize: 12 83 | 84 | # The height of lines 85 | lineHeight: 1 86 | 87 | # The spacing between letters 88 | letterSpacing: 0 89 | 90 | # Theme 91 | theme: 92 | background: "transparent" 93 | foreground: "#afafaf" 94 | cursor: "#c7c7c7" 95 | black: "#232628" 96 | red: "#fc4384" 97 | green: "#b3e33b" 98 | yellow: "#ffa727" 99 | blue: "#75dff2" 100 | magenta: "#ae89fe" 101 | cyan: "#708387" 102 | white: "#d5d5d0" 103 | brightBlack: "#626566" 104 | brightRed: "#ff7fac" 105 | brightGreen: "#c8ed71" 106 | brightYellow: "#ebdf86" 107 | brightBlue: "#75dff2" 108 | brightMagenta: "#ae89fe" 109 | brightCyan: "#b1c6ca" 110 | brightWhite: "#f9f9f4" 111 | 112 | # Records, feel free to edit them 113 | records: 114 | - delay: 783 115 | content: "\e[1m\e[7m%\e[27m\e[1m\e[0m \r \r" 116 | - delay: 150 117 | content: "\r\e[0m\e[27m\e[24m\e[J\e[39m\e[0m\e[49m\e[44m\e[30m ~/warnsdorff-algorithm-visualizer \e[42m\e[34m\e[30m  master \e[49m\e[32m\e[39m \e[K\e[?1h\e=\e[?2004h" 118 | - delay: 918 119 | content: "\e[1m\e[31mp\e[0m\e[39m\e[90mython3 main.py\e[39m\e[14D" 120 | - delay: 280 121 | content: "\b\e[1m\e[31mp\e[1m\e[31my\e[0m\e[39m" 122 | - delay: 94 123 | content: "\b\b\e[1m\e[31mp\e[1m\e[31my\e[1m\e[31mt\e[0m\e[39m" 124 | - delay: 118 125 | content: "\b\e[1m\e[31mt\e[1m\e[31mh\e[0m\e[39m" 126 | - delay: 81 127 | content: "\b\e[1m\e[31mh\e[1m\e[31mo\e[0m\e[39m" 128 | - delay: 158 129 | content: "\b\b\b\b\b\e[0m\e[32mp\e[0m\e[32my\e[0m\e[32mt\e[0m\e[32mh\e[0m\e[32mo\e[32mn\e[39m" 130 | - delay: 594 131 | content: "\b\e[32mn\e[32m3\e[39m" 132 | - delay: 103 133 | content: "\e[39m " 134 | - delay: 228 135 | content: "\e[39m\e[4mm\e[24m" 136 | - delay: 124 137 | content: "\b\e[4mm\e[39m\e[4ma\e[24m" 138 | - delay: 127 139 | content: "\b\e[4ma\e[39m\e[4mi\e[24m" 140 | - delay: 64 141 | content: "\b\e[4mi\e[39m\e[4mn\e[24m" 142 | - delay: 471 143 | content: "\b\e[4mn\e[39m\e[4m.\e[24m" 144 | - delay: 279 145 | content: "\b\e[4m.\e[39m\e[4mp\e[24m" 146 | - delay: 235 147 | content: "\b\e[4mp\e[39m\e[4my\e[24m" 148 | - delay: 1140 149 | content: "\e[?1l\e>" 150 | - delay: 6 151 | content: "\e[?2004l\r\r\n" 152 | - delay: 64 153 | content: "\e[H\e[2J 0 1 2 3 4 5 6 7\r\n\e[0m\r\n\e[0m \e[33m---------------------------------\e[0m\r\n\e[0m0 \e[33m| | | | | | | | |\e[0m\r\n\e[0m \e[33m---------------------------------\e[0m\r\n\e[0m1 \e[33m| | | | | | | | |\e[0m\r\n\e[0m \e[33m---------------------------------\e[0m\r\n\e[0m2 \e[33m| | | | | | | | |\e[0m\r\n\e[0m \e[33m---------------------------------\e[0m\r\n\e[0m3 \e[33m| | | | | | | | |\e[0m\r\n\e[0m \e[33m---------------------------------\e[0m\r\n\e[0m4 \e[33m| | | | | | | | |\e[0m\r\n\e[0m \e[33m---------------------------------\e[0m\r\n\e[0m5 \e[33m| | | | | | | | |\e[0m\r\n\e[0m \e[33m---------------------------------\e[0m\r\n\e[0m6 \e[33m| | | | | | | | |\e[0m\r\n\e[0m \e[33m---------------------------------\e[0m\r\n\e[0m7 \e[33m| | | | | | | | |\e[0m\r\n\e[0m \e[33m---------------------------------\e[0m\r\n\e[0m\r\n\e[0m\r\n\e[0mknight's position (row, col): " 154 | - delay: 1808 155 | content: '0' 156 | - delay: 622 157 | content: ',' 158 | - delay: 432 159 | content: ' ' 160 | - delay: 797 161 | content: '0' 162 | - delay: 1111 163 | content: "\r\n\e[?1049h\e[1;31r\e(B\e[m\e[4l\e[?7h\e[?1h\e=\e[39;49m\e[?25l\e[39;49m\e[37m\e[40m\e[H\e[2J\e[32m\e[40minitializing......\e[8;35H\e[33m\e[40m-----------------------------\e[9;34H|\e[31m\e[40m2\e(B\e[m\e[39;49m\e[37m\e[40m \e[37m\e[40m0\e(B\e[m\e[39;49m\e[37m\e[40m \e[37m\e[40m0\e(B\e[m\e[39;49m\e[37m\e[40m \e[37m\e[40m0\e(B\e[m\e[39;49m\e[37m\e[40m \e[37m\e[40m0\e(B\e[m\e[39;49m\e[37m\e[40m \e[37m\e[40m0\e(B\e[m\e[39;49m\e[37m\e[40m \e[37m\e[40m0\e(B\e[m\e[39;49m\e[37m\e[40m \e[37m\e[40m0\e[33m\e[40m|\e[10;34H|\e[29X\e[10;64H|\e[11;34H|\e[37m\e[40m0\e(B\e[m\e[39;49m\e[37m\e[40m \e[37m\e[40m0\e(B\e[m\e[39;49m\e[37m\e[40m \e[37m\e[40m0\e(B\e[m\e[39;49m\e[37m\e[40m \e[37m\e[40m0\e(B\e[m\e[39;49m\e[37m\e[40m \e[37m\e[40m0\e(B\e[m\e[39;49m\e[37m\e[40m \e[37m\e[40m0\e(B\e[m\e[39;49m\e[37m\e[40m \e[37m\e[40m0\e(B\e[m\e[39;49m\e[37m\e[40m \e[37m\e[40m0\e[33m\e[40m|\e[12;34H|\e[29X\e[12;64H|\e[13;34H|\e[37m\e[40m0\e(B\e[m\e[39;49m\e[37m\e[40m \e[37m\e[40m0\e(B\e[m\e[39;49m\e[37m\e[40m \e[37m\e[40m0\e(B\e[m\e[39;49m\e[37m\e[40m \e[37m\e[40m0\e(B\e[m\e[39;49m\e[37m\e[40m \e[37m\e[40m0\e(B\e[m\e[39;49m\e[37m\e[40m \e[37m\e[40m0\e(B\e[m\e[39;49m\e[37m\e[40m \e[37m\e[40m0\e(B\e[m\e[39;49m\e[37m\e[40m \e[37m\e[40m0\e[33m\e[40m|\e[14;34H|\e[29X\e[14;64H|\e[15;34H|\e[37m\e[40m0\e(B\e[m\e[39;49m\e[37m\e[40m \e[37m\e[40m0\e(B\e[m\e[39;49m\e[37m\e[40m \e[37m\e[40m0\e(B\e[m\e[39;49m\e[37m\e[40m \e[37m\e[40m0\e(B\e[m\e[39;49m\e[37m\e[40m \e[37m\e[40m0\e(B\e[m\e[39;49m\e[37m\e[40m \e[37m\e[40m0\e(B\e[m\e[39;49m\e[37m\e[40m \e[37m\e[40m0\e(B\e[m\e[39;49m\e[37m\e[40m \e[37m\e[40m0\e[33m\e[40m|\e[16;34H|\e[29X\e[16;64H|\e[17;34H|\e[37m\e[40m0\e(B\e[m\e[39;49m\e[37m\e[40m \e[37m\e[40m0\e(B\e[m\e[39;49m\e[37m\e[40m \e[37m\e[40m0\e(B\e[m\e[39;49m\e[37m\e[40m \e[37m\e[40m0\e(B\e[m\e[39;49m\e[37m\e[40m \e[37m\e[40m0\e(B\e[m\e[39;49m\e[37m\e[40m \e[37m\e[40m0\e(B\e[m\e[39;49m\e[37m\e[40m \e[37m\e[40m0\e(B\e[m\e[39;49m\e[37m\e[40m \e[37m\e[40m0\e[33m\e[40m|\e[18;34H|\e[29X\e[18;64H|\e[19;34H|\e[37m\e[40m0\e(B\e[m\e[39;49m\e[37m\e[40m \e[37m\e[40m0\e(B\e[m\e[39;49m\e[37m\e[40m \e[37m\e[40m0\e(B\e[m\e[39;49m\e[37m\e[40m \e[37m\e[40m0\e(B\e[m\e[39;49m\e[37m\e[40m \e[37m\e[40m0\e(B\e[m\e[39;49m\e[37m\e[40m \e[37m\e[40m0\e(B\e[m\e[39;49m\e[37m\e[40m \e[37m\e[40m0\e(B\e[m\e[39;49m\e[37m\e[40m \e[37m\e[40m0\e[33m\e[40m|\e[20;34H|\e[29X\e[20;64H|\e[21;34H|\e[37m\e[40m0\e(B\e[m\e[39;49m\e[37m\e[40m \e[37m\e[40m0\e(B\e[m\e[39;49m\e[37m\e[40m \e[37m\e[40m0\e(B\e[m\e[39;49m\e[37m\e[40m \e[37m\e[40m0\e(B\e[m\e[39;49m\e[37m\e[40m \e[37m\e[40m0\e(B\e[m\e[39;49m\e[37m\e[40m \e[37m\e[40m0\e(B\e[m\e[39;49m\e[37m\e[40m \e[37m\e[40m0\e(B\e[m\e[39;49m\e[37m\e[40m \e[37m\e[40m0\e[33m\e[40m|\e[22;34H|\e[29X\e[22;64H|\e[23;34H|\e[37m\e[40m0\e(B\e[m\e[39;49m\e[37m\e[40m \e[37m\e[40m0\e(B\e[m\e[39;49m\e[37m\e[40m \e[37m\e[40m0\e(B\e[m\e[39;49m\e[37m\e[40m \e[37m\e[40m0\e(B\e[m\e[39;49m\e[37m\e[40m \e[37m\e[40m0\e(B\e[m\e[39;49m\e[37m\e[40m \e[37m\e[40m0\e(B\e[m\e[39;49m\e[37m\e[40m \e[37m\e[40m0\e(B\e[m\e[39;49m\e[37m\e[40m \e[37m\e[40m0\e[33m\e[40m|\e[24;35H-----------------------------\e[1;19H\e(B\e[m\e[39;49m\e[37m\e[40m" 164 | - delay: 2005 165 | content: "\rcompleted: \e[35m\e[40m1.5625%\e[9;35H\e[32m\e[40m1\e[13;39H\e[31m\e[40m2\e[1;19H\e(B\e[m\e[39;49m\e[37m\e[40m" 166 | - delay: 506 167 | content: "\e[12G\e[35m\e[40m3.125%\e(B\e[m\e[39;49m\e[37m\e[40m\e[K\e[13;39H\e[32m\e[40m1\e[17;35H\e[31m\e[40m2\e[1;18H\e(B\e[m\e[39;49m\e[37m\e[40m" 168 | - delay: 506 169 | content: "\e[12G\e[35m\e[40m4.6875%\e[17;35H\e[32m\e[40m1\e[21;39H\e[31m\e[40m2\e[1;19H\e(B\e[m\e[39;49m\e[37m\e[40m" 170 | - delay: 503 171 | content: "\e[12G\e[35m\e[40m6.25%\e(B\e[m\e[39;49m\e[37m\e[40m\e[K\e[21;39H\e[32m\e[40m1\e[23;47H\e[31m\e[40m2\e[1;17H\e(B\e[m\e[39;49m\e[37m\e[40m" 172 | - delay: 506 173 | content: "\e[12G\e[35m\e[40m7.8125%\e[21;55H\e[31m\e[40m2\e[23;47H\e[32m\e[40m1\e[1;19H\e(B\e[m\e[39;49m\e[37m\e[40m" 174 | - delay: 504 175 | content: "\e[12G\e[35m\e[40m9.375%\e(B\e[m\e[39;49m\e[37m\e[40m\e[K\e[21;55H\e[32m\e[40m1\e[23;63H\e[31m\e[40m2\e[1;18H\e(B\e[m\e[39;49m\e[37m\e[40m" 176 | - delay: 506 177 | content: "\e[12G\e[35m\e[40m10.9375%\e[19;59H\e[31m\e[40m2\e[23;63H\e[32m\e[40m1\e[1;20H\e(B\e[m\e[39;49m\e[37m\e[40m" 178 | - delay: 506 179 | content: "\e[13G\e[35m\e[40m2.5%\e(B\e[m\e[39;49m\e[37m\e[40m\e[K\e[19;59H\e[32m\e[40m1\e[23;55H\e[31m\e[40m2\e[1;17H\e(B\e[m\e[39;49m\e[37m\e[40m" 180 | - delay: 505 181 | content: "\b\b\b\b\e[35m\e[40m4.0625%\e[21;63H\e[31m\e[40m2\e[23;55H\e[32m\e[40m1\e[1;20H\e(B\e[m\e[39;49m\e[37m\e[40m" 182 | - delay: 506 183 | content: "\e[13G\e[35m\e[40m5.625%\e(B\e[m\e[39;49m\e[37m\e[40m\e[K\e[17;59H\e[31m\e[40m2\e[21;63H\e[32m\e[40m1\e[1;19H\e(B\e[m\e[39;49m\e[37m\e[40m" 184 | - delay: 506 185 | content: "\e[13G\e[35m\e[40m7.1875%\e[13;63H\e[31m\e[40m2\e[17;59H\e[32m\e[40m1\e[1;20H\e(B\e[m\e[39;49m\e[37m\e[40m" 186 | - delay: 503 187 | content: "\e[13G\e[35m\e[40m8.75%\e(B\e[m\e[39;49m\e[37m\e[40m\e[K\e[9;59H\e[31m\e[40m2\e[13;63H\e[32m\e[40m1\e[1;18H\e(B\e[m\e[39;49m\e[37m\e[40m" 188 | - delay: 504 189 | content: "\e[12G\e[35m\e[40m20.3125%\e[9;59H\e[32m\e[40m1\e[11;51H\e[31m\e[40m2\e[1;20H\e(B\e[m\e[39;49m\e[37m\e[40m" 190 | - delay: 504 191 | content: "\e[13G\e[35m\e[40m1.875%\e(B\e[m\e[39;49m\e[37m\e[40m\e[K\e[9;43H\e[31m\e[40m2\e[11;51H\e[32m\e[40m1\e[1;19H\e(B\e[m\e[39;49m\e[37m\e[40m" 192 | - delay: 503 193 | content: "\e[13G\e[35m\e[40m3.4375%\e[9;43H\e[32m\e[40m1\e[11;35H\e[31m\e[40m2\e[1;20H\e(B\e[m\e[39;49m\e[37m\e[40m" 194 | - delay: 506 195 | content: "\e[13G\e[35m\e[40m5.0%\e(B\e[m\e[39;49m\e[37m\e[40m\e[K\e[11;35H\e[32m\e[40m1\e[15;39H\e[31m\e[40m2\e[1;17H\e(B\e[m\e[39;49m\e[37m\e[40m" 196 | - delay: 506 197 | content: "\b\b\b\b\e[35m\e[40m6.5625%\e[15;39H\e[32m\e[40m1\e[19;35H\e[31m\e[40m2\e[1;20H\e(B\e[m\e[39;49m\e[37m\e[40m" 198 | - delay: 504 199 | content: "\e[13G\e[35m\e[40m8.125%\e(B\e[m\e[39;49m\e[37m\e[40m\e[K\e[19;35H\e[32m\e[40m1\e[23;39H\e[31m\e[40m2\e[1;19H\e(B\e[m\e[39;49m\e[37m\e[40m" 200 | - delay: 504 201 | content: "\e[13G\e[35m\e[40m9.6875%\e[21;47H\e[31m\e[40m2\e[23;39H\e[32m\e[40m1\e[1;20H\e(B\e[m\e[39;49m\e[37m\e[40m" 202 | - delay: 502 203 | content: "\e[1;12H\e[35m\e[40m31.25%\e(B\e[m\e[39;49m\e[37m\e[40m\e[K\e[17;43H\e[31m\e[40m2\e[21;47H\e[32m\e[40m1\e[1;18H\e(B\e[m\e[39;49m\e[37m\e[40m" 204 | - delay: 506 205 | content: "\e[13G\e[35m\e[40m2.8125%\e[15;35H\e[31m\e[40m2\e[17;43H\e[32m\e[40m1\e[1;20H\e(B\e[m\e[39;49m\e[37m\e[40m" 206 | - delay: 503 207 | content: "\e[13G\e[35m\e[40m4.375%\e(B\e[m\e[39;49m\e[37m\e[40m\e[K\e[11;39H\e[31m\e[40m2\e[15;35H\e[32m\e[40m1\e[1;19H\e(B\e[m\e[39;49m\e[37m\e[40m" 208 | - delay: 506 209 | content: "\e[13G\e[35m\e[40m5.9375%\e[9;47H\e[31m\e[40m2\e[11;39H\e[32m\e[40m1\e[1;20H\e(B\e[m\e[39;49m\e[37m\e[40m" 210 | - delay: 506 211 | content: "\e[13G\e[35m\e[40m7.5%\e(B\e[m\e[39;49m\e[37m\e[40m\e[K\e[9;47H\e[32m\e[40m1\e[13;43H\e[31m\e[40m2\e[1;17H\e(B\e[m\e[39;49m\e[37m\e[40m" 212 | - delay: 503 213 | content: "\b\b\b\b\e[35m\e[40m9.0625%\e[9;39H\e[31m\e[40m2\e[13;43H\e[32m\e[40m1\e[1;20H\e(B\e[m\e[39;49m\e[37m\e[40m" 214 | - delay: 502 215 | content: "\e[1;12H\e[35m\e[40m40.625%\e(B\e[m\e[39;49m\e[37m\e[40m\e[K\e[9;39H\e[32m\e[40m1\e[13;35H\e[31m\e[40m2\e[1;19H\e(B\e[m\e[39;49m\e[37m\e[40m" 216 | - delay: 503 217 | content: "\e[13G\e[35m\e[40m2.1875%\e[11;43H\e[31m\e[40m2\e[13;35H\e[32m\e[40m1\e[1;20H\e(B\e[m\e[39;49m\e[37m\e[40m" 218 | - delay: 505 219 | content: "\e[13G\e[35m\e[40m3.75%\e(B\e[m\e[39;49m\e[37m\e[40m\e[K\e[9;51H\e[31m\e[40m2\e[11;43H\e[32m\e[40m1\e[1;18H\e(B\e[m\e[39;49m\e[37m\e[40m" 220 | - delay: 501 221 | content: "\e[13G\e[35m\e[40m5.3125%\e[9;51H\e[32m\e[40m1\e[13;47H\e[31m\e[40m2\e[1;20H\e(B\e[m\e[39;49m\e[37m\e[40m" 222 | - delay: 501 223 | content: "\e[13G\e[35m\e[40m6.875%\e(B\e[m\e[39;49m\e[37m\e[40m\e[K\e[11;55H\e[31m\e[40m2\e[13;47H\e[32m\e[40m1\e[1;19H\e(B\e[m\e[39;49m\e[37m\e[40m" 224 | - delay: 504 225 | content: "\e[13G\e[35m\e[40m8.4375%\e[9;63H\e[31m\e[40m2\e[11;55H\e[32m\e[40m1\e[1;20H\e(B\e[m\e[39;49m\e[37m\e[40m" 226 | - delay: 503 227 | content: "\e[1;12H\e[35m\e[40m50.0%\e(B\e[m\e[39;49m\e[37m\e[40m\e[K\e[9;63H\e[32m\e[40m1\e[13;59H\e[31m\e[40m2\e[1;17H\e(B\e[m\e[39;49m\e[37m\e[40m" 228 | - delay: 503 229 | content: "\b\b\b\b\e[35m\e[40m1.5625%\e[13;59H\e[32m\e[40m1\e[15;51H\e[31m\e[40m2\e[1;20H\e(B\e[m\e[39;49m\e[37m\e[40m" 230 | - delay: 503 231 | content: "\e[13G\e[35m\e[40m3.125%\e(B\e[m\e[39;49m\e[37m\e[40m\e[K\e[11;47H\e[31m\e[40m2\e[15;51H\e[32m\e[40m1\e[1;19H\e(B\e[m\e[39;49m\e[37m\e[40m" 232 | - delay: 502 233 | content: "\e[13G\e[35m\e[40m4.6875%\e[9;55H\e[31m\e[40m2\e[11;47H\e[32m\e[40m1\e[1;20H\e(B\e[m\e[39;49m\e[37m\e[40m" 234 | - delay: 502 235 | content: "\e[13G\e[35m\e[40m6.25%\e(B\e[m\e[39;49m\e[37m\e[40m\e[K\e[9;55H\e[32m\e[40m1\e[11;63H\e[31m\e[40m2\e[1;18H\e(B\e[m\e[39;49m\e[37m\e[40m" 236 | - delay: 503 237 | content: "\e[13G\e[35m\e[40m7.8125%\e[11;63H\e[32m\e[40m1\e[13;55H\e[31m\e[40m2\e[1;20H\e(B\e[m\e[39;49m\e[37m\e[40m" 238 | - delay: 504 239 | content: "\e[13G\e[35m\e[40m9.375%\e(B\e[m\e[39;49m\e[37m\e[40m\e[K\e[13;55H\e[32m\e[40m1\e[15;63H\e[31m\e[40m2\e[1;19H\e(B\e[m\e[39;49m\e[37m\e[40m" 240 | - delay: 502 241 | content: "\e[12G\e[35m\e[40m60.9375%\e[11;59H\e[31m\e[40m2\e[15;63H\e[32m\e[40m1\e[1;20H\e(B\e[m\e[39;49m\e[37m\e[40m" 242 | - delay: 503 243 | content: "\e[13G\e[35m\e[40m2.5%\e(B\e[m\e[39;49m\e[37m\e[40m\e[K\e[11;59H\e[32m\e[40m1\e[15;55H\e[31m\e[40m2\e[1;17H\e(B\e[m\e[39;49m\e[37m\e[40m" 244 | - delay: 502 245 | content: "\b\b\b\b\e[35m\e[40m4.0625%\e[15;55H\e[32m\e[40m1\e[17;63H\e[31m\e[40m2\e[1;20H\e(B\e[m\e[39;49m\e[37m\e[40m" 246 | - delay: 503 247 | content: "\e[13G\e[35m\e[40m5.625%\e(B\e[m\e[39;49m\e[37m\e[40m\e[K\e[17;63H\e[32m\e[40m1\e[21;59H\e[31m\e[40m2\e[1;19H\e(B\e[m\e[39;49m\e[37m\e[40m" 248 | - delay: 503 249 | content: "\e[13G\e[35m\e[40m7.1875%\e[19;51H\e[31m\e[40m2\e[21;59H\e[32m\e[40m1\e[1;20H\e(B\e[m\e[39;49m\e[37m\e[40m" 250 | - delay: 503 251 | content: "\e[13G\e[35m\e[40m8.75%\e(B\e[m\e[39;49m\e[37m\e[40m\e[K\e[15;47H\e[31m\e[40m2\e[19;51H\e[32m\e[40m1\e[1;18H\e(B\e[m\e[39;49m\e[37m\e[40m" 252 | - delay: 503 253 | content: "\e[12G\e[35m\e[40m70.3125%\e[15;47H\e[32m\e[40m1\e[17;39H\e[31m\e[40m2\e[1;20H\e(B\e[m\e[39;49m\e[37m\e[40m" 254 | - delay: 503 255 | content: "\e[13G\e[35m\e[40m1.875%\e(B\e[m\e[39;49m\e[37m\e[40m\e[K\e[17;39H\e[32m\e[40m1\e[21;35H\e[31m\e[40m2\e[1;19H\e(B\e[m\e[39;49m\e[37m\e[40m" 256 | - delay: 502 257 | content: "\e[13G\e[35m\e[40m3.4375%\e[19;43H\e[31m\e[40m2\e[21;35H\e[32m\e[40m1\e[1;20H\e(B\e[m\e[39;49m\e[37m\e[40m" 258 | - delay: 503 259 | content: "\e[13G\e[35m\e[40m5.0%\e(B\e[m\e[39;49m\e[37m\e[40m\e[K\e[17;51H\e[31m\e[40m2\e[19;43H\e[32m\e[40m1\e[1;17H\e(B\e[m\e[39;49m\e[37m\e[40m" 260 | - delay: 502 261 | content: "\b\b\b\b\e[35m\e[40m6.5625%\e[15;59H\e[31m\e[40m2\e[17;51H\e[32m\e[40m1\e[1;20H\e(B\e[m\e[39;49m\e[37m\e[40m" 262 | - delay: 504 263 | content: "\e[13G\e[35m\e[40m8.125%\e(B\e[m\e[39;49m\e[37m\e[40m\e[K\e[15;59H\e[32m\e[40m1\e[19;63H\e[31m\e[40m2\e[1;19H\e(B\e[m\e[39;49m\e[37m\e[40m" 264 | - delay: 505 265 | content: "\e[13G\e[35m\e[40m9.6875%\e[19;63H\e[32m\e[40m1\e[23;59H\e[31m\e[40m2\e[1;20H\e(B\e[m\e[39;49m\e[37m\e[40m" 266 | - delay: 503 267 | content: "\e[1;12H\e[35m\e[40m81.25%\e(B\e[m\e[39;49m\e[37m\e[40m\e[K\e[19;55H\e[31m\e[40m2\e[23;59H\e[32m\e[40m1\e[1;18H\e(B\e[m\e[39;49m\e[37m\e[40m" 268 | - delay: 504 269 | content: "\e[13G\e[35m\e[40m2.8125%\e[19;55H\e[32m\e[40m1\e[23;51H\e[31m\e[40m2\e[1;20H\e(B\e[m\e[39;49m\e[37m\e[40m" 270 | - delay: 503 271 | content: "\e[13G\e[35m\e[40m4.375%\e(B\e[m\e[39;49m\e[37m\e[40m\e[K\e[21;43H\e[31m\e[40m2\e[23;51H\e[32m\e[40m1\e[1;19H\e(B\e[m\e[39;49m\e[37m\e[40m" 272 | - delay: 506 273 | content: "\e[13G\e[35m\e[40m5.9375%\e[21;43H\e[32m\e[40m1\e[23;35H\e[31m\e[40m2\e[1;20H\e(B\e[m\e[39;49m\e[37m\e[40m" 274 | - delay: 506 275 | content: "\e[13G\e[35m\e[40m7.5%\e(B\e[m\e[39;49m\e[37m\e[40m\e[K\e[19;39H\e[31m\e[40m2\e[23;35H\e[32m\e[40m1\e[1;17H\e(B\e[m\e[39;49m\e[37m\e[40m" 276 | - delay: 506 277 | content: "\b\b\b\b\e[35m\e[40m9.0625%\e[19;39H\e[32m\e[40m1\e[23;43H\e[31m\e[40m2\e[1;20H\e(B\e[m\e[39;49m\e[37m\e[40m" 278 | - delay: 504 279 | content: "\e[1;12H\e[35m\e[40m90.625%\e(B\e[m\e[39;49m\e[37m\e[40m\e[K\e[21;51H\e[31m\e[40m2\e[23;43H\e[32m\e[40m1\e[1;19H\e(B\e[m\e[39;49m\e[37m\e[40m" 280 | - delay: 503 281 | content: "\e[13G\e[35m\e[40m2.1875%\e[17;47H\e[31m\e[40m2\e[21;51H\e[32m\e[40m1\e[1;20H\e(B\e[m\e[39;49m\e[37m\e[40m" 282 | - delay: 504 283 | content: "\e[13G\e[35m\e[40m3.75%\e(B\e[m\e[39;49m\e[37m\e[40m\e[K\e[13;51H\e[31m\e[40m2\e[17;47H\e[32m\e[40m1\e[1;18H\e(B\e[m\e[39;49m\e[37m\e[40m" 284 | - delay: 504 285 | content: "\e[13G\e[35m\e[40m5.3125%\e[13;51H\e[32m\e[40m1\e[15;43H\e[31m\e[40m2\e[1;20H\e(B\e[m\e[39;49m\e[37m\e[40m" 286 | - delay: 506 287 | content: "\e[13G\e[35m\e[40m6.875%\e(B\e[m\e[39;49m\e[37m\e[40m\e[K\e[15;43H\e[32m\e[40m1\e[19;47H\e[31m\e[40m2\e[1;19H\e(B\e[m\e[39;49m\e[37m\e[40m" 288 | - delay: 506 289 | content: "\e[13G\e[35m\e[40m8.4375%\e[17;55H\e[31m\e[40m2\e[19;47H\e[32m\e[40m1\e[1;20H\e(B\e[m\e[39;49m\e[37m\e[40m" 290 | - delay: 506 291 | content: "\e[1;12H\e[35m\e[40m100.0%\e(B\e[m\e[39;49m\e[37m\e[40m\e[K\e[17;55H\e[32m\e[40m1\e[1;18H\e(B\e[m\e[39;49m\e[37m\e[40m" 292 | - delay: 5505 293 | content: "\e[?1l\e>\e[39;49m\r\e[31d\e[K\e[31;1H\e[?12l\e[?25h\e[?1049l\r\e[?1l\e>" 294 | - delay: 8 295 | content: "\e[H\e[2J\e[0m" 296 | - delay: 8 297 | content: "\e[1m\e[7m%\e[27m\e[1m\e[0m \r \r" 298 | - delay: 143 299 | content: "\r\e[0m\e[27m\e[24m\e[J\e[39m\e[0m\e[49m\e[44m\e[30m ~/warnsdorff-algorithm-visualizer \e[42m\e[34m\e[30m  master \e[49m\e[32m\e[39m \e[K\e[?1h\e=\e[?2004h" 300 | - delay: 1880 301 | content: "\e[?2004l\r\r\n" 302 | --------------------------------------------------------------------------------