UPDATED rat_in_maze.py - #9148

Merged
cclauss merged 16 commits into
TheAlgorithms:masterfrom
Muhammadummerr:new_branch
Oct 4, 2023
Merged

UPDATED rat_in_maze.py#9148
cclauss merged 16 commits into
TheAlgorithms:masterfrom
Muhammadummerr:new_branch

Conversation

@Muhammadummerr

@MuhammadummerrMuhammadummerr commented Sep 30, 2023

Copy link
Copy Markdown
Contributor

Describe your change:

Fixes#9066
I have made updates to the rat_in_maze.py file to enhance code clarity.
These updates include:

  1. Adding more descriptive comments to explain the logic and steps of the maze-solving algorithm.
  2. Introducing variables that allow for easy customization of the source and destination cells within the maze.
  3. Refactor path representation in solution:
  • Previously, in solution, paths were represented as 1s, but I have updated it to use 0s to align with the standard convention where 0s represent paths and 1s represent walls.
  1. Updated the return type to 'solution maze' if a path exists; otherwise, it returns 'None'.
  • Add an algorithm?
  • Fix a bug or typo in an existing algorithm?
  • Documentation change?

Checklist:

  • I have read CONTRIBUTING.md.
  • This pull request is all my own work -- I have not plagiarized.
  • I know that pull requests will not be merged if they fail the automated tests.
  • This PR only changes one algorithm file. To ease review, please open separate PRs for separate algorithms.
  • All new Python files are placed inside an existing directory.
  • All filenames are in all lowercase characters with no spaces or dashes.
  • All functions and variable names follow Python naming conventions.
  • All function parameters and return values are annotated with Python type hints.
  • All functions have doctests that pass the automated testing.
  • All new algorithms include at least one URL that points to Wikipedia or another similar explanation.
  • If this pull request resolves one or more open issues then the description above includes the issue number(s) with a closing keyword: "Fixes #ISSUE-NUMBER".

@algorithms-keeperalgorithms-keeperBot added enhancement This PR modified some existing files awaiting reviews This PR is ready to be reviewed labels Sep 30, 2023
Comment threadbacktracking/rat_in_maze.py Outdated
source_column: int,
destination_row: int,
destination_column: int,
) -> list[list[int]] | None:

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Returning two different datatypes pushes work on the caller. Please consider raising an exception if there is no solution.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See my remark in the general discussion of this Pull Request.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
) ->list[list[int]]|None:
) ->list[list[int]]:

@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

@cclauss Is there something I'm missing?

@dlesnoff

dlesnoff commented Oct 3, 2023

Copy link
Copy Markdown

Ok so @Muhammadummerr old pull request was reopened here.

@cclauss Is there something I'm missing?

Returning two different datatypes pushes work on the caller. Please consider raising an exception if there is no solution.

@cclaus If an exception is raised, the caller still has to wrap each function call in a try-except clause and catch the correct exception. In Nim, I would use an Option type (the equivalent of Result type in Rust, I guess?).
Maybe in Python, the closest to an Option type would be a dataclass with a list[list[int]] attribute and a boolean flag?
The caller would have to check for the boolean flag before accessing the maze, but at least the program would not crash in that case.
Exceptions are frequent in other Python Algorithm snippets, but they are often used for a bad user input. Here, the None type is a frequent and expected output of the algorithm.

@cclauss

Copy link
Copy Markdown
Member

It is very true that Nim and Rust have cooler ways of dealing with exception states that Python does but raising Exceptions are quite Pythonic and are preferred to multiple different datatypes.

@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

Okay,Based on my understanding of your request, the program should return both the solution maze and a flag.
1.If the flag's value is one, it will indicate that a solution exists, and the path in the solution maze will be represented by 0s.
2.If the flag is 0, it means that a solution was not found, and the solution maze will consist of only 1s.

@cclauss

Copy link
Copy Markdown
Member

No. The function should return a solution if there is one and raise an ValueError if there is no solution.

@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

I have made these changes.

@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

Okay, my mistake. I need to make some more changes. Thanks.

@dlesnoff

dlesnoff commented Oct 4, 2023

Copy link
Copy Markdown

Do we really care about changing the initial and destination cells in the maze?

I do not really see the benefit of it and it just makes the implementation harder to read and understand.

Comment threadbacktracking/rat_in_maze.py Outdated
[0, 0, 0, 0, 1]
True
>>> solve_maze(maze,0,0,len(maze)-1,len(maze)-1)
[[0, 1, 1, 1, 1], [0, 0, 0, 0, 1], [1, 1, 1, 0, 1],\

@dlesnoffdlesnoffOct 4, 2023

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is the output on the same line now? It makes reading the solution harder.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

https://docs.python.org/3/library/doctest.html#doctest.NORMALIZE_WHITESPACE will allow you to have doctests that ignore the whitespace so the matrix can look like a matrix.

@algorithms-keeperalgorithms-keeperBot added the tests are failing Do not merge until tests pass label Oct 4, 2023
@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

All Test case are passed on my device but failing in build check.

@cclauss

Copy link
Copy Markdown
Member

Looking better!

@cclauss

Copy link
Copy Markdown
Member

________________ [doctest] backtracking.rat_in_maze.solve_maze _________________
028 aiming to reach a destination cell.
029 The maze consists of walls (1s) and open paths (0s).
030 By providing custom row and column values, the source and destination
031 cells can be adjusted.
032 >>> maze = [[0, 1, 0, 1, 1],
033 ... [0, 0, 0, 0, 0],
034 ... [1, 0, 1, 0, 1],
035 ... [0, 0, 1, 0, 0],
036 ... [1, 0, 0, 1, 0]]
037 >>> solve_maze(maze,0,0,len(maze)-1,len(maze)-1)
Expected:
[[0, 1, 1, 1, 1],
[0, 0, 0, 0, 1],
[1, 1, 1, 0, 1],
[1, 1, 1, 0, 0],
[1, 1, 1, 1, 0]]
Got:
[[0, 1, 1, 1, 1], [0, 0, 0, 0, 1], [1, 1, 1, 0, 1], [1, 1, 1, 0, 0], [1, 1, 1, 1, 0]]

/home/runner/work/Python/Python/backtracking/rat_in_maze.py:37: DocTestFailure

@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

________________ [doctest] backtracking.rat_in_maze.solve_maze _________________ 028 aiming to reach a destination cell. 029 The maze consists of walls (1s) and open paths (0s). 030 By providing custom row and column values, the source and destination 031 cells can be adjusted. 032 >>> maze = [[0, 1, 0, 1, 1], 033 ... [0, 0, 0, 0, 0], 034 ... [1, 0, 1, 0, 1], 035 ... [0, 0, 1, 0, 0], 036 ... [1, 0, 0, 1, 0]] 037 >>> solve_maze(maze,0,0,len(maze)-1,len(maze)-1) Expected: [[0, 1, 1, 1, 1], [0, 0, 0, 0, 1], [1, 1, 1, 0, 1], [1, 1, 1, 0, 0], [1, 1, 1, 1, 0]] Got: [[0, 1, 1, 1, 1], [0, 0, 0, 0, 1], [1, 1, 1, 0, 1], [1, 1, 1, 0, 0], [1, 1, 1, 1, 0]]

/home/runner/work/Python/Python/backtracking/rat_in_maze.py:37: DocTestFailure

This same test case passed on my local device because I used (optionflags=doctest.NORMALIZE_WHITESPACE), so why is it failing here?

@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

Do we really care about changing the initial and destination cells in the maze?

I do not really see the benefit of it and it just makes the implementation harder to read and understand.

I guess; it would be more helpful for understanding to run the program with different source and destination points to find the path.

@algorithms-keeperalgorithms-keeperBot removed the tests are failing Do not merge until tests pass label Oct 4, 2023
@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

Does this program require any further changes, or is it okay as it is?

Comment threadbacktracking/rat_in_maze.py Outdated
Comment threadbacktracking/rat_in_maze.py Outdated
Comment threadbacktracking/rat_in_maze.py Outdated
Comment threadbacktracking/rat_in_maze.py Outdated
import doctest

doctest.testmod()
doctest.testmod(optionflags=doctest.NORMALIZE_WHITESPACE)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does this work?!?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does this work?!?

Yes, it's working on my local machine, but it's not working on the build test. That's why I added '# doctest: +NORMALIZE_WHITESPACE' to each test.

@algorithms-keeperalgorithms-keeperBot removed the awaiting reviews This PR is ready to be reviewed label Oct 4, 2023
@algorithms-keeperalgorithms-keeperBot added the awaiting reviews This PR is ready to be reviewed label Oct 4, 2023
@cclauss
cclauss merged commit c16d2f8 into TheAlgorithms:masterOct 4, 2023
@algorithms-keeperalgorithms-keeperBot removed the awaiting reviews This PR is ready to be reviewed label Oct 4, 2023
@isidroasisidroas mentioned this pull request Jan 25, 2025
14 tasks
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancementThis PR modified some existing files

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Backtracking/Rat Maze

3 participants

@Muhammadummerr@dlesnoff@cclauss
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

UPDATED rat_in_maze.py - #9148

Merged
cclauss merged 16 commits into
TheAlgorithms:masterfrom
Muhammadummerr:new_branch
Oct 4, 2023
Merged

UPDATED rat_in_maze.py#9148
cclauss merged 16 commits into
TheAlgorithms:masterfrom
Muhammadummerr:new_branch

Conversation

@Muhammadummerr

@MuhammadummerrMuhammadummerr commented Sep 30, 2023

Copy link
Copy Markdown
Contributor

Describe your change:

Fixes#9066
I have made updates to the rat_in_maze.py file to enhance code clarity.
These updates include:

  1. Adding more descriptive comments to explain the logic and steps of the maze-solving algorithm.
  2. Introducing variables that allow for easy customization of the source and destination cells within the maze.
  3. Refactor path representation in solution:
  • Previously, in solution, paths were represented as 1s, but I have updated it to use 0s to align with the standard convention where 0s represent paths and 1s represent walls.
  1. Updated the return type to 'solution maze' if a path exists; otherwise, it returns 'None'.
  • Add an algorithm?
  • Fix a bug or typo in an existing algorithm?
  • Documentation change?

Checklist:

  • I have read CONTRIBUTING.md.
  • This pull request is all my own work -- I have not plagiarized.
  • I know that pull requests will not be merged if they fail the automated tests.
  • This PR only changes one algorithm file. To ease review, please open separate PRs for separate algorithms.
  • All new Python files are placed inside an existing directory.
  • All filenames are in all lowercase characters with no spaces or dashes.
  • All functions and variable names follow Python naming conventions.
  • All function parameters and return values are annotated with Python type hints.
  • All functions have doctests that pass the automated testing.
  • All new algorithms include at least one URL that points to Wikipedia or another similar explanation.
  • If this pull request resolves one or more open issues then the description above includes the issue number(s) with a closing keyword: "Fixes #ISSUE-NUMBER".

@algorithms-keeperalgorithms-keeperBot added enhancement This PR modified some existing files awaiting reviews This PR is ready to be reviewed labels Sep 30, 2023
Comment threadbacktracking/rat_in_maze.py Outdated
source_column: int,
destination_row: int,
destination_column: int,
) -> list[list[int]] | None:

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Returning two different datatypes pushes work on the caller. Please consider raising an exception if there is no solution.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See my remark in the general discussion of this Pull Request.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
) ->list[list[int]]|None:
) ->list[list[int]]:

