Ring der Macht

Aufgabe

Sauron hat in seinem Heer von Untergebenen nur eine begrenzte Menge an Platz. Als Ringliebhaber möchte er diese Untergebenen in einem sogenannten Ringbuffer organisieren.

Untergebene werden in der Reihenfolge des Eintritts in sein Heer gespeichert. Möchte Sauron mal einen Untergebenen loswerden, entfernt er immer den “dienstältesten” (am frühesten in das Heer eingetretenen) Untergebenen zuerst. Möchte Sauron einen neuen Untergebenen in sein Heer aufnehmen, hat aber keinen Platz mehr, wird der älteste untergebene automatisch durch den neuen Untergebenen ersetzt. Sauron möchte außerdem zu jedem Zeitpunkt erfahren können, wie viele Untergebene teil seines Heers sind, und wieviel Platz in seinem Heer ist.

Anforderungen in formal

Du kannst das folgende Template benutzen um deinen Ringbuffer zu Implementieren. Die Tests können dabei Helfen zu überprüfen, ob deine Implementierung korrekt ist. Sie werden mit Ausführung der Datei ausgeführt.

from typing import Any, Optional


class RingBuffer:
    def __init__(self, capacity: int):
      pass

    def __len__(self) -> int:
        raise NotImplementedError

    def push(self, element: Any):
        raise NotImplementedError

    def pop(self) -> Optional[Any]:
        raise NotImplementedError

    def peek(self) -> Optional[Any]:
        raise NotImplementedError


def test():
    # Test normal operation without overwrites
    buffer = RingBuffer(3)
    assert buffer.capacity == 3
    assert len(buffer) == 0
    buffer.push(1)
    buffer.push(3)
    buffer.push(4)
    assert buffer.peek() == 1
    assert len(buffer) == 3
    assert buffer.pop() == 1
    assert buffer.pop() == 3
    assert buffer.pop() == 4
    assert buffer.pop() is None

    # Test operation with overwrites
    buffer.push(10)
    buffer.push(20)
    buffer.push(30)
    buffer.push(40)
    buffer.push(50)
    assert buffer.pop() == 30
    assert buffer.pop() == 40
    assert buffer.pop() == 50
    assert buffer.pop() is None


if __name__ == "__main__":
    test()

Hinweise

Wo sollen Daten gespeichert werden
Woher weiß ich welches das neueste / älteste Element ist?
Wie verfolge ich das neueste / älteste Element über die 'Ränder' meines Speichers hinweg?