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.

Mexico 86
Panini-voetbalstickers van enkele spelers die deel uitmaakten van "de rode duivels", de Belgische ploeg die deelnam aan het WK voetbal van 1986 in Mexico.

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.

Opgave

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:

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.

Voorbeeld

>>> 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