@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

@cclauss Is there something I'm missing?

@dlesnoff

dlesnoff commented Oct 3, 2023

Copy link
Copy Markdown

Ok so @Muhammadummerr old pull request was reopened here.

@cclauss Is there something I'm missing?

Returning two different datatypes pushes work on the caller. Please consider raising an exception if there is no solution.

@cclaus If an exception is raised, the caller still has to wrap each function call in a try-except clause and catch the correct exception. In Nim, I would use an Option type (the equivalent of Result type in Rust, I guess?).
Maybe in Python, the closest to an Option type would be a dataclass with a list[list[int]] attribute and a boolean flag?
The caller would have to check for the boolean flag before accessing the maze, but at least the program would not crash in that case.
Exceptions are frequent in other Python Algorithm snippets, but they are often used for a bad user input. Here, the None type is a frequent and expected output of the algorithm.

@cclauss

Copy link
Copy Markdown
Member

It is very true that Nim and Rust have cooler ways of dealing with exception states that Python does but raising Exceptions are quite Pythonic and are preferred to multiple different datatypes.

@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

Okay,Based on my understanding of your request, the program should return both the solution maze and a flag.
1.If the flag's value is one, it will indicate that a solution exists, and the path in the solution maze will be represented by 0s.
2.If the flag is 0, it means that a solution was not found, and the solution maze will consist of only 1s.

@cclauss

Copy link
Copy Markdown
Member

No. The function should return a solution if there is one and raise an ValueError if there is no solution.

@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

I have made these changes.

@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

Okay, my mistake. I need to make some more changes. Thanks.

@dlesnoff

dlesnoff commented Oct 4, 2023

Copy link
Copy Markdown

Do we really care about changing the initial and destination cells in the maze?

I do not really see the benefit of it and it just makes the implementation harder to read and understand.

Comment threadbacktracking/rat_in_maze.py Outdated
[0, 0, 0, 0, 1]
True
>>> solve_maze(maze,0,0,len(maze)-1,len(maze)-1)
[[0, 1, 1, 1, 1], [0, 0, 0, 0, 1], [1, 1, 1, 0, 1],\

@dlesnoffdlesnoffOct 4, 2023

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is the output on the same line now? It makes reading the solution harder.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

https://docs.python.org/3/library/doctest.html#doctest.NORMALIZE_WHITESPACE will allow you to have doctests that ignore the whitespace so the matrix can look like a matrix.

@algorithms-keeperalgorithms-keeperBot added the tests are failing Do not merge until tests pass label Oct 4, 2023
@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

All Test case are passed on my device but failing in build check.

@cclauss

Copy link
Copy Markdown
Member

Looking better!

@cclauss

Copy link
Copy Markdown
Member

________________ [doctest] backtracking.rat_in_maze.solve_maze _________________
028 aiming to reach a destination cell.
029 The maze consists of walls (1s) and open paths (0s).
030 By providing custom row and column values, the source and destination
031 cells can be adjusted.
032 >>> maze = [[0, 1, 0, 1, 1],
033 ... [0, 0, 0, 0, 0],
034 ... [1, 0, 1, 0, 1],
035 ... [0, 0, 1, 0, 0],
036 ... [1, 0, 0, 1, 0]]
037 >>> solve_maze(maze,0,0,len(maze)-1,len(maze)-1)
Expected:
[[0, 1, 1, 1, 1],
[0, 0, 0, 0, 1],
[1, 1, 1, 0, 1],
[1, 1, 1, 0, 0],
[1, 1, 1, 1, 0]]
Got:
[[0, 1, 1, 1, 1], [0, 0, 0, 0, 1], [1, 1, 1, 0, 1], [1, 1, 1, 0, 0], [1, 1, 1, 1, 0]]

/home/runner/work/Python/Python/backtracking/rat_in_maze.py:37: DocTestFailure

@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

________________ [doctest] backtracking.rat_in_maze.solve_maze _________________ 028 aiming to reach a destination cell. 029 The maze consists of walls (1s) and open paths (0s). 030 By providing custom row and column values, the source and destination 031 cells can be adjusted. 032 >>> maze = [[0, 1, 0, 1, 1], 033 ... [0, 0, 0, 0, 0], 034 ... [1, 0, 1, 0, 1], 035 ... [0, 0, 1, 0, 0], 036 ... [1, 0, 0, 1, 0]] 037 >>> solve_maze(maze,0,0,len(maze)-1,len(maze)-1) Expected: [[0, 1, 1, 1, 1], [0, 0, 0, 0, 1], [1, 1, 1, 0, 1], [1, 1, 1, 0, 0], [1, 1, 1, 1, 0]] Got: [[0, 1, 1, 1, 1], [0, 0, 0, 0, 1], [1, 1, 1, 0, 1], [1, 1, 1, 0, 0], [1, 1, 1, 1, 0]]

/home/runner/work/Python/Python/backtracking/rat_in_maze.py:37: DocTestFailure

This same test case passed on my local device because I used (optionflags=doctest.NORMALIZE_WHITESPACE), so why is it failing here?

@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

Do we really care about changing the initial and destination cells in the maze?

I do not really see the benefit of it and it just makes the implementation harder to read and understand.

I guess; it would be more helpful for understanding to run the program with different source and destination points to find the path.

@algorithms-keeperalgorithms-keeperBot removed the tests are failing Do not merge until tests pass label Oct 4, 2023
@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

Does this program require any further changes, or is it okay as it is?

Comment threadbacktracking/rat_in_maze.py Outdated
Comment threadbacktracking/rat_in_maze.py Outdated
Comment threadbacktracking/rat_in_maze.py Outdated
Comment threadbacktracking/rat_in_maze.py Outdated
import doctest

doctest.testmod()
doctest.testmod(optionflags=doctest.NORMALIZE_WHITESPACE)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does this work?!?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does this work?!?

Yes, it's working on my local machine, but it's not working on the build test. That's why I added '# doctest: +NORMALIZE_WHITESPACE' to each test.

@algorithms-keeperalgorithms-keeperBot removed the awaiting reviews This PR is ready to be reviewed label Oct 4, 2023
@algorithms-keeperalgorithms-keeperBot added the awaiting reviews This PR is ready to be reviewed label Oct 4, 2023
@cclauss
cclauss merged commit c16d2f8 into TheAlgorithms:masterOct 4, 2023
@algorithms-keeperalgorithms-keeperBot removed the awaiting reviews This PR is ready to be reviewed label Oct 4, 2023
@isidroasisidroas mentioned this pull request Jan 25, 2025
14 tasks
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancementThis PR modified some existing files

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Backtracking/Rat Maze

3 participants

@Muhammadummerr@dlesnoff@cclauss
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

UPDATED rat_in_maze.py - #9148

Merged
cclauss merged 16 commits into
TheAlgorithms:masterfrom
Muhammadummerr:new_branch
Oct 4, 2023
Merged

UPDATED rat_in_maze.py#9148
cclauss merged 16 commits into
TheAlgorithms:masterfrom
Muhammadummerr:new_branch

Conversation

@Muhammadummerr

@MuhammadummerrMuhammadummerr commented Sep 30, 2023

Copy link
Copy Markdown
Contributor

Describe your change:

Fixes#9066
I have made updates to the rat_in_maze.py file to enhance code clarity.
These updates include:

  1. Adding more descriptive comments to explain the logic and steps of the maze-solving algorithm.
  2. Introducing variables that allow for easy customization of the source and destination cells within the maze.
  3. Refactor path representation in solution:
  • Previously, in solution, paths were represented as 1s, but I have updated it to use 0s to align with the standard convention where 0s represent paths and 1s represent walls.
  1. Updated the return type to 'solution maze' if a path exists; otherwise, it returns 'None'.
  • Add an algorithm?
  • Fix a bug or typo in an existing algorithm?
  • Documentation change?

Checklist:

  • I have read CONTRIBUTING.md.
  • This pull request is all my own work -- I have not plagiarized.
  • I know that pull requests will not be merged if they fail the automated tests.
  • This PR only changes one algorithm file. To ease review, please open separate PRs for separate algorithms.
  • All new Python files are placed inside an existing directory.
  • All filenames are in all lowercase characters with no spaces or dashes.
  • All functions and variable names follow Python naming conventions.
  • All function parameters and return values are annotated with Python type hints.
  • All functions have doctests that pass the automated testing.
  • All new algorithms include at least one URL that points to Wikipedia or another similar explanation.
  • If this pull request resolves one or more open issues then the description above includes the issue number(s) with a closing keyword: "Fixes #ISSUE-NUMBER".

@algorithms-keeperalgorithms-keeperBot added enhancement This PR modified some existing files awaiting reviews This PR is ready to be reviewed labels Sep 30, 2023
Comment threadbacktracking/rat_in_maze.py Outdated
source_column: int,
destination_row: int,
destination_column: int,
) -> list[list[int]] | None:

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Returning two different datatypes pushes work on the caller. Please consider raising an exception if there is no solution.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See my remark in the general discussion of this Pull Request.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
) ->list[list[int]]|None:
) ->list[list[int]]:

