Ενδεικτική λύση εργαστηριακής άσκησης 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