diff options
| author | Simon Green <mail@simon.green> | 2024-09-22 17:27:47 +1000 |
|---|---|---|
| committer | Simon Green <mail@simon.green> | 2024-09-22 17:27:47 +1000 |
| commit | 9e99d7529d22b326148431954541f6ffdd76497f (patch) | |
| tree | dc71892d439a9be723f4ae8ef394d12d7a55daaf /challenge-287/sgreen/python | |
| parent | 68e321dd32a834f54b55d5e8924f04358e41cf1f (diff) | |
| download | perlweeklychallenge-club-9e99d7529d22b326148431954541f6ffdd76497f.tar.gz perlweeklychallenge-club-9e99d7529d22b326148431954541f6ffdd76497f.tar.bz2 perlweeklychallenge-club-9e99d7529d22b326148431954541f6ffdd76497f.zip | |
sgreen solutions to challenge 287
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() |