@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

@cclauss Is there something I'm missing?

@dlesnoff

dlesnoff commented Oct 3, 2023

Copy link
Copy Markdown

Ok so @Muhammadummerr old pull request was reopened here.

@cclauss Is there something I'm missing?

Returning two different datatypes pushes work on the caller. Please consider raising an exception if there is no solution.

@cclaus If an exception is raised, the caller still has to wrap each function call in a try-except clause and catch the correct exception. In Nim, I would use an Option type (the equivalent of Result type in Rust, I guess?).
Maybe in Python, the closest to an Option type would be a dataclass with a list[list[int]] attribute and a boolean flag?
The caller would have to check for the boolean flag before accessing the maze, but at least the program would not crash in that case.
Exceptions are frequent in other Python Algorithm snippets, but they are often used for a bad user input. Here, the None type is a frequent and expected output of the algorithm.

@cclauss

Copy link
Copy Markdown
Member

It is very true that Nim and Rust have cooler ways of dealing with exception states that Python does but raising Exceptions are quite Pythonic and are preferred to multiple different datatypes.

@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

Okay,Based on my understanding of your request, the program should return both the solution maze and a flag.
1.If the flag's value is one, it will indicate that a solution exists, and the path in the solution maze will be represented by 0s.
2.If the flag is 0, it means that a solution was not found, and the solution maze will consist of only 1s.

@cclauss

Copy link
Copy Markdown
Member

No. The function should return a solution if there is one and raise an ValueError if there is no solution.

@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

I have made these changes.

@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

Okay, my mistake. I need to make some more changes. Thanks.

@dlesnoff

dlesnoff commented Oct 4, 2023

Copy link
Copy Markdown

Do we really care about changing the initial and destination cells in the maze?

I do not really see the benefit of it and it just makes the implementation harder to read and understand.

Comment threadbacktracking/rat_in_maze.py Outdated
[0, 0, 0, 0, 1]
True
>>> solve_maze(maze,0,0,len(maze)-1,len(maze)-1)
[[0, 1, 1, 1, 1], [0, 0, 0, 0, 1], [1, 1, 1, 0, 1],\

@dlesnoffdlesnoffOct 4, 2023

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is the output on the same line now? It makes reading the solution harder.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

https://docs.python.org/3/library/doctest.html#doctest.NORMALIZE_WHITESPACE will allow you to have doctests that ignore the whitespace so the matrix can look like a matrix.

@algorithms-keeperalgorithms-keeperBot added the tests are failing Do not merge until tests pass label Oct 4, 2023
@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

All Test case are passed on my device but failing in build check.

@cclauss

Copy link
Copy Markdown
Member

Looking better!

@cclauss

Copy link
Copy Markdown
Member

________________ [doctest] backtracking.rat_in_maze.solve_maze _________________
028 aiming to reach a destination cell.
029 The maze consists of walls (1s) and open paths (0s).
030 By providing custom row and column values, the source and destination
031 cells can be adjusted.
032 >>> maze = [[0, 1, 0, 1, 1],
033 ... [0, 0, 0, 0, 0],
034 ... [1, 0, 1, 0, 1],
035 ... [0, 0, 1, 0, 0],
036 ... [1, 0, 0, 1, 0]]
037 >>> solve_maze(maze,0,0,len(maze)-1,len(maze)-1)
Expected:
[[0, 1, 1, 1, 1],
[0, 0, 0, 0, 1],
[1, 1, 1, 0, 1],
[1, 1, 1, 0, 0],
[1, 1, 1, 1, 0]]
Got:
[[0, 1, 1, 1, 1], [0, 0, 0, 0, 1], [1, 1, 1, 0, 1], [1, 1, 1, 0, 0], [1, 1, 1, 1, 0]]

/home/runner/work/Python/Python/backtracking/rat_in_maze.py:37: DocTestFailure

@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

________________ [doctest] backtracking.rat_in_maze.solve_maze _________________ 028 aiming to reach a destination cell. 029 The maze consists of walls (1s) and open paths (0s). 030 By providing custom row and column values, the source and destination 031 cells can be adjusted. 032 >>> maze = [[0, 1, 0, 1, 1], 033 ... [0, 0, 0, 0, 0], 034 ... [1, 0, 1, 0, 1], 035 ... [0, 0, 1, 0, 0], 036 ... [1, 0, 0, 1, 0]] 037 >>> solve_maze(maze,0,0,len(maze)-1,len(maze)-1) Expected: [[0, 1, 1, 1, 1], [0, 0, 0, 0, 1], [1, 1, 1, 0, 1], [1, 1, 1, 0, 0], [1, 1, 1, 1, 0]] Got: [[0, 1, 1, 1, 1], [0, 0, 0, 0, 1], [1, 1, 1, 0, 1], [1, 1, 1, 0, 0], [1, 1, 1, 1, 0]]

/home/runner/work/Python/Python/backtracking/rat_in_maze.py:37: DocTestFailure

This same test case passed on my local device because I used (optionflags=doctest.NORMALIZE_WHITESPACE), so why is it failing here?

@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

Do we really care about changing the initial and destination cells in the maze?

I do not really see the benefit of it and it just makes the implementation harder to read and understand.

I guess; it would be more helpful for understanding to run the program with different source and destination points to find the path.

@algorithms-keeperalgorithms-keeperBot removed the tests are failing Do not merge until tests pass label Oct 4, 2023
@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

Does this program require any further changes, or is it okay as it is?

Comment threadbacktracking/rat_in_maze.py Outdated
Comment threadbacktracking/rat_in_maze.py Outdated
Comment threadbacktracking/rat_in_maze.py Outdated
Comment threadbacktracking/rat_in_maze.py Outdated
import doctest

doctest.testmod()
doctest.testmod(optionflags=doctest.NORMALIZE_WHITESPACE)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does this work?!?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does this work?!?

Yes, it's working on my local machine, but it's not working on the build test. That's why I added '# doctest: +NORMALIZE_WHITESPACE' to each test.

@algorithms-keeperalgorithms-keeperBot removed the awaiting reviews This PR is ready to be reviewed label Oct 4, 2023
@algorithms-keeperalgorithms-keeperBot added the awaiting reviews This PR is ready to be reviewed label Oct 4, 2023
@cclauss
cclauss merged commit c16d2f8 into TheAlgorithms:masterOct 4, 2023
@algorithms-keeperalgorithms-keeperBot removed the awaiting reviews This PR is ready to be reviewed label Oct 4, 2023
@isidroasisidroas mentioned this pull request Jan 25, 2025
14 tasks
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancementThis PR modified some existing files

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Backtracking/Rat Maze

3 participants

@Muhammadummerr@dlesnoff@cclauss
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

UPDATED rat_in_maze.py - #9148

Merged
cclauss merged 16 commits into
TheAlgorithms:masterfrom
Muhammadummerr:new_branch
Oct 4, 2023
Merged

UPDATED rat_in_maze.py#9148
cclauss merged 16 commits into
TheAlgorithms:masterfrom
Muhammadummerr:new_branch

Conversation

@Muhammadummerr

@MuhammadummerrMuhammadummerr commented Sep 30, 2023

Copy link
Copy Markdown
Contributor

Describe your change:

Fixes#9066
I have made updates to the rat_in_maze.py file to enhance code clarity.
These updates include:

  1. Adding more descriptive comments to explain the logic and steps of the maze-solving algorithm.
  2. Introducing variables that allow for easy customization of the source and destination cells within the maze.
  3. Refactor path representation in solution:
  • Previously, in solution, paths were represented as 1s, but I have updated it to use 0s to align with the standard convention where 0s represent paths and 1s represent walls.
  1. Updated the return type to 'solution maze' if a path exists; otherwise, it returns 'None'.
  • Add an algorithm?
  • Fix a bug or typo in an existing algorithm?
  • Documentation change?

Checklist:

  • I have read CONTRIBUTING.md.
  • This pull request is all my own work -- I have not plagiarized.
  • I know that pull requests will not be merged if they fail the automated tests.
  • This PR only changes one algorithm file. To ease review, please open separate PRs for separate algorithms.
  • All new Python files are placed inside an existing directory.
  • All filenames are in all lowercase characters with no spaces or dashes.
  • All functions and variable names follow Python naming conventions.
  • All function parameters and return values are annotated with Python type hints.
  • All functions have doctests that pass the automated testing.
  • All new algorithms include at least one URL that points to Wikipedia or another similar explanation.
  • If this pull request resolves one or more open issues then the description above includes the issue number(s) with a closing keyword: "Fixes #ISSUE-NUMBER".

@algorithms-keeperalgorithms-keeperBot added enhancement This PR modified some existing files awaiting reviews This PR is ready to be reviewed labels Sep 30, 2023
Comment threadbacktracking/rat_in_maze.py Outdated
source_column: int,
destination_row: int,
destination_column: int,
) -> list[list[int]] | None:

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Returning two different datatypes pushes work on the caller. Please consider raising an exception if there is no solution.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See my remark in the general discussion of this Pull Request.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
) ->list[list[int]]|None:
) ->list[list[int]]:

