Skip to content

Commit

Permalink
Merge pull request #15 from MIT-Emerging-Talent/add-palindrome-check
Browse files Browse the repository at this point in the history
Add palindrome check
  • Loading branch information
oleksandr-maksymikhin authored Jan 6, 2025
2 parents 9f936eb + a56cf01 commit d4a8345
Show file tree
Hide file tree
Showing 6 changed files with 160 additions and 4 deletions.
4 changes: 2 additions & 2 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -119,8 +119,8 @@
"editor.defaultFormatter": "charliermarsh.ruff",
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"source.fixAll.ruff": true,
"source.organizeImports.ruff": true
"source.fixAll.ruff": "explicit",
"source.organizeImports.ruff": "explicit"
}
}
}
20 changes: 20 additions & 0 deletions solutions/README.md
Original file line number Diff line number Diff line change
@@ -1 +1,21 @@
# Solutions

## Palindrome Checker

This module checks if a given string is a palindrome. A palindrome reads the same backward as forward, ignoring case and spaces.

### How to Use

1. Run the `is_palindrome.py` file to use the function.
2. Use `test_is_palindrome.py` to test the functionality.

#### Examples

```python
>>> from is_palindrome import is_palindrome
>>> is_palindrome("level")
True
>>> is_palindrome("hello")
False
>>> is_palindrome("A man a plan a canal Panama")
True
1 change: 0 additions & 1 deletion solutions/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +0,0 @@

53 changes: 53 additions & 0 deletions solutions/is_palindrome.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
A module for checking if a string is a palindrome.
Module contents:
- is_palindrome: Checks if a given string is a palindrome.
Created on 2024-12-30
Author: Emre Biyik
"""


def is_palindrome(text: str) -> bool:
"""Checks if a string is a palindrome.
A palindrome is a word, phrase, or sequence that reads the same backward as forward, ignoring case and spaces.
Parameters:
text: str, the input string to check.
Returns -> bool: True if the input is a palindrome, False otherwise.
Raises:
AssertionError: if input is not a string.
Examples:
>>> is_palindrome("level")
True
>>> is_palindrome("hello")
False
>>> is_palindrome("A man a plan a canal Panama")
True
>>> is_palindrome("$+$")
True
>>> is_palindrome("$+#")
False
"""
# Ensure the input is of type string to avoid unexpected errors.
assert isinstance(text, str), "Input must be a string"

# Normalize the text: remove spaces and convert to lowercase
normalized = "".join([char.lower() for char in text if not char.isspace()])

# Check if the string is the same when reversed
return normalized == normalized[::-1]


if __name__ == "__main__":
# Example cases to test functionality
print(is_palindrome("$+$")) # Should return True
print(is_palindrome("$+#")) # Should return False
print(is_palindrome("A man a plan a canal Panama")) # Should return True
1 change: 0 additions & 1 deletion solutions/tests/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +0,0 @@

85 changes: 85 additions & 0 deletions solutions/tests/test_is_palindrome.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Unit tests for the is_palindrome function.
This module contains test cases for the is_palindrome function,
which checks if a string is a palindrome. The tests cover:
- Empty strings
- Single-character strings
- Palindromes with lowercase, mixed-case, and spaces
- Palindromes containing numbers
- Palindromes containing special characters
- Non-palindromes
Created on 2024-12-30
Author: Emre Biyik
"""

import unittest
from solutions.is_palindrome import is_palindrome


class TestIsPalindrome(unittest.TestCase):
"""Test the is_palindrome function."""

def test_empty_string(self):
"""It should return True for an empty string."""
self.assertTrue(is_palindrome(""))

def test_single_character(self):
"""It should return True for single character strings."""
self.assertTrue(is_palindrome("a"))

def test_level_palindrome(self):
"""It should return True for the palindrome 'level'."""
self.assertTrue(is_palindrome("level"))

def test_radar_palindrome(self):
"""It should return True for the palindrome 'radar'."""
self.assertTrue(is_palindrome("radar"))

def test_hello_is_not_palindrome(self):
"""It should return False for the non-palindrome 'hello'."""
self.assertFalse(is_palindrome("hello"))

def test_world_is_not_palindrome(self):
"""It should return False for the non-palindrome 'world'."""
self.assertFalse(is_palindrome("world"))

def test_mixed_case_palindromes_return_true(self):
"""It should return True for palindromes with mixed lower-case and upper-case characters."""
self.assertTrue(is_palindrome("RaceCar"))

def test_palindromes_with_spaces_return_true(self):
"""It should return True for palindromes with spaces and mixed cases."""
self.assertTrue(is_palindrome("A man a plan a canal Panama"))

def test_palindrome_with_numbers_returns_true(self):
"""It should return True for palindromes containing numbers."""
self.assertTrue(is_palindrome("12321"))

def test_non_palindrome_numbers_return_false(self):
"""It should return False for non-palindrome numbers."""
self.assertFalse(is_palindrome("12345"))

def test_palindrome_with_special_characters_returns_true(self):
"""It should return True for palindromes with special characters."""
self.assertTrue(is_palindrome("!@#$%^&*()_+_)(*&^%$#@!"))

def test_non_palindrome_with_special_characters_returns_false(self):
"""It should return False for non-palindromes with special characters."""
self.assertFalse(is_palindrome("hello!"))

def test_special_characters_palindrome_positive(self):
"""It should return True for special character palindrome."""
self.assertTrue(is_palindrome("$+$")) # Palindrome

def test_special_characters_palindrome_negative(self):
"""It should return False for non-palindrome special characters."""
self.assertFalse(is_palindrome("$+#")) # Non-palindrome


if __name__ == "__main__":
unittest.main()

0 comments on commit d4a8345

Please sign in to comment.