Skip to content

Ενδεικτική λύση εργαστηριακής άσκησης 1 2024-2025

Ερώτημα 1

erotima1.py
import random
import re

random.seed(2025)


def generate_random_text(n):
    greek_lowercase = "ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ"
    greek_uppercase = greek_lowercase.lower()
    digits = "0123456789"
    all_chars = greek_lowercase + greek_uppercase + digits
    random_text = "".join(random.choice(all_chars) for _ in range(n))
    return random_text


def inject_multiplications(txt, n):
    assert len(txt) >= 20, "the text's length must be at least 20 characters"
    for _ in range(n):
        x = random.randint(0, 99)
        y = random.randint(0, 99)
        to_be_injected = f"ΠΟΛΛΑΠΛΑΣΙΑΣΕ({x},{y})"
        pos = random.randint(0, len(txt) - len(to_be_injected))
        # print(f"{to_be_injected} εισαγωγή στη θέση {pos}")
        txt = txt[:pos] + to_be_injected + txt[pos + len(to_be_injected) :]
    return txt


def compute(txt):
    results = re.findall(r"ΠΟΛΛΑΠΛΑΣΙΑΣΕ\((\d{1,2}),(\d{1,2})\)", txt)
    total = 0
    for x in results:
        total += int(x[0]) * int(x[1])
    return total


def scenario1():
    txt = generate_random_text(100)
    print(txt)

    print("#" * 80)
    txt2 = inject_multiplications(txt, 3)
    print(txt2)

    result = compute(txt2)
    print("Αποτέλεσμα = ", result)


def scenario2():
    txt = generate_random_text(50_000)

    txt2 = inject_multiplications(txt, 500)
    with open("test_multiplications1.txt", "w") as f:
        f.write(txt2)

    result = compute(txt2)
    print("Αποτέλεσμα = ", result)


if __name__ == "__main__":
    scenario1()
    # scenario2()
$ python erotima1.py
μΖσ5ηΜκΑΩανΟΕαβΗΓΘ1ΞαΗγΔπΒμιΕ19Ν1ΝΒχΟ22ρβζΨκΒοΘλΝΞΘΠοΓΘ2ΙμΩΖξζ0Σε4νΜ4ψΦκελ33ζβφΕ0ωνδσ9ξΒ0Χ6π5ΠΨΟλκοΥ
################################################################################
μΖσ5ηΜκΑΩΠΟΛΛΑΠΛΑΣΙΑΣΕ(37,46)19Ν1ΝΒΠΟΛΛΑΠΛΑΣΙΑΣΕ(71,18)(20,35)0Σε4νΜ4ψΦκελ33ζβφΕ0ωνδσ9ξΒ0Χ6π5ΠΨΟλκοΥ
Αποτέλεσμα =  2980

Ερώτημα 2

erotima2.py
from erotima1 import compute
import unittest


class TestErotima1(unittest.TestCase):
    def test1(self):
        test_cases = [
            ("ΩΩΩΩΩΩΩΩΩΩΩΩΩΩΩΩΩΩΩΩ", 0),
            ("ΠΟΛΛΑΠΛΑΣΙΑΣΕ(10,10)", 100),
            ("ΠΟΛΛΑΠΛΑΣΙΑΣΕ(10,10)ΠΟΛΛΑΠΛΑΣΙΑΣΕ(1,2)", 102),
            ("ΠΟΛΛΑΠΛΑΣΙΑΣΕ(10ΠΟΛΛΑΠΛΑΣΙΑΣΕ(1,2)ΧΧΧΧ", 2),
            (
                "μΖσ5ηΜκΑΩΠΟΛΛΑΠΛΑΣΙΑΣΕ(37,46)19Ν1ΝΒΠΟΛΛΑΠΛΑΣΙΑΣΕ(71,18)(20,35)0Σε4νΜ4ψΦκελ33ζβφΕ0ωνδσ9ξΒ0Χ6π5ΠΨΟλκοΥ",
                2980,
            ),
        ]
        for txt, result in test_cases:
            self.assertEqual(compute(txt), result)

    def test2(self):
        with open("test_multiplications1.txt", "r") as f:
            txt = f.read()
            self.assertEqual(compute(txt), 1035105)


if __name__ == "__main__":
    unittest.main()
$ python erotima2.py
..
----------------------------------------------------------------------
Ran 2 tests in 0.001s

OK

Ερώτημα 3

erotima3.py
from erotima1 import generate_random_text, inject_multiplications, compute
import time
import platform


def systeminfo():
    my_system = platform.uname()
    print(f"System: {my_system.system}")
    print(f"Node Name: {my_system.node}")
    print(f"Release: {my_system.release}")
    print(f"Version: {my_system.version}")
    print(f"Machine: {my_system.machine}")
    print(f"Processor: {my_system.processor}")


if __name__ == "__main__":
    systeminfo()
    n = 1_000_000
    m = 100_000
    start_time = time.time()
    txt = generate_random_text(n)
    end_time = time.time()
    print(f"ΧΡΟΝΟΣ ΔΗΜΙΟΥΡΓΙΑΣ ΑΡΧΙΚΟΥ ΚΕΙΜΕΝΟΥ {n} ΧΑΡΑΚΤΗΡΩΝ: {end_time - start_time:.2f} δευτερόλεπτα")

    start_time = time.time()
    txt = inject_multiplications(txt, m)
    end_time = time.time()
    print(
        f"ΧΡΟΝΟΣ ΕΙΣΑΓΩΓΗΣ {m} ΠΟΛΛΑΠΛΑΣΙΑΣΜΩΝ: {end_time - start_time:.2f} δευτερόλεπτα"
    )

    start_time = time.time()
    total = compute(txt)
    end_time = time.time()
    print(f"ΧΡΟΝΟΣ ΥΠΟΛΟΓΙΣΜΟΥ ΑΘΡΟΙΣΜΑΤΟΣ ΓΙΝΟΜΕΝΩΝ: {end_time - start_time:.2f} δευτερόλεπτα")

    print(f"ΣΥΝΟΛΙΚΟ ΑΘΡΟΙΣΜΑ ΓΙΝΟΜΕΝΩΝ = {total:,}")
$ python erotima3.py
System: Darwin
ΧΡΟΝΟΣ ΔΗΜΙΟΥΡΓΙΑΣ ΑΡΧΙΚΟΥ ΚΕΙΜΕΝΟΥ 1000000 ΧΑΡΑΚΤΗΡΩΝ: 0.25 δευτερόλεπτα
ΧΡΟΝΟΣ ΕΙΣΑΓΩΓΗΣ 100000 ΠΟΛΛΑΠΛΑΣΙΑΣΜΩΝ: 26.27 δευτερόλεπτα
ΧΡΟΝΟΣ ΥΠΟΛΟΓΙΣΜΟΥ ΑΘΡΟΙΣΜΑΤΟΣ ΓΙΝΟΜΕΝΩΝ: 0.01 δευτερόλεπτα
ΣΥΝΟΛΙΚΟ ΑΘΡΟΙΣΜΑ ΓΙΝΟΜΕΝΩΝ = 61,453,426