@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

@cclauss Is there something I'm missing?

@dlesnoff

dlesnoff commented Oct 3, 2023

Copy link
Copy Markdown

Ok so @Muhammadummerr old pull request was reopened here.

@cclauss Is there something I'm missing?

Returning two different datatypes pushes work on the caller. Please consider raising an exception if there is no solution.

@cclaus If an exception is raised, the caller still has to wrap each function call in a try-except clause and catch the correct exception. In Nim, I would use an Option type (the equivalent of Result type in Rust, I guess?).
Maybe in Python, the closest to an Option type would be a dataclass with a list[list[int]] attribute and a boolean flag?
The caller would have to check for the boolean flag before accessing the maze, but at least the program would not crash in that case.
Exceptions are frequent in other Python Algorithm snippets, but they are often used for a bad user input. Here, the None type is a frequent and expected output of the algorithm.

@cclauss

Copy link
Copy Markdown
Member

It is very true that Nim and Rust have cooler ways of dealing with exception states that Python does but raising Exceptions are quite Pythonic and are preferred to multiple different datatypes.

@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

Okay,Based on my understanding of your request, the program should return both the solution maze and a flag.
1.If the flag's value is one, it will indicate that a solution exists, and the path in the solution maze will be represented by 0s.
2.If the flag is 0, it means that a solution was not found, and the solution maze will consist of only 1s.

@cclauss

Copy link
Copy Markdown
Member

No. The function should return a solution if there is one and raise an ValueError if there is no solution.

@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

I have made these changes.

@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

Okay, my mistake. I need to make some more changes. Thanks.

@dlesnoff

dlesnoff commented Oct 4, 2023

Copy link
Copy Markdown

Do we really care about changing the initial and destination cells in the maze?

I do not really see the benefit of it and it just makes the implementation harder to read and understand.

Comment threadbacktracking/rat_in_maze.py Outdated
[0, 0, 0, 0, 1]
True
>>> solve_maze(maze,0,0,len(maze)-1,len(maze)-1)
[[0, 1, 1, 1, 1], [0, 0, 0, 0, 1], [1, 1, 1, 0, 1],\

@dlesnoffdlesnoffOct 4, 2023

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is the output on the same line now? It makes reading the solution harder.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

https://docs.python.org/3/library/doctest.html#doctest.NORMALIZE_WHITESPACE will allow you to have doctests that ignore the whitespace so the matrix can look like a matrix.

@algorithms-keeperalgorithms-keeperBot added the tests are failing Do not merge until tests pass label Oct 4, 2023
@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

All Test case are passed on my device but failing in build check.

@cclauss

Copy link
Copy Markdown
Member

Looking better!

@cclauss

Copy link
Copy Markdown
Member

________________ [doctest] backtracking.rat_in_maze.solve_maze _________________
028 aiming to reach a destination cell.
029 The maze consists of walls (1s) and open paths (0s).
030 By providing custom row and column values, the source and destination
031 cells can be adjusted.
032 >>> maze = [[0, 1, 0, 1, 1],
033 ... [0, 0, 0, 0, 0],
034 ... [1, 0, 1, 0, 1],
035 ... [0, 0, 1, 0, 0],
036 ... [1, 0, 0, 1, 0]]
037 >>> solve_maze(maze,0,0,len(maze)-1,len(maze)-1)
Expected:
[[0, 1, 1, 1, 1],
[0, 0, 0, 0, 1],
[1, 1, 1, 0, 1],
[1, 1, 1, 0, 0],
[1, 1, 1, 1, 0]]
Got:
[[0, 1, 1, 1, 1], [0, 0, 0, 0, 1], [1, 1, 1, 0, 1], [1, 1, 1, 0, 0], [1, 1, 1, 1, 0]]

/home/runner/work/Python/Python/backtracking/rat_in_maze.py:37: DocTestFailure

@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

________________ [doctest] backtracking.rat_in_maze.solve_maze _________________ 028 aiming to reach a destination cell. 029 The maze consists of walls (1s) and open paths (0s). 030 By providing custom row and column values, the source and destination 031 cells can be adjusted. 032 >>> maze = [[0, 1, 0, 1, 1], 033 ... [0, 0, 0, 0, 0], 034 ... [1, 0, 1, 0, 1], 035 ... [0, 0, 1, 0, 0], 036 ... [1, 0, 0, 1, 0]] 037 >>> solve_maze(maze,0,0,len(maze)-1,len(maze)-1) Expected: [[0, 1, 1, 1, 1], [0, 0, 0, 0, 1], [1, 1, 1, 0, 1], [1, 1, 1, 0, 0], [1, 1, 1, 1, 0]] Got: [[0, 1, 1, 1, 1], [0, 0, 0, 0, 1], [1, 1, 1, 0, 1], [1, 1, 1, 0, 0], [1, 1, 1, 1, 0]]

/home/runner/work/Python/Python/backtracking/rat_in_maze.py:37: DocTestFailure

This same test case passed on my local device because I used (optionflags=doctest.NORMALIZE_WHITESPACE), so why is it failing here?

@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

Do we really care about changing the initial and destination cells in the maze?

I do not really see the benefit of it and it just makes the implementation harder to read and understand.

I guess; it would be more helpful for understanding to run the program with different source and destination points to find the path.

@algorithms-keeperalgorithms-keeperBot removed the tests are failing Do not merge until tests pass label Oct 4, 2023
@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

Does this program require any further changes, or is it okay as it is?

Comment threadbacktracking/rat_in_maze.py Outdated
Comment threadbacktracking/rat_in_maze.py Outdated
Comment threadbacktracking/rat_in_maze.py Outdated
Comment threadbacktracking/rat_in_maze.py Outdated
import doctest

doctest.testmod()
doctest.testmod(optionflags=doctest.NORMALIZE_WHITESPACE)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does this work?!?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does this work?!?

Yes, it's working on my local machine, but it's not working on the build test. That's why I added '# doctest: +NORMALIZE_WHITESPACE' to each test.

@algorithms-keeperalgorithms-keeperBot removed the awaiting reviews This PR is ready to be reviewed label Oct 4, 2023
@algorithms-keeperalgorithms-keeperBot added the awaiting reviews This PR is ready to be reviewed label Oct 4, 2023
@cclauss
cclauss merged commit c16d2f8 into TheAlgorithms:masterOct 4, 2023
@algorithms-keeperalgorithms-keeperBot removed the awaiting reviews This PR is ready to be reviewed label Oct 4, 2023
@isidroasisidroas mentioned this pull request Jan 25, 2025
14 tasks
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancementThis PR modified some existing files

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Backtracking/Rat Maze

3 participants

@Muhammadummerr@dlesnoff@cclauss
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

UPDATED rat_in_maze.py - #9148

Merged
cclauss merged 16 commits into
TheAlgorithms:masterfrom
Muhammadummerr:new_branch
Oct 4, 2023
Merged

UPDATED rat_in_maze.py#9148
cclauss merged 16 commits into
TheAlgorithms:masterfrom
Muhammadummerr:new_branch

Conversation

@Muhammadummerr

@MuhammadummerrMuhammadummerr commented Sep 30, 2023

Copy link
Copy Markdown
Contributor

Describe your change:

Fixes#9066
I have made updates to the rat_in_maze.py file to enhance code clarity.
These updates include:

  1. Adding more descriptive comments to explain the logic and steps of the maze-solving algorithm.
  2. Introducing variables that allow for easy customization of the source and destination cells within the maze.
  3. Refactor path representation in solution:
  • Previously, in solution, paths were represented as 1s, but I have updated it to use 0s to align with the standard convention where 0s represent paths and 1s represent walls.
  1. Updated the return type to 'solution maze' if a path exists; otherwise, it returns 'None'.
  • Add an algorithm?
  • Fix a bug or typo in an existing algorithm?
  • Documentation change?

Checklist:

  • I have read CONTRIBUTING.md.
  • This pull request is all my own work -- I have not plagiarized.
  • I know that pull requests will not be merged if they fail the automated tests.
  • This PR only changes one algorithm file. To ease review, please open separate PRs for separate algorithms.
  • All new Python files are placed inside an existing directory.
  • All filenames are in all lowercase characters with no spaces or dashes.
  • All functions and variable names follow Python naming conventions.
  • All function parameters and return values are annotated with Python type hints.
  • All functions have doctests that pass the automated testing.
  • All new algorithms include at least one URL that points to Wikipedia or another similar explanation.
  • If this pull request resolves one or more open issues then the description above includes the issue number(s) with a closing keyword: "Fixes #ISSUE-NUMBER".

@algorithms-keeperalgorithms-keeperBot added enhancement This PR modified some existing files awaiting reviews This PR is ready to be reviewed labels Sep 30, 2023
Comment threadbacktracking/rat_in_maze.py Outdated
source_column: int,
destination_row: int,
destination_column: int,
) -> list[list[int]] | None:

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Returning two different datatypes pushes work on the caller. Please consider raising an exception if there is no solution.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See my remark in the general discussion of this Pull Request.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
) ->list[list[int]]|None:
) ->list[list[int]]:

