1. Classe Parking (5 punts)

Una empresa ens demana una classe per a gestionar pàrquings. En fer el cobrament, cal saber l’hora d’entrada del cotxe al pàrquing i la plaça que ocupava. Amb la finalitat d’obtenir una implementació senzilla, les places s’identifiquen amb un nombre enter, començant per zero. La classe té dos únics atributs, ambdós públics:

  1. Una primera llista amb les matrícules dels cotxes que hi ha al pàrquing.

  2. Una segona llista amb els instants d’arribada de cada cotxe al pàrquing.

Per tant, les dues llistes tenen longitud fixa, tants elements com places de pàrquing. La posició k-èssima de la primera llista és la matrícula del cotxe que ocupa la plaça k i La posició k-èssima de la segona llista és l’instant d’arribada al pàrquing del vehicle que ocupa la plaça k.

Implementeu la classe Parking i deseu-la al mòdul parkings (fitxer parkings.py) tal com queda especificada:

class parkings.Parking(n)

Crea un pàrquing amb n places, inicialment totes lliures.

Atributs:

matricules

Llista de les matrícules dels cotxes. Cada matrícula és un string. Si la plaça i està lliure, hi haurà un string buit a la posició i-èssima d’aquesta llista.

arribades

Llista amb els instants d’arribada dels cotxes. Cada instant és del tipus datetime.datetime, però si la plaça i està lliure hi haurà el valor None a la posició i-èssima d’aquesta llista.

Mètodes:

aparca(i, m, t)

Enregistra que el cotxe amb matrícula m ha aparcat a la plaça i a l’instant t (una instància de la classe datetime.datetime). En cridar aquest mètode, se suposa que la plaça i-èssima està desocupada i que el cotxe no estava aparcat prèviament al pàrquing. També es compleix que \(0 \leq i \lt len(p)\).

desaparca(i)

Enregistra que el cotxe de matrícula m que ocupava la plaça i-èssima l’ha abandonat. Se suposa que la plaça i-èssima està ocupada en cridar aquest mètode. També es compleix que \(0 \leq i \lt len(p)\).

ocupacio()

Retorna dos enters: el nombre de places ocupades i lliures del pàrquing.

Operacions:

Operació

Resultat

len(p)

Nombre de places del pàrquing p

p[m]

Índex de la plaça que ocupa el cotxe de matrícula m al pàrquing p. Si el cotxe no hi està aparcat, retorna -1.

Exemples d’ús:

>>> from parkings import Parking
>>> from datetime import datetime
>>> p = Parking(5)
>>> p.matricules
['', '', '', '', '']
>>> p.arribades
[None, None, None, None, None]
>>> len(p)
5
>>> p.aparca(2, '9876-MKF', datetime(2025, 5, 11, hour=10, minute=0))
>>> p.aparca(0, '1234-ABC', datetime(2025, 5, 11, hour=10, minute=20))
>>> p.matricules
['1234-ABC', '', '9876-MKF', '', '']
>>> p.arribades[0]
datetime.datetime(2025, 5, 11, 10, 20)
>>> list(map(str, p.arribades))
['2025-05-11 10:20:00', 'None', '2025-05-11 10:00:00', 'None', 'None']
>>> p.ocupacio()
(2, 3)
>>> p.aparca(3, '2126-RRR', datetime(2025, 5, 11, hour=12, minute=12))
>>> p.desaparca(2)
>>> p.ocupacio()
(2, 3)
>>> p.matricules
['1234-ABC', '', '', '2126-RRR', '']
>>> list(map(str, p.arribades))
['2025-05-11 10:20:00', 'None', 'None', '2025-05-11 12:12:00', 'None']
>>> p.aparca(4, '8364-VTL', datetime(2025, 5, 11, hour=13, minute=55))
>>> p.ocupacio()
(3, 2)
>>> p.matricules
['1234-ABC', '', '', '2126-RRR', '8364-VTL']
>>> list(map(str, p.arribades))
['2025-05-11 10:20:00', 'None', 'None', '2025-05-11 12:12:00', '2025-05-11 13:55:00']
>>> p['2126-RRR']
3
>>> p['9876-VTL']
-1
>>> p.desaparca(4)
>>> p.desaparca(0)
>>> p.ocupacio()
(1, 4)

Disposeu de jocs de prova al fitxer tests-parking.txt