Maak een reeks van de eerste $$2n$$ positieve natuurlijke getallen, waarbij $$n \in \mathbb{N}_0$$.
1, 2, 3, 4, 5, 6, 7, 8
Splits deze getallen willekeurig over twee groepen van $$n$$ getallen, waarbij de helft van de getallen in de eerste groep gaat en de andere helft in de tweede groep.
7, 1, 6, 4 2, 8, 5, 3
Rangschik de getallen van de eerste groep in oplopende volgorde, en de getallen van de tweede groep in dalende volgorde.
1, 4, 6, 7 8, 5, 3, 2
Als je nu de som berekent van de absolute waarden van het verschil van elk paar getallen op corresponderende posities in de twee groepen, dan is die som altijd gelijk aan $$n^2$$. \[|1 - 8| + |4 - 5| + |6 - 3| + |7 - 2| = 7 + 1 + 3 + 5 = 16 = n^2\] Deze gelijkheid werd aangetoond door Vyacheslav Proizvolov.
In deze opgave stellen we een groep getallen voor als een tuple van integers. Gevraagd wordt:
Schrijf een functie splitsen waaraan een even getal $$n \in \mathbb{N}_0$$ moet doorgegeven worden. Indien het getal niet aan deze voorwaarden voldoet, dan moet de functie een AssertionError opwerpen met de boodschap ongeldige lengte. De functie heeft ook nog een tweede optionele parameter verschillend waaraan een Booleaanse waarde kan doorgegeven worden (standaardwaarde: True). De functie moet een tuple teruggeven dat twee groepen van $$\frac{n}{2}$$ natuurlijke getallen uit het interval $$[1, n]$$ bevat. Indien aan de parameter verschillend de waarde True wordt doorgegeven, dan moet bovendien gelden dat alle getallen uit de twee groepen verschillend zijn.
Schrijf een functie optellen waaraan twee groepen getallen moeten doorgegeven worden. Indien deze twee groepen niet evenveel getallen bevatten, dan moet de functie een AssertionError opwerpen met de boodschap groepen moeten even lang zijn. Anders moet de functie som van de absolute waarden van het verschil van elk paar getallen op corresponderende posities in de twee groepen teruggeven, nadat de getallen van de eerste groep in oplopende volgorde en die van de tweede groep in dalende volgorde gerangschikt zijn.
>>> splitsen(8)
((7, 1, 6, 4), (2, 8, 5, 3))
>>> splitsen(8, verschillend=False)
((4, 4, 7, 3), (7, 1, 2, 3))
>>> splitsen(3)
Traceback (most recent call last):
AssertionError: ongeldige lengte
>>> splitsen(-3, verschillend=True)
Traceback (most recent call last):
AssertionError: ongeldige lengte
>>> optellen((7, 1, 6, 4), (2, 8, 5, 3))
16
>>> optellen((4, 4, 7, 3), (7, 1, 2, 3))
13
>>> optellen((8, 3, 15), (27, 24, 5, 42))
Traceback (most recent call last):
AssertionError: groepen moeten even lang zijn