@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

@cclauss Is there something I'm missing?

@dlesnoff

dlesnoff commented Oct 3, 2023

Copy link
Copy Markdown

Ok so @Muhammadummerr old pull request was reopened here.

@cclauss Is there something I'm missing?

Returning two different datatypes pushes work on the caller. Please consider raising an exception if there is no solution.

@cclaus If an exception is raised, the caller still has to wrap each function call in a try-except clause and catch the correct exception. In Nim, I would use an Option type (the equivalent of Result type in Rust, I guess?).
Maybe in Python, the closest to an Option type would be a dataclass with a list[list[int]] attribute and a boolean flag?
The caller would have to check for the boolean flag before accessing the maze, but at least the program would not crash in that case.
Exceptions are frequent in other Python Algorithm snippets, but they are often used for a bad user input. Here, the None type is a frequent and expected output of the algorithm.

@cclauss

Copy link
Copy Markdown
Member

It is very true that Nim and Rust have cooler ways of dealing with exception states that Python does but raising Exceptions are quite Pythonic and are preferred to multiple different datatypes.

@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

Okay,Based on my understanding of your request, the program should return both the solution maze and a flag.
1.If the flag's value is one, it will indicate that a solution exists, and the path in the solution maze will be represented by 0s.
2.If the flag is 0, it means that a solution was not found, and the solution maze will consist of only 1s.

@cclauss

Copy link
Copy Markdown
Member

No. The function should return a solution if there is one and raise an ValueError if there is no solution.

@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

I have made these changes.

@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

Okay, my mistake. I need to make some more changes. Thanks.

@dlesnoff

dlesnoff commented Oct 4, 2023

Copy link
Copy Markdown

Do we really care about changing the initial and destination cells in the maze?

I do not really see the benefit of it and it just makes the implementation harder to read and understand.

Comment threadbacktracking/rat_in_maze.py Outdated
[0, 0, 0, 0, 1]
True
>>> solve_maze(maze,0,0,len(maze)-1,len(maze)-1)
[[0, 1, 1, 1, 1], [0, 0, 0, 0, 1], [1, 1, 1, 0, 1],\

@dlesnoffdlesnoffOct 4, 2023

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is the output on the same line now? It makes reading the solution harder.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

https://docs.python.org/3/library/doctest.html#doctest.NORMALIZE_WHITESPACE will allow you to have doctests that ignore the whitespace so the matrix can look like a matrix.

@algorithms-keeperalgorithms-keeperBot added the tests are failing Do not merge until tests pass label Oct 4, 2023
@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

All Test case are passed on my device but failing in build check.

@cclauss

Copy link
Copy Markdown
Member

Looking better!

@cclauss

Copy link
Copy Markdown
Member

________________ [doctest] backtracking.rat_in_maze.solve_maze _________________
028 aiming to reach a destination cell.
029 The maze consists of walls (1s) and open paths (0s).
030 By providing custom row and column values, the source and destination
031 cells can be adjusted.
032 >>> maze = [[0, 1, 0, 1, 1],
033 ... [0, 0, 0, 0, 0],
034 ... [1, 0, 1, 0, 1],
035 ... [0, 0, 1, 0, 0],
036 ... [1, 0, 0, 1, 0]]
037 >>> solve_maze(maze,0,0,len(maze)-1,len(maze)-1)
Expected:
[[0, 1, 1, 1, 1],
[0, 0, 0, 0, 1],
[1, 1, 1, 0, 1],
[1, 1, 1, 0, 0],
[1, 1, 1, 1, 0]]
Got:
[[0, 1, 1, 1, 1], [0, 0, 0, 0, 1], [1, 1, 1, 0, 1], [1, 1, 1, 0, 0], [1, 1, 1, 1, 0]]

/home/runner/work/Python/Python/backtracking/rat_in_maze.py:37: DocTestFailure

@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

________________ [doctest] backtracking.rat_in_maze.solve_maze _________________ 028 aiming to reach a destination cell. 029 The maze consists of walls (1s) and open paths (0s). 030 By providing custom row and column values, the source and destination 031 cells can be adjusted. 032 >>> maze = [[0, 1, 0, 1, 1], 033 ... [0, 0, 0, 0, 0], 034 ... [1, 0, 1, 0, 1], 035 ... [0, 0, 1, 0, 0], 036 ... [1, 0, 0, 1, 0]] 037 >>> solve_maze(maze,0,0,len(maze)-1,len(maze)-1) Expected: [[0, 1, 1, 1, 1], [0, 0, 0, 0, 1], [1, 1, 1, 0, 1], [1, 1, 1, 0, 0], [1, 1, 1, 1, 0]] Got: [[0, 1, 1, 1, 1], [0, 0, 0, 0, 1], [1, 1, 1, 0, 1], [1, 1, 1, 0, 0], [1, 1, 1, 1, 0]]

/home/runner/work/Python/Python/backtracking/rat_in_maze.py:37: DocTestFailure

This same test case passed on my local device because I used (optionflags=doctest.NORMALIZE_WHITESPACE), so why is it failing here?

@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

Do we really care about changing the initial and destination cells in the maze?

I do not really see the benefit of it and it just makes the implementation harder to read and understand.

I guess; it would be more helpful for understanding to run the program with different source and destination points to find the path.

@algorithms-keeperalgorithms-keeperBot removed the tests are failing Do not merge until tests pass label Oct 4, 2023
@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

Does this program require any further changes, or is it okay as it is?

Comment threadbacktracking/rat_in_maze.py Outdated
Comment threadbacktracking/rat_in_maze.py Outdated
Comment threadbacktracking/rat_in_maze.py Outdated
Comment threadbacktracking/rat_in_maze.py Outdated
import doctest

doctest.testmod()
doctest.testmod(optionflags=doctest.NORMALIZE_WHITESPACE)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does this work?!?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does this work?!?

Yes, it's working on my local machine, but it's not working on the build test. That's why I added '# doctest: +NORMALIZE_WHITESPACE' to each test.

@algorithms-keeperalgorithms-keeperBot removed the awaiting reviews This PR is ready to be reviewed label Oct 4, 2023
@algorithms-keeperalgorithms-keeperBot added the awaiting reviews This PR is ready to be reviewed label Oct 4, 2023
@cclauss
cclauss merged commit c16d2f8 into TheAlgorithms:masterOct 4, 2023
@algorithms-keeperalgorithms-keeperBot removed the awaiting reviews This PR is ready to be reviewed label Oct 4, 2023
@isidroasisidroas mentioned this pull request Jan 25, 2025
14 tasks
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancementThis PR modified some existing files

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Backtracking/Rat Maze

3 participants

@Muhammadummerr@dlesnoff@cclauss
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

UPDATED rat_in_maze.py - #9148

Merged
cclauss merged 16 commits into
TheAlgorithms:masterfrom
Muhammadummerr:new_branch
Oct 4, 2023
Merged

UPDATED rat_in_maze.py#9148
cclauss merged 16 commits into
TheAlgorithms:masterfrom
Muhammadummerr:new_branch

Conversation

@Muhammadummerr

@MuhammadummerrMuhammadummerr commented Sep 30, 2023

Copy link
Copy Markdown
Contributor

Describe your change:

Fixes#9066
I have made updates to the rat_in_maze.py file to enhance code clarity.
These updates include:

  1. Adding more descriptive comments to explain the logic and steps of the maze-solving algorithm.
  2. Introducing variables that allow for easy customization of the source and destination cells within the maze.
  3. Refactor path representation in solution:
  • Previously, in solution, paths were represented as 1s, but I have updated it to use 0s to align with the standard convention where 0s represent paths and 1s represent walls.
  1. Updated the return type to 'solution maze' if a path exists; otherwise, it returns 'None'.
  • Add an algorithm?
  • Fix a bug or typo in an existing algorithm?
  • Documentation change?

Checklist:

  • I have read CONTRIBUTING.md.
  • This pull request is all my own work -- I have not plagiarized.
  • I know that pull requests will not be merged if they fail the automated tests.
  • This PR only changes one algorithm file. To ease review, please open separate PRs for separate algorithms.
  • All new Python files are placed inside an existing directory.
  • All filenames are in all lowercase characters with no spaces or dashes.
  • All functions and variable names follow Python naming conventions.
  • All function parameters and return values are annotated with Python type hints.
  • All functions have doctests that pass the automated testing.
  • All new algorithms include at least one URL that points to Wikipedia or another similar explanation.
  • If this pull request resolves one or more open issues then the description above includes the issue number(s) with a closing keyword: "Fixes #ISSUE-NUMBER".

@algorithms-keeperalgorithms-keeperBot added enhancement This PR modified some existing files awaiting reviews This PR is ready to be reviewed labels Sep 30, 2023
Comment threadbacktracking/rat_in_maze.py Outdated
source_column: int,
destination_row: int,
destination_column: int,
) -> list[list[int]] | None:

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Returning two different datatypes pushes work on the caller. Please consider raising an exception if there is no solution.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See my remark in the general discussion of this Pull Request.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
) ->list[list[int]]|None:
) ->list[list[int]]:

