diff options
Diffstat (limited to 'challenge-287/sgreen/python')
| -rwxr-xr-x | challenge-287/sgreen/python/ch-1.py | 46 | ||||
| -rwxr-xr-x | challenge-287/sgreen/python/ch-2.py | 25 | ||||
| -rwxr-xr-x | challenge-287/sgreen/python/test.py | 27 |
3 files changed, 98 insertions, 0 deletions
diff --git a/challenge-287/sgreen/python/ch-1.py b/challenge-287/sgreen/python/ch-1.py new file mode 100755 index 0000000000..54a595cdc6 --- /dev/null +++ b/challenge-287/sgreen/python/ch-1.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python3 + +import re +import sys + + +def strong_password(password: str) -> int: + """The minimum number of steps required to make the given string very strong password. + + Args: + password (str): The supplied password. + + Returns: + int: The minimum number of steps required. + """ + + # Count consecutive characters + cons_count = 0 + for c in re.findall(r'((.)\2{2,})', password): + # For every 3 consecutive characters, we need to replace one + cons_count += len(c[0]) // 3 + + # Additional characters require to make it at least 6 characters + char_count = max(0, 6 - len(password)) + + # Count the number of missing character types + type_count = 0 + if not re.search(r'[a-z]', password): + type_count += 1 + if not re.search(r'[A-Z]', password): + type_count += 1 + if not re.search(r'[0-9]', password): + type_count += 1 + + # Since the type change can be covered by one of the other required + # changes, return the maximum of the two + return max(cons_count + char_count, type_count) + + +def main(): + result = strong_password(sys.argv[1]) + print(result) + + +if __name__ == '__main__': + main() diff --git a/challenge-287/sgreen/python/ch-2.py b/challenge-287/sgreen/python/ch-2.py new file mode 100755 index 0000000000..87059a0873 --- /dev/null +++ b/challenge-287/sgreen/python/ch-2.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python3 + +import re +import sys + + +def valid_number(s: str) -> bool: + """Check if the given string is a valid number. + + Args: + s (str): The supplied string. + + Returns: + bool: True if the string is a valid number, False otherwise. + """ + return bool(re.search(r'^[+-]?([0-9]+\.?[0-9]*|\.[0-9]+)([eE][+-]?[0-9]+)?$', s)) + + +def main(): + result = valid_number(sys.argv[1]) + print('true' if result else 'false') + + +if __name__ == '__main__': + main() diff --git a/challenge-287/sgreen/python/test.py b/challenge-287/sgreen/python/test.py new file mode 100755 index 0000000000..33582047ac --- /dev/null +++ b/challenge-287/sgreen/python/test.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python3 + +import unittest +ch_1 = __import__('ch-1') +ch_2 = __import__('ch-2') + + +class TestClass(unittest.TestCase): + def test_ch_1(self): + self.assertEqual(ch_1.strong_password('a'), 5) + self.assertEqual(ch_1.strong_password('aB2'), 3) + self.assertEqual(ch_1.strong_password('PaaSW0rd'), 0) + self.assertEqual(ch_1.strong_password('Paaasw0rd'), 1) + self.assertEqual(ch_1.strong_password('aaaaa'), 2) + + def test_ch_2(self): + self.assertTrue(ch_2.valid_number('1')) + self.assertFalse(ch_2.valid_number('a')) + self.assertFalse(ch_2.valid_number('.')) + self.assertFalse(ch_2.valid_number('1.2e4.2')) + self.assertTrue(ch_2.valid_number('-1')) + self.assertTrue(ch_2.valid_number('+1E-8')) + self.assertTrue(ch_2.valid_number('.44')) + + +if __name__ == '__main__': + unittest.main() |
