Added mrange

This commit is contained in:
ohofmann 2025-03-26 06:03:17 +01:00
parent ecb417eba2
commit a06bd5861d
6 changed files with 57 additions and 30 deletions

View File

@ -3,6 +3,7 @@
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/.venv" />
<excludeFolder url="file://$MODULE_DIR$/venv" />
</content>
<orderEntry type="jdk" jdkName="Python 3.12 (AlgoDatSoSe25)" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" />

View File

@ -1,20 +1,20 @@
from utils.memory_array import MemoryArray
from utils.literal import Literal
from utils.memory_cell import MemoryCell
from utils.constants import MIN_VALUE
from utils.memory_manager import MemoryManager
from utils.memory_range import mrange
def max_sequence_1(z: MemoryArray):
n = len(z)
n = z.length()
m = MemoryCell(MIN_VALUE)
s = MemoryCell()
l = MemoryCell()
r = MemoryCell()
for i in range(n):
for j in range(i, n):
for i in mrange(n):
for j in mrange(i, n):
s.set(0)
for k in range(i, j):
s += z[Literal(k)]
for k in mrange(i, j):
s += z[k]
if s > m:
m.set(s)
l.set(i)
@ -22,11 +22,9 @@ def max_sequence_1(z: MemoryArray):
return m, l, r
def example(max_sequende_func):
z = MemoryArray(Literal(10))
for i, v in enumerate([-59, 52, 46, 14, -50, 58, -87, -77, 34, 15]):
z[Literal(i)] = Literal(v)
m, l, r = max_sequende_func(z)
def example(max_sequence_func):
z = MemoryArray([-59, 52, 46, 14, -50, 58, -87, -77, 34, 15])
m, l, r = max_sequence_func(z)
print(m, l, r)

View File

@ -6,7 +6,16 @@ from random import randint
class MemoryArray:
def __init__(self, size):
def __init__(self, parm):
if isinstance(parm, Literal):
self.init_with_size(parm)
elif isinstance(parm, list):
self.size = len(parm)
self.cells = [MemoryCell(value) for value in parm]
else:
raise ValueError("Invalid parameter type")
def init_with_size(self, size):
"""Initialisiert ein Speicherarray mit einer bestimmten Größe."""
assert isinstance(size, Literal), "Size must be a Literal or MemoryCell"
assert isinstance(size.value, int), "Size must be an int"
@ -45,6 +54,10 @@ class MemoryArray:
"""Gibt eine Liste der Indizes der Speicherzellen zurück."""
return [Literal(i) for i in range(self.size)]
def length(self):
"""Gibt die Größe des Speicherarrays zurück."""
return Literal(self.size)
def reset_counters(self):
"""Setzt alle Zähler auf 0 zurück."""
for cell in self.cells:
@ -85,8 +98,8 @@ if __name__ == "__main__":
for i in a.indices():
a[i] = Literal(random.randint(1,100))
print(a)
sum = MemoryCell(0)
s = MemoryCell(0)
for cell in a.cells:
sum += cell
print(sum)
MemoryManager.print_statistics()
s += cell
print(s)
print(f"Anzahl der Additionen: {MemoryManager.count_adds()}")

View File

@ -53,7 +53,7 @@ class MemoryManager:
def reset():
manager = MemoryManager.get_instance()
for cell in manager.cells:
cell.reset_counters
cell.reset_counters()
@staticmethod
def purge():

24
utils/memory_range.py Normal file
View File

@ -0,0 +1,24 @@
from utils.literal import Literal
# a generator that yields items instead of returning a list
def mrange(parm1, parm2=None, parm3=None):
if parm2 is None:
start = 0
stop = int(parm1)
step = 1
elif parm3 is None:
start = int(parm1)
stop = int(parm2)
step = 1
else:
start = int(parm1)
stop = int(parm2)
step = int(parm3)
num = start
while num < stop:
yield Literal(num)
num += step
if __name__ == "__main__":
for l in mrange(10):
print(l)

View File

@ -22,27 +22,18 @@ class TestMemoryArray(TestCase):
def test_get_item(self):
l = random.randint(5,10)
size = Literal(l)
a = MemoryArray(size)
values = []
for i in a.indices():
v = Literal(random.randint(1,100))
values.append(v.value)
a[i] = v
values = [random.randint(1,100) for _ in range(l)]
a = MemoryArray(values)
for pos, i in enumerate(a.indices()):
self.assertEqual(a[i].value, values[pos])
def test_reset_counters(self):
l = random.randint(5,10)
size = Literal(l)
a = MemoryArray(size)
for i in a.indices():
v = Literal(random.randint(1,100))
a[i] = v
values = [random.randint(1,100) for _ in range(l)]
a = MemoryArray(values)
for i in a.indices():
self.assertEqual(a[i].write_count, 1)
a.reset_counters()
for i in a.indices():
self.assertEqual(a[i].write_count, 0)