@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

@cclauss Is there something I'm missing?

@dlesnoff

dlesnoff commented Oct 3, 2023

Copy link
Copy Markdown

Ok so @Muhammadummerr old pull request was reopened here.

@cclauss Is there something I'm missing?

Returning two different datatypes pushes work on the caller. Please consider raising an exception if there is no solution.

@cclaus If an exception is raised, the caller still has to wrap each function call in a try-except clause and catch the correct exception. In Nim, I would use an Option type (the equivalent of Result type in Rust, I guess?).
Maybe in Python, the closest to an Option type would be a dataclass with a list[list[int]] attribute and a boolean flag?
The caller would have to check for the boolean flag before accessing the maze, but at least the program would not crash in that case.
Exceptions are frequent in other Python Algorithm snippets, but they are often used for a bad user input. Here, the None type is a frequent and expected output of the algorithm.

@cclauss

Copy link
Copy Markdown
Member

It is very true that Nim and Rust have cooler ways of dealing with exception states that Python does but raising Exceptions are quite Pythonic and are preferred to multiple different datatypes.

@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

Okay,Based on my understanding of your request, the program should return both the solution maze and a flag.
1.If the flag's value is one, it will indicate that a solution exists, and the path in the solution maze will be represented by 0s.
2.If the flag is 0, it means that a solution was not found, and the solution maze will consist of only 1s.

@cclauss

Copy link
Copy Markdown
Member

No. The function should return a solution if there is one and raise an ValueError if there is no solution.

@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

I have made these changes.

@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

Okay, my mistake. I need to make some more changes. Thanks.

@dlesnoff

dlesnoff commented Oct 4, 2023

Copy link
Copy Markdown

Do we really care about changing the initial and destination cells in the maze?

I do not really see the benefit of it and it just makes the implementation harder to read and understand.

Comment threadbacktracking/rat_in_maze.py Outdated
[0, 0, 0, 0, 1]
True
>>> solve_maze(maze,0,0,len(maze)-1,len(maze)-1)
[[0, 1, 1, 1, 1], [0, 0, 0, 0, 1], [1, 1, 1, 0, 1],\

@dlesnoffdlesnoffOct 4, 2023

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is the output on the same line now? It makes reading the solution harder.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

https://docs.python.org/3/library/doctest.html#doctest.NORMALIZE_WHITESPACE will allow you to have doctests that ignore the whitespace so the matrix can look like a matrix.

@algorithms-keeperalgorithms-keeperBot added the tests are failing Do not merge until tests pass label Oct 4, 2023
@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

All Test case are passed on my device but failing in build check.

@cclauss

Copy link
Copy Markdown
Member

Looking better!

@cclauss

Copy link
Copy Markdown
Member

________________ [doctest] backtracking.rat_in_maze.solve_maze _________________
028 aiming to reach a destination cell.
029 The maze consists of walls (1s) and open paths (0s).
030 By providing custom row and column values, the source and destination
031 cells can be adjusted.
032 >>> maze = [[0, 1, 0, 1, 1],
033 ... [0, 0, 0, 0, 0],
034 ... [1, 0, 1, 0, 1],
035 ... [0, 0, 1, 0, 0],
036 ... [1, 0, 0, 1, 0]]
037 >>> solve_maze(maze,0,0,len(maze)-1,len(maze)-1)
Expected:
[[0, 1, 1, 1, 1],
[0, 0, 0, 0, 1],
[1, 1, 1, 0, 1],
[1, 1, 1, 0, 0],
[1, 1, 1, 1, 0]]
Got:
[[0, 1, 1, 1, 1], [0, 0, 0, 0, 1], [1, 1, 1, 0, 1], [1, 1, 1, 0, 0], [1, 1, 1, 1, 0]]

/home/runner/work/Python/Python/backtracking/rat_in_maze.py:37: DocTestFailure

@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

________________ [doctest] backtracking.rat_in_maze.solve_maze _________________ 028 aiming to reach a destination cell. 029 The maze consists of walls (1s) and open paths (0s). 030 By providing custom row and column values, the source and destination 031 cells can be adjusted. 032 >>> maze = [[0, 1, 0, 1, 1], 033 ... [0, 0, 0, 0, 0], 034 ... [1, 0, 1, 0, 1], 035 ... [0, 0, 1, 0, 0], 036 ... [1, 0, 0, 1, 0]] 037 >>> solve_maze(maze,0,0,len(maze)-1,len(maze)-1) Expected: [[0, 1, 1, 1, 1], [0, 0, 0, 0, 1], [1, 1, 1, 0, 1], [1, 1, 1, 0, 0], [1, 1, 1, 1, 0]] Got: [[0, 1, 1, 1, 1], [0, 0, 0, 0, 1], [1, 1, 1, 0, 1], [1, 1, 1, 0, 0], [1, 1, 1, 1, 0]]

/home/runner/work/Python/Python/backtracking/rat_in_maze.py:37: DocTestFailure

This same test case passed on my local device because I used (optionflags=doctest.NORMALIZE_WHITESPACE), so why is it failing here?

@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

Do we really care about changing the initial and destination cells in the maze?

I do not really see the benefit of it and it just makes the implementation harder to read and understand.

I guess; it would be more helpful for understanding to run the program with different source and destination points to find the path.

@algorithms-keeperalgorithms-keeperBot removed the tests are failing Do not merge until tests pass label Oct 4, 2023
@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

Does this program require any further changes, or is it okay as it is?

Comment threadbacktracking/rat_in_maze.py Outdated
Comment threadbacktracking/rat_in_maze.py Outdated
Comment threadbacktracking/rat_in_maze.py Outdated
Comment threadbacktracking/rat_in_maze.py Outdated
import doctest

doctest.testmod()
doctest.testmod(optionflags=doctest.NORMALIZE_WHITESPACE)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does this work?!?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does this work?!?

Yes, it's working on my local machine, but it's not working on the build test. That's why I added '# doctest: +NORMALIZE_WHITESPACE' to each test.

@algorithms-keeperalgorithms-keeperBot removed the awaiting reviews This PR is ready to be reviewed label Oct 4, 2023
@algorithms-keeperalgorithms-keeperBot added the awaiting reviews This PR is ready to be reviewed label Oct 4, 2023
@cclauss
cclauss merged commit c16d2f8 into TheAlgorithms:masterOct 4, 2023
@algorithms-keeperalgorithms-keeperBot removed the awaiting reviews This PR is ready to be reviewed label Oct 4, 2023
@isidroasisidroas mentioned this pull request Jan 25, 2025
14 tasks
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancementThis PR modified some existing files

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Backtracking/Rat Maze

3 participants

@Muhammadummerr@dlesnoff@cclauss
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

UPDATED rat_in_maze.py - #9148

Merged
cclauss merged 16 commits into
TheAlgorithms:masterfrom
Muhammadummerr:new_branch
Oct 4, 2023
Merged

UPDATED rat_in_maze.py#9148
cclauss merged 16 commits into
TheAlgorithms:masterfrom
Muhammadummerr:new_branch

Conversation

@Muhammadummerr

@MuhammadummerrMuhammadummerr commented Sep 30, 2023

Copy link
Copy Markdown
Contributor

Describe your change:

Fixes#9066
I have made updates to the rat_in_maze.py file to enhance code clarity.
These updates include:

  1. Adding more descriptive comments to explain the logic and steps of the maze-solving algorithm.
  2. Introducing variables that allow for easy customization of the source and destination cells within the maze.
  3. Refactor path representation in solution:
  • Previously, in solution, paths were represented as 1s, but I have updated it to use 0s to align with the standard convention where 0s represent paths and 1s represent walls.
  1. Updated the return type to 'solution maze' if a path exists; otherwise, it returns 'None'.
  • Add an algorithm?
  • Fix a bug or typo in an existing algorithm?
  • Documentation change?

Checklist:

  • I have read CONTRIBUTING.md.
  • This pull request is all my own work -- I have not plagiarized.
  • I know that pull requests will not be merged if they fail the automated tests.
  • This PR only changes one algorithm file. To ease review, please open separate PRs for separate algorithms.
  • All new Python files are placed inside an existing directory.
  • All filenames are in all lowercase characters with no spaces or dashes.
  • All functions and variable names follow Python naming conventions.
  • All function parameters and return values are annotated with Python type hints.
  • All functions have doctests that pass the automated testing.
  • All new algorithms include at least one URL that points to Wikipedia or another similar explanation.
  • If this pull request resolves one or more open issues then the description above includes the issue number(s) with a closing keyword: "Fixes #ISSUE-NUMBER".

@algorithms-keeperalgorithms-keeperBot added enhancement This PR modified some existing files awaiting reviews This PR is ready to be reviewed labels Sep 30, 2023
Comment threadbacktracking/rat_in_maze.py Outdated
source_column: int,
destination_row: int,
destination_column: int,
) -> list[list[int]] | None:

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Returning two different datatypes pushes work on the caller. Please consider raising an exception if there is no solution.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See my remark in the general discussion of this Pull Request.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
) ->list[list[int]]|None:
) ->list[list[int]]:

