Heb je je ook al eens bedrogen gevoeld bij een "3+1 gratis" actie? Dat winkels hiermee uitpakken en daarbij in de kleine lettertjes schrijven dat je voor elke aankoop van vier producten de goedkoopste gratis krijgt, tot daar aan toe. Waar klanten vooral problemen mee hebben, is dat sommige winkels dit in hun voordeel laten uitdraaien op het ogenblik dat een klant meer dan vier producten aankoopt. Voor "3 + 1 gratis" durven winkels hun kassasysteem vaak zó programmeren dat een klant die $$n$$ producten aankoopt, daarvan de goedkoopste $$\lfloor\frac{n}{4}\rfloor$$ producten gratis krijgt. Hierbij is $$\lfloor x\rfloor$$ het grootste gehele getal dat niet groter is dan $$x \in \mathbb{R}$$.
Als klanten eenmaal betaald hebben, beseffen ze achteraf pas dat ze er profijt zouden aan gedaan hebben als ze verschillende keren langs de kassa gepasseerd hadden. Ze zouden immers de gekochte producten kunnen rangschikken van het duurste naar het goedkoopste product, en dan telkens met vier producten langs de kassa passeren. De eerste keer met de vier duurste producten (waarvan ze de goedkoopste gratis krijgen), een tweede keer met de volgende vier duurste producten, enzoverder. Als het aantal aangekochte producten geen veelvoud is van vier, dan zullen ze een laatste keer langs de kassa moeten passeren met minder dan vier producten, en daarbij dus geen product gratis krijgen.
Stel dat je een aantal producten gekocht hebt in een winkel waar een "3+1 gratis" loopt, en waar het kassasysteem in het voordeel van de winkel geprogrammeerd is op een manier zoals omschreven in de inleiding van deze opgave. Je opdracht bestaat erin te bepalen hoeveel winst je zou maken als je niet alle producten in één keer betaalt, maar meerdere keren langs de kassa passeert om telkens het goedkoopste product van een groep van maximaal vier producten gratis te krijgen. Hiervoor moet je vier functies schrijven waaraan telkens een reeks (list of tuple) met $$n \in \mathbb{N}_0$$ reële getallen (float) moet doorgegeven worden. Deze getallen stellen de prijzen van de aangekochte producten voor.
Schrijf een functie samen die het totaalbedrag (float) teruggeeft dat je zal moeten betalen als je slechts één keer langs de kassa passeert om de gegeven reeks producten samen aan te kopen.
Schrijf een functie groeperen die een lijst (list) van tuples (tuple) teruggeeft, waarbij elk tuple minimaal 1 en maximaal 4 reële getallen (float) bevat die gesorteerd zijn van groot naar klein. Het eerste tuple moet de prijzen van de vier duurste van de reeks aangekochte producten bevatten, het tweede tuple de volgende vier duurste producten, enzoverder. Als het aantal aangekochte producten geen veelvoud is van vier, dan moet het laatste tuple de prijzen van de resterende producten bevatten.
Schrijf een functie gegroepeerd die het totaalbedrag (float) teruggeeft dat je zal moeten betalen als je meerdere keren langs de kassa passeert om de gegeven reeks producten in groepjes van maximaal vier producten aan te kopen, zoals omschreven in de inleiding van deze opgave.
Schrijf een functie winst die de winst (float) teruggeeft die je maakt als je de strategie gebruikt waarbij je meerdere keren langs de kassa passeert, ten opzichte van de prijs die je zou betalen als je slechts één keer langs de kassa zou passeren.
>>> prijzen = [3.23, 5.32, 8.23, 2.23, 9.98, 7.43, 6.43, 8.23, 4.23]
>>> samen(prijzen)
49.85
>>> groeperen(prijzen)
[(9.98, 8.23, 8.23, 7.43), (6.43, 5.32, 4.23, 3.23), (2.23,)]
>>> gegroepeerd(prijzen)
44.65
>>> winst(prijzen)
5.2