diff --git a/exercise/python/day00/main.py b/exercise/python/day00/main.py new file mode 100644 index 000000000..0d1167f5d --- /dev/null +++ b/exercise/python/day00/main.py @@ -0,0 +1,8 @@ +from exercise.python.day00.encryption_email.encryption import Encryption +from exercise.python.day00.tests.utils import load_file, convert_key, convert_iv + +if __name__ == '__main__': + contents = load_file("EncryptedEmail.txt") + key = convert_key('Advent Of Craft') + iv = convert_iv('2024') + print(Encryption(key, iv).decrypt(contents)) diff --git a/exercise/python/day05/eid.py b/exercise/python/day05/eid.py new file mode 100644 index 000000000..c2836ef30 --- /dev/null +++ b/exercise/python/day05/eid.py @@ -0,0 +1,38 @@ +from enum import Enum + +MIN_SN = 1 +MAX_SN = 999 + + +class ElvenSex(Enum): + SLOUBI = "SLOUBI" + GAGNA = "GAGNA" + CATACT = "CATACT" + + +class Eid: + @staticmethod + def generate(sex: ElvenSex, sn: int, birth_year: int) -> str: + prefix = Eid.format_sex(sex) + Eid.format_birth_year(birth_year) + Eid.validate_and_format(sn) + control_key = Eid.format_control_key(prefix) + return prefix + control_key + + @staticmethod + def format_sex(sex: ElvenSex) -> str: + if type(sex) != ElvenSex: + raise ValueError(f"sex {sex} is not an ElvenSex") + return {ElvenSex.SLOUBI: "1", ElvenSex.GAGNA: "2", ElvenSex.CATACT: "3"}[sex] + + @staticmethod + def format_birth_year(birth_year: int): + return "{:02d}".format(birth_year % 100) + + @staticmethod + def validate_and_format(sn: int) -> str: + if sn < MIN_SN or sn > MAX_SN: + raise ValueError(f"sn {sn} is out of range [{MIN_SN}, {MAX_SN}]") + return "{:03d}".format(sn) + + @staticmethod + def format_control_key(prefix: str) -> str: + return "{:02d}".format(97 - (int(prefix) % 97)) diff --git a/exercise/python/day05/tests/test_eid.py b/exercise/python/day05/tests/test_eid.py index f63a47929..4e7f7f2d4 100644 --- a/exercise/python/day05/tests/test_eid.py +++ b/exercise/python/day05/tests/test_eid.py @@ -2,10 +2,74 @@ from assertpy import assert_that +from eid import Eid, ElvenSex + class EIDTest(unittest.TestCase): - def test_eid(self): - assert_that(42).is_equal_to("Universe") + + def generate_and_check_eid(self, *args, **kwargs): + eid = Eid.generate(*args, **kwargs) + assert_that(eid).is_length(8) + try: + int(eid) + except ValueError: + raise AssertionError(f"eid {eid} is not an number") + return eid + + def test_eid_sloubi(self): + eid = self.generate_and_check_eid(ElvenSex.SLOUBI, birth_year=0, sn=1) + assert_that(eid).starts_with("1") + + def test_eid_gagna(self): + eid = self.generate_and_check_eid(ElvenSex.GAGNA, birth_year=0, sn=1) + assert_that(eid).starts_with("2") + + def test_eid_catact(self): + eid = self.generate_and_check_eid(ElvenSex.CATACT, birth_year=0, sn=1) + assert_that(eid).starts_with("3") + + def test_eid_sex_must_be_elven_sex(self): + with self.assertRaises(ValueError): + self.generate_and_check_eid(sex="MALE", birth_year=0, sn=1) + + def test_eid_birthyear(self): + eid = self.generate_and_check_eid(ElvenSex.SLOUBI, birth_year=1950, sn=1) + assert_that(eid[1:3]).is_equal_to("50") + + def test_eid_birthyear_has_leading_zero(self): + eid = self.generate_and_check_eid(ElvenSex.SLOUBI, birth_year=1, sn=1) + assert_that(eid[1:3]).is_equal_to("01") + + def test_eid_sn(self): + eid = self.generate_and_check_eid(ElvenSex.SLOUBI, birth_year=1, sn=123) + assert_that(eid[3:6]).is_equal_to("123") + + def test_eid_sn_has_leading_zero(self): + eid = self.generate_and_check_eid(ElvenSex.SLOUBI, birth_year=1, sn=5) + assert_that(eid[3:6]).is_equal_to("005") + + def test_eid_cannot_be_out_of_bound(self): + with self.assertRaises(ValueError): + self.generate_and_check_eid(ElvenSex.SLOUBI, birth_year=1, sn=1000) + with self.assertRaises(ValueError): + self.generate_and_check_eid(ElvenSex.SLOUBI, birth_year=1, sn=0) + + @staticmethod + def check_eid_control_key_match_first_6_digits(eid): + prefix = eid[:6] + control_key = eid[6:] + assert_that((int(prefix) + int(control_key)) % 97).is_equal_to(0) + + def test_eid_control_key(self): + for birth_year in range(100): + eid = self.generate_and_check_eid(sex=ElvenSex.SLOUBI, birth_year=birth_year, sn=1) + self.check_eid_control_key_match_first_6_digits(eid) + for sn in range(1, 999): + eid = self.generate_and_check_eid(sex=ElvenSex.SLOUBI, birth_year=1, sn=sn) + self.check_eid_control_key_match_first_6_digits(eid) + for sex in ElvenSex: + eid = self.generate_and_check_eid(sex=sex, birth_year=1, sn=1) + self.check_eid_control_key_match_first_6_digits(eid) if __name__ == "__main__":