@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

@cclauss Is there something I'm missing?

@dlesnoff

dlesnoff commented Oct 3, 2023

Copy link
Copy Markdown

Ok so @Muhammadummerr old pull request was reopened here.

@cclauss Is there something I'm missing?

Returning two different datatypes pushes work on the caller. Please consider raising an exception if there is no solution.

@cclaus If an exception is raised, the caller still has to wrap each function call in a try-except clause and catch the correct exception. In Nim, I would use an Option type (the equivalent of Result type in Rust, I guess?).
Maybe in Python, the closest to an Option type would be a dataclass with a list[list[int]] attribute and a boolean flag?
The caller would have to check for the boolean flag before accessing the maze, but at least the program would not crash in that case.
Exceptions are frequent in other Python Algorithm snippets, but they are often used for a bad user input. Here, the None type is a frequent and expected output of the algorithm.

@cclauss

Copy link
Copy Markdown
Member

It is very true that Nim and Rust have cooler ways of dealing with exception states that Python does but raising Exceptions are quite Pythonic and are preferred to multiple different datatypes.

@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

Okay,Based on my understanding of your request, the program should return both the solution maze and a flag.
1.If the flag's value is one, it will indicate that a solution exists, and the path in the solution maze will be represented by 0s.
2.If the flag is 0, it means that a solution was not found, and the solution maze will consist of only 1s.

@cclauss

Copy link
Copy Markdown
Member

No. The function should return a solution if there is one and raise an ValueError if there is no solution.

@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

I have made these changes.

@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

Okay, my mistake. I need to make some more changes. Thanks.

@dlesnoff

dlesnoff commented Oct 4, 2023

Copy link
Copy Markdown

Do we really care about changing the initial and destination cells in the maze?

I do not really see the benefit of it and it just makes the implementation harder to read and understand.

Comment threadbacktracking/rat_in_maze.py Outdated
[0, 0, 0, 0, 1]
True
>>> solve_maze(maze,0,0,len(maze)-1,len(maze)-1)
[[0, 1, 1, 1, 1], [0, 0, 0, 0, 1], [1, 1, 1, 0, 1],\

@dlesnoffdlesnoffOct 4, 2023

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is the output on the same line now? It makes reading the solution harder.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

https://docs.python.org/3/library/doctest.html#doctest.NORMALIZE_WHITESPACE will allow you to have doctests that ignore the whitespace so the matrix can look like a matrix.

@algorithms-keeperalgorithms-keeperBot added the tests are failing Do not merge until tests pass label Oct 4, 2023
@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

All Test case are passed on my device but failing in build check.

@cclauss

Copy link
Copy Markdown
Member

Looking better!

@cclauss

Copy link
Copy Markdown
Member

________________ [doctest] backtracking.rat_in_maze.solve_maze _________________
028 aiming to reach a destination cell.
029 The maze consists of walls (1s) and open paths (0s).
030 By providing custom row and column values, the source and destination
031 cells can be adjusted.
032 >>> maze = [[0, 1, 0, 1, 1],
033 ... [0, 0, 0, 0, 0],
034 ... [1, 0, 1, 0, 1],
035 ... [0, 0, 1, 0, 0],
036 ... [1, 0, 0, 1, 0]]
037 >>> solve_maze(maze,0,0,len(maze)-1,len(maze)-1)
Expected:
[[0, 1, 1, 1, 1],
[0, 0, 0, 0, 1],
[1, 1, 1, 0, 1],
[1, 1, 1, 0, 0],
[1, 1, 1, 1, 0]]
Got:
[[0, 1, 1, 1, 1], [0, 0, 0, 0, 1], [1, 1, 1, 0, 1], [1, 1, 1, 0, 0], [1, 1, 1, 1, 0]]

/home/runner/work/Python/Python/backtracking/rat_in_maze.py:37: DocTestFailure

@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

________________ [doctest] backtracking.rat_in_maze.solve_maze _________________ 028 aiming to reach a destination cell. 029 The maze consists of walls (1s) and open paths (0s). 030 By providing custom row and column values, the source and destination 031 cells can be adjusted. 032 >>> maze = [[0, 1, 0, 1, 1], 033 ... [0, 0, 0, 0, 0], 034 ... [1, 0, 1, 0, 1], 035 ... [0, 0, 1, 0, 0], 036 ... [1, 0, 0, 1, 0]] 037 >>> solve_maze(maze,0,0,len(maze)-1,len(maze)-1) Expected: [[0, 1, 1, 1, 1], [0, 0, 0, 0, 1], [1, 1, 1, 0, 1], [1, 1, 1, 0, 0], [1, 1, 1, 1, 0]] Got: [[0, 1, 1, 1, 1], [0, 0, 0, 0, 1], [1, 1, 1, 0, 1], [1, 1, 1, 0, 0], [1, 1, 1, 1, 0]]

/home/runner/work/Python/Python/backtracking/rat_in_maze.py:37: DocTestFailure

This same test case passed on my local device because I used (optionflags=doctest.NORMALIZE_WHITESPACE), so why is it failing here?

@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

Do we really care about changing the initial and destination cells in the maze?

I do not really see the benefit of it and it just makes the implementation harder to read and understand.

I guess; it would be more helpful for understanding to run the program with different source and destination points to find the path.

@algorithms-keeperalgorithms-keeperBot removed the tests are failing Do not merge until tests pass label Oct 4, 2023
@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

Does this program require any further changes, or is it okay as it is?

Comment threadbacktracking/rat_in_maze.py Outdated
Comment threadbacktracking/rat_in_maze.py Outdated
Comment threadbacktracking/rat_in_maze.py Outdated
Comment threadbacktracking/rat_in_maze.py Outdated
import doctest

doctest.testmod()
doctest.testmod(optionflags=doctest.NORMALIZE_WHITESPACE)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does this work?!?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does this work?!?

Yes, it's working on my local machine, but it's not working on the build test. That's why I added '# doctest: +NORMALIZE_WHITESPACE' to each test.

@algorithms-keeperalgorithms-keeperBot removed the awaiting reviews This PR is ready to be reviewed label Oct 4, 2023
@algorithms-keeperalgorithms-keeperBot added the awaiting reviews This PR is ready to be reviewed label Oct 4, 2023
@cclauss
cclauss merged commit c16d2f8 into TheAlgorithms:masterOct 4, 2023
@algorithms-keeperalgorithms-keeperBot removed the awaiting reviews This PR is ready to be reviewed label Oct 4, 2023
@isidroasisidroas mentioned this pull request Jan 25, 2025
14 tasks
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancementThis PR modified some existing files

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Backtracking/Rat Maze

3 participants

@Muhammadummerr@dlesnoff@cclauss
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

UPDATED rat_in_maze.py - #9148

Merged
cclauss merged 16 commits into
TheAlgorithms:masterfrom
Muhammadummerr:new_branch
Oct 4, 2023
Merged

UPDATED rat_in_maze.py#9148
cclauss merged 16 commits into
TheAlgorithms:masterfrom
Muhammadummerr:new_branch

Conversation

@Muhammadummerr

@MuhammadummerrMuhammadummerr commented Sep 30, 2023

Copy link
Copy Markdown
Contributor

Describe your change:

Fixes#9066
I have made updates to the rat_in_maze.py file to enhance code clarity.
These updates include:

  1. Adding more descriptive comments to explain the logic and steps of the maze-solving algorithm.
  2. Introducing variables that allow for easy customization of the source and destination cells within the maze.
  3. Refactor path representation in solution:
  • Previously, in solution, paths were represented as 1s, but I have updated it to use 0s to align with the standard convention where 0s represent paths and 1s represent walls.
  1. Updated the return type to 'solution maze' if a path exists; otherwise, it returns 'None'.
  • Add an algorithm?
  • Fix a bug or typo in an existing algorithm?
  • Documentation change?

Checklist:

  • I have read CONTRIBUTING.md.
  • This pull request is all my own work -- I have not plagiarized.
  • I know that pull requests will not be merged if they fail the automated tests.
  • This PR only changes one algorithm file. To ease review, please open separate PRs for separate algorithms.
  • All new Python files are placed inside an existing directory.
  • All filenames are in all lowercase characters with no spaces or dashes.
  • All functions and variable names follow Python naming conventions.
  • All function parameters and return values are annotated with Python type hints.
  • All functions have doctests that pass the automated testing.
  • All new algorithms include at least one URL that points to Wikipedia or another similar explanation.
  • If this pull request resolves one or more open issues then the description above includes the issue number(s) with a closing keyword: "Fixes #ISSUE-NUMBER".

@algorithms-keeperalgorithms-keeperBot added enhancement This PR modified some existing files awaiting reviews This PR is ready to be reviewed labels Sep 30, 2023
Comment threadbacktracking/rat_in_maze.py Outdated
source_column: int,
destination_row: int,
destination_column: int,
) -> list[list[int]] | None:

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Returning two different datatypes pushes work on the caller. Please consider raising an exception if there is no solution.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See my remark in the general discussion of this Pull Request.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
) ->list[list[int]]|None:
) ->list[list[int]]:

