Panini-voetbalstickers zijn pure nostalgie! Ze worden gemaakt door het Italiaanse bedrijf Panini dat gespecialiseerd is in het maken van verzamelbare stickers. Sinds haar bestaan produceert de firma stickers van onder andere films en computerspelletjes, maar de voetbalstickers zijn altijd veruit het populairst geweest.
Elk panini-album bevat honderden lege plaatsen waarop verschillende stickers moeten geplakt worden. De stickers zijn oplopend genummerd zodat hun positie in het plakboek makkelijk kan teruggevonden worden. Vier of vijf willekeurig gekozen stickers zitten samen in een gesloten verpakking. Op die manier kan men bij aankoop niet kan zien welke stickers men krijgt. Hierdoor wordt het ontzettend moeilijk om een album volledig te vullen, en ontstaat er een verzamelwoede waarbij verzamelaars hun dubbele stickers onderling met elkaar uitwisselen.
Omdat verzamelaars bij het uitwisselen van stickers snel moeten kunnen zien welke stickers ze reeds in hun bezit hebben, gebruiken ze een verkorte notatie om hun collectie te beschrijven. Stel bijvoorbeeld dat een verzamelaar de volgende stickers in zijn bezit heeft
1, 3, 4, 5, 6, 7, 9, 10, 11, 17, 19, 20
dan omschrijft hij zijn collectie met de volgende verkorte notatie.
1, 3-7, 9-11, 17, 19-20
Hierbij worden alle reeksen opeenvolgende natuurlijke getallen afgekort tot het eerste en het laatste getal van de reeks, van elkaar gescheiden door een koppelteken (-). Individuele getallen en reeksen getallen worden in oplopende volgorde opgelijst, en van elkaar gescheiden door een komma (,) en een spatie.
Definieer een klasse Panini waarmee collecties stickers kunnen voorgesteld worden. Elke sticker komt hoogstens één keer in een collectie voor. Deze klasse moet ondersteuning bieden aan de volgende methoden:
Een initialisatiemethode waaraan ofwel een integer (int) moet doorgegeven worden (die het nummer van één enkele sticker voorstelt), ofwel een lijst (list), een tuple (tuple) of een verzameling (set) van integers (int; die de nummers van alle stickers in de collectie voorstellen). Als het argument van de initialisatiemethode niet aan deze voorwaarde voldoet, dan moet de methode een AssertionError opwerpen met de boodschap ongeldige stickers. De integers moeten niet noodzakelijk in oplopende volgorde gerangschikt zijn in de lijst of het tuple dat aan de initialisatiemethode wordt doorgegeven. Als er in de gegeven lijst of het gegeven tuple dubbele stickers zouden voorkomen, dan moeten die maar één keer in de collectie opgenomen worden.
Een methode die toelaat om twee collecties stickers samen te voegen aan de hand van de + operator. Hierbij moeten de twee oorspronkelijke collecties ongewijzigd blijven, maar moet de optelling resulteren in een nieuwe collectie (Panini) waarin de stickers van de oorspronkelijke collecties samengevoegd werden. Deze nieuwe collectie mag geen dubbels bevatten.
Een methode die toelaat om de stickers van één collectie die voorkomen in een andere collectie, uit die collectie te verwijderen aan de hand van de - operator. Hierbij moeten de twee oorspronkelijke collecties ongewijzigd blijven, maar moet de aftrekking resulteren in een nieuwe collectie (Panini) die bestaat uit de stickers van de linkse collectie waaruit de stickers van de rechtse collectie verwijderd werden (als ze in de linkse collectie voorkwamen).
Bovendien moet het mogelijk zijn om met de ingebouwde functies repr en str een stringvoorstelling te genereren van elk object van de klasse Panini. De string die door deze functies wordt teruggegeven, moet de verkorte notatie bevatten van de collectie stickers die door het object worden voorgesteld. Beide functies moeten dus dezelfde stringvoorstelling van een object teruggeven.
>>> collectie1 = Panini([1, 3, 4, 5, 6, 7, 9, 10, 11, 17, 19, 20])
>>> collectie1
1, 3-7, 9-11, 17, 19-20
>>> print(collectie1)
1, 3-7, 9-11, 17, 19-20
>>> collectie2 = Panini(8)
>>> collectie2
8
>>> print(collectie2)
8
>>> collectie3 = collectie1 + collectie2
>>> isinstance(collectie3, Panini)
True
>>> collectie3
1, 3-11, 17, 19-20
>>> collectie4 = collectie1 - Panini((5, 8))
>>> isinstance(collectie4, Panini)
True
>>> collectie4
1, 3-4, 6-7, 9-11, 17, 19-20
>>> collectie1 - Panini({1, 2, 3, 4}) + Panini(list(range(10, 19)))
5-7, 9-20
>>> Panini('spam')
Traceback (most recent call last):
AssertionError: ongeldige stickers
>>> Panini([1, 2, 3.14])
Traceback (most recent call last):
AssertionError: ongeldige stickers