Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add palindrome check #15

Merged
merged 8 commits into from
Jan 6, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
oleksandr-maksymikhin marked this conversation as resolved.
Show resolved Hide resolved
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
oleksandr-maksymikhin marked this conversation as resolved.
Show resolved Hide resolved
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
oleksandr-maksymikhin marked this conversation as resolved.
Show resolved Hide resolved
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()
Loading