@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

@cclauss Is there something I'm missing?

@dlesnoff

dlesnoff commented Oct 3, 2023

Copy link
Copy Markdown

Ok so @Muhammadummerr old pull request was reopened here.

@cclauss Is there something I'm missing?

Returning two different datatypes pushes work on the caller. Please consider raising an exception if there is no solution.

@cclaus If an exception is raised, the caller still has to wrap each function call in a try-except clause and catch the correct exception. In Nim, I would use an Option type (the equivalent of Result type in Rust, I guess?).
Maybe in Python, the closest to an Option type would be a dataclass with a list[list[int]] attribute and a boolean flag?
The caller would have to check for the boolean flag before accessing the maze, but at least the program would not crash in that case.
Exceptions are frequent in other Python Algorithm snippets, but they are often used for a bad user input. Here, the None type is a frequent and expected output of the algorithm.

@cclauss

Copy link
Copy Markdown
Member

It is very true that Nim and Rust have cooler ways of dealing with exception states that Python does but raising Exceptions are quite Pythonic and are preferred to multiple different datatypes.

@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

Okay,Based on my understanding of your request, the program should return both the solution maze and a flag.
1.If the flag's value is one, it will indicate that a solution exists, and the path in the solution maze will be represented by 0s.
2.If the flag is 0, it means that a solution was not found, and the solution maze will consist of only 1s.

@cclauss

Copy link
Copy Markdown
Member

No. The function should return a solution if there is one and raise an ValueError if there is no solution.

@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

I have made these changes.

@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

Okay, my mistake. I need to make some more changes. Thanks.

@dlesnoff

dlesnoff commented Oct 4, 2023

Copy link
Copy Markdown

Do we really care about changing the initial and destination cells in the maze?

I do not really see the benefit of it and it just makes the implementation harder to read and understand.

Comment threadbacktracking/rat_in_maze.py Outdated
[0, 0, 0, 0, 1]
True
>>> solve_maze(maze,0,0,len(maze)-1,len(maze)-1)
[[0, 1, 1, 1, 1], [0, 0, 0, 0, 1], [1, 1, 1, 0, 1],\

@dlesnoffdlesnoffOct 4, 2023

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is the output on the same line now? It makes reading the solution harder.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

https://docs.python.org/3/library/doctest.html#doctest.NORMALIZE_WHITESPACE will allow you to have doctests that ignore the whitespace so the matrix can look like a matrix.

@algorithms-keeperalgorithms-keeperBot added the tests are failing Do not merge until tests pass label Oct 4, 2023
@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

All Test case are passed on my device but failing in build check.

@cclauss

Copy link
Copy Markdown
Member

Looking better!

@cclauss

Copy link
Copy Markdown
Member

________________ [doctest] backtracking.rat_in_maze.solve_maze _________________
028 aiming to reach a destination cell.
029 The maze consists of walls (1s) and open paths (0s).
030 By providing custom row and column values, the source and destination
031 cells can be adjusted.
032 >>> maze = [[0, 1, 0, 1, 1],
033 ... [0, 0, 0, 0, 0],
034 ... [1, 0, 1, 0, 1],
035 ... [0, 0, 1, 0, 0],
036 ... [1, 0, 0, 1, 0]]
037 >>> solve_maze(maze,0,0,len(maze)-1,len(maze)-1)
Expected:
[[0, 1, 1, 1, 1],
[0, 0, 0, 0, 1],
[1, 1, 1, 0, 1],
[1, 1, 1, 0, 0],
[1, 1, 1, 1, 0]]
Got:
[[0, 1, 1, 1, 1], [0, 0, 0, 0, 1], [1, 1, 1, 0, 1], [1, 1, 1, 0, 0], [1, 1, 1, 1, 0]]

/home/runner/work/Python/Python/backtracking/rat_in_maze.py:37: DocTestFailure

@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

________________ [doctest] backtracking.rat_in_maze.solve_maze _________________ 028 aiming to reach a destination cell. 029 The maze consists of walls (1s) and open paths (0s). 030 By providing custom row and column values, the source and destination 031 cells can be adjusted. 032 >>> maze = [[0, 1, 0, 1, 1], 033 ... [0, 0, 0, 0, 0], 034 ... [1, 0, 1, 0, 1], 035 ... [0, 0, 1, 0, 0], 036 ... [1, 0, 0, 1, 0]] 037 >>> solve_maze(maze,0,0,len(maze)-1,len(maze)-1) Expected: [[0, 1, 1, 1, 1], [0, 0, 0, 0, 1], [1, 1, 1, 0, 1], [1, 1, 1, 0, 0], [1, 1, 1, 1, 0]] Got: [[0, 1, 1, 1, 1], [0, 0, 0, 0, 1], [1, 1, 1, 0, 1], [1, 1, 1, 0, 0], [1, 1, 1, 1, 0]]

/home/runner/work/Python/Python/backtracking/rat_in_maze.py:37: DocTestFailure

This same test case passed on my local device because I used (optionflags=doctest.NORMALIZE_WHITESPACE), so why is it failing here?

@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

Do we really care about changing the initial and destination cells in the maze?

I do not really see the benefit of it and it just makes the implementation harder to read and understand.

I guess; it would be more helpful for understanding to run the program with different source and destination points to find the path.

@algorithms-keeperalgorithms-keeperBot removed the tests are failing Do not merge until tests pass label Oct 4, 2023
@Muhammadummerr

Copy link
Copy Markdown
ContributorAuthor

Does this program require any further changes, or is it okay as it is?

Comment threadbacktracking/rat_in_maze.py Outdated
Comment threadbacktracking/rat_in_maze.py Outdated
Comment threadbacktracking/rat_in_maze.py Outdated
Comment threadbacktracking/rat_in_maze.py Outdated
import doctest

doctest.testmod()
doctest.testmod(optionflags=doctest.NORMALIZE_WHITESPACE)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does this work?!?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does this work?!?

Yes, it's working on my local machine, but it's not working on the build test. That's why I added '# doctest: +NORMALIZE_WHITESPACE' to each test.

@algorithms-keeperalgorithms-keeperBot removed the awaiting reviews This PR is ready to be reviewed label Oct 4, 2023
@algorithms-keeperalgorithms-keeperBot added the awaiting reviews This PR is ready to be reviewed label Oct 4, 2023
@cclauss
cclauss merged commit c16d2f8 into TheAlgorithms:masterOct 4, 2023
@algorithms-keeperalgorithms-keeperBot removed the awaiting reviews This PR is ready to be reviewed label Oct 4, 2023
@isidroasisidroas mentioned this pull request Jan 25, 2025
14 tasks
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancementThis PR modified some existing files

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Backtracking/Rat Maze

3 participants

@Muhammadummerr@dlesnoff@cclauss