Een schaakbord is onderverdeeld in 64 vierkante velden die gerangschikt staan in een $$8 \times 8$$ rooster met 8 rijen en 8 kolommen. De velden worden afwisselend licht en donker gekleurd. Bij een correcte plaatsing van het bord heeft elke speler een licht gekleurd veld in zijn rechter onderhoek. Elke schaakpartij start met onderstaande opstelling van de schaakstukken. We zullen echter de sterkte en de mobiliteit van de verschillende schaakstukken bestuderen zonder dat er andere schaakstukken op het bord staan.

De FIDE-standaard gebruikt de algebraïsche notatie om velden op het schaakbord aan te duiden. Daarbij worden — vanuit het perspectief van wit — de kolommen van links naar rechts gelabeld met de letters a tot en met h, en de rijen van onder naar boven met de cijfers 1 tot en met 8. De positie van een veld wordt dan genoteerd als het kolomlabel gevolgd door het rijlabel (bijvoorbeeld d4 of g2).
Elk schaakstuk kan op een specifieke manier bewegen naar andere velden op het schaakbord. Zo beweegt een paard ofwel één veld horizontaal en twee velden verticaal, ofwel één veld verticaal en twee velden horizontaal. Een paard dat zich centraal op het schaakbord bevindt, kan naar acht mogelijke velden bewegen. Omdat schaakstukken altijd naar andere velden op het schaakbord bewegen, kan een paard mogelijks ook naar minder dan acht velden bewegen als het zich nabij de rand van het schaakbord bevindt. Hieronder zien we bijvoorbeeld dat een paard op veld d4 naar acht andere velden kan bewegen, terwijl een paard op veld g2 maar naar vier andere velden kan bewegen.


Een loper kan uitsluitend in diagonale richting bewegen, maar kan dat wel doen tot aan de rand van het schaakbord. Hieronder zien we bijvoorbeeld dat een loper op veld d4 naar dertien andere velden kan bewegen, terwijl een loper op veld g1 maar naar zeven andere velden kan bewegen.


In onderstaand schaakbord duiden we voor elk veld aan naar hoeveel andere velden een loper op dat veld kan bewegen. De sterkte van een loper bekomen we door al deze getallen in de 64 velden bij elkaar op te tellen: 560.

Alle velden waarop een loper naar evenveel andere velden kan bewegen, vormen een groep. We hebben alle velden van een groep dezelfde kleur gegeven. Staat een loper op een veld langs de rand van het schaakbord (blauwe groep), dan kan hij naar zeven andere velden bewegen. Staat een loper op één van de vier centrumvelden (paarse groep), dan kan hij naar dertien andere velden bewegen.
Een loper heeft vier groepen. Er is een groep (blauw) met 28 velden waar een loper naar 7 andere velden kan bewegen, een groep (roze) met 20 velden waar een loper naar 9 andere velden kan bewegen, een groep (geel) met 12 velden waar een loper naar 11 andere velden kan bewegen, en een groep (paars) met 4 velden waar een loper naar 13 andere velden kan bewegen. Samengevat noteren we deze mobiliteit van een loper als
28 × 7 + 20 × 9 + 12 × 11 + 4 × 13
Daarbij noteren we elke groep als het product van het aantal velden in de groep (linkerlid) en het aantal andere velden waarnaar het schaakstuk op een veld uit de groep kan bewegen (rechterlid). Deze producten worden in stijgende volgorde van hun rechterlid bij elkaar opgeteld. De vermenigvuldiging wordt aangeduid met × en de optelling met +. Elk van deze bewerkingen wordt voorafgegaan en gevolgd door één spatie. Merk op dat we de sterke van een schaakstuk ook bekomen door deze uitdrukking voor de mobiliteit van het schaakstuk uit te rekenen.
We gebruiken twee manieren om een veld op het schaakbord aan te duiden. In eerste instantie als string (str) met twee karakters: het kolomlabel gevolgd door het rijlabel volgens de algebraïsche notatie (bijvoorbeeld d4 of g2). We noemen dit de FIDE-voorstelling van een veld (zie linker schaakbord hieronder).


Alternatief worden de rijen van het schaakbord van boven naar onder genummerd met de cijfers 0 tot en met 7, en worden ook de kolommen van links naar rechts genummerd met de cijfers 0 tot en met 7 (zie rechter schaakbord hierboven). Op die manier kan een veld aangeduid worden met een tuple $$(r, k)$$ dat bestaat uit het rijnummer $$r$$ (int) en het kolomnummer $$k$$ (int). We noemen dit de coördinaten van het veld.
Een richting waarin een schaakstuk op veld $$(r, k)$$ kan bewegen, wordt voorgesteld als een tuple $$(\delta_r, \delta_k)$$ met $$\delta_r, \delta_k \in \mathbb{Z}$$ (int). Daarbij geldt dat $$\delta_r \neq 0$$ of $$\delta_k \neq 0$$. We maken onderscheid tussen richtingen waarin het schaakstuk eenmalig of herhaald kan bewegen:
als het schaakstuk eenmalig in richting $$(\delta_r, \delta_k)$$ kan bewegen, dan kan het enkel naar veld $$(r + \delta_r, k + \delta_k)$$ bewegen als dat binnen het schaakbord ligt
als het schaakstuk herhaald in richting $$(\delta_r, \delta_k)$$ kan bewegen, dan kan het naar alle velden $$(r + i \times \delta_r, k + i \times \delta_k)$$ bewegen die binnen het schaakbord liggen voor $$i = 1, 2, \ldots$$
Een paard kan eenmalig in acht mogelijke richtingen bewegen: $$(1, 2)$$, $$(2, 1)$$, $$(-1, 2)$$, $$(-2, 1)$$, $$(1, -2)$$, $$(2, -1)$$, $$(-1, -2)$$ en $$(-2, -1)$$. Het linker schaakbord hieronder toont dat een paard op veld d4 (coördinaten $$(4, 3)$$) in richting $$(1, 2)$$ kan bewegen naar het veld met coördinaten $$(4 + 1, 3 + 2) = (5, 5)$$. Dit veld ligt binnen het schaakbord en heeft FIDE-voorstelling f3.


Een loper kan herhaald in vier mogelijke richtingen bewegen: $$(1, 1)$$, $$(1, -1)$$, $$(-1, 1)$$ en $$(-1, -1)$$. Het rechter schaakbord hierboven toont dat een loper op veld d4 (coördinaten $$(4, 3)$$) in richting $$(1, 1)$$ kan bewegen naar de velden met coördinaten $$(4 + 1 \times 1, 3 + 1 \times 1) = (5, 4)$$, $$(4 + 2 \times 1, 3 + 2 \times 1) = (6, 5)$$ en $$(4 + 3 \times 1, 3 + 3 \times 1) = (7, 6)$$. Deze velden liggen binnen het schaakbord en hebben resp. FIDE-voorstellingen e3, f2 en g1. Als de loper $$i = 4$$ stappen zou zetten, dan zou hij terechtkomen op het veld met coördinaten $$(4 + 4 \times 1, 3 + 4 \times 1) = (8, 7)$$ maar dat ligt buiten het schaakbord.
Alternatieve versies van schaken introduceren nieuwe schaakstukken die zowel richtingen hebben waarin ze eenmalig kunnen bewegen, als richtingen waarin ze herhaald kunnen bewegen. Een voorbeeld daarvan is musketierschaken waarin een aartsbisschop bijvoorbeeld de eenmalige richtingen van een paard combineert met de herhaalde richtingen van een loper.
Gevraagd wordt:
Schrijf een functie fide2coordinaten waaraan één argument moet doorgegeven worden. Als dat argument geen string (str) is met de FIDE-voorstelling van een veld op het schaakbord, dan moet een AssertionError opgeworpen worden met de boodschap ongeldige positie. Anders moeten de coördinaten (tuple) van het veld teruggegeven worden.
Schrijf een functie coordinaten2fide waaraan twee argumenten moeten doorgegeven worden. Als die argumenten geen rijnummer $$r$$ (int) en kolomnummer $$k$$ (int) zijn van een veld met coördinaten $$(r, k)$$ op het schaakbord, dan moet een AssertionError opgeworpen worden met de boodschap ongeldige positie. Anders moeten de FIDE-voorstelling (str) van het veld teruggegeven worden.
Schrijf een functie zet waaraan twee argumenten moeten doorgegeven worden: i) het veld waarop een schaakstuk staat en ii) een richting (tuple) waarin het schaakstuk kan bewegen. De functie heeft nog een derde optionele parameter herhaald waaraan een Booleaanse waarde (bool; standaardwaarde: False) kan doorgegeven worden, die aangeeft of het schaakstuk eenmalig (False) of herhaald (True) in de gegeven richting kan bewegen. Als het eerste argument geen geldige FIDE-voorstelling (str) van een veld is, dan moet een AssertionError opgeworpen worden met de boodschap ongeldige positie. Anders moet de functie een verzameling (set) teruggeven met de FIDE-voorstelling (str) van alle velden waarnaar het schaakstuk kan bewegen in de gegeven richting.
Schrijf een functie zetten waaraan het veld moet doorgegeven worden waarop een schaakstuk staat. De functie heeft een tweede optionele parameter eenmalig waaraan een collectie (list, tuple of set) kan doorgegeven worden met alle richtingen (tuple) waarin het schaakstuk eenmalig kan bewegen. De functie heeft een derde optionele parameter herhaald waaraan een collectie (list, tuple of set) kan doorgegeven worden met alle richtingen (tuple) waarin het schaakstuk herhaald kan bewegen. De argumenten die aan de parameters eenmalig en herhaald doorgegeven worden, vormen samen alle mogelijke richtingen waarin het schaakstuk kan bewegen. Als het eerste argument geen geldige FIDE-voorstelling (str) van een veld is, dan moet een AssertionError opgeworpen worden met de boodschap ongeldige positie. Anders moet de functie een verzameling (set) teruggeven met de FIDE-voorstelling (str) van alle velden waarnaar het schaakstuk kan bewegen in alle mogelijke richtingen.
Schrijf een functie groepsgrootte om de groepen van een schaakstuk te bepalen: naar hoeveel andere velden kan het schaakstuk bewegen vanaf een veld uit een groep en hoeveel velden bevat elke groep? De functie heeft dezelfde optionele parameters eenmalig en herhaald als de functie zetten, maar dan als eerste en tweede parameter. De functie moet een dictionary (dict) teruggeven die — voor elke groep van het schaakstuk — het aantal (int) andere velden waarnaar het schaakstuk op een veld uit de groep kan bewegen in alle mogelijke richtingen, afbeeldt op het aantal velden die tot de groep behoren.
Schrijf een functie sterkte met dezelfde optionele parameters eenmalig en herhaald als de functie groepsgrootte. De functie moet de sterkte (int) van het schaakstuk teruggeven.
Schrijf een functie mobiliteit met dezelfde optionele parameters eenmalig en herhaald als de functie groepsgrootte. De functie moet de mobiliteit (str) van het schaakstuk teruggeven.
In de uitdrukking voor de mobiliteit van een schaakstuk wordt de vermenigvuldiging voorgesteld door het karakter ×. Dat is een specifiek karakter dat je niet mag verwarren met de kleine letter x. Je kunt het karakter × dus best kopiëren uit deze opgave, om het daarna in je programmacode te plakken.
>>> fide2coordinaten('d4')
(4, 3)
>>> fide2coordinaten('g2')
(6, 6)
>>> fide2coordinaten('x9')
Traceback (most recent call last):
AssertionError: ongeldige positie
>>> coordinaten2fide(4, 3)
'd4'
>>> coordinaten2fide(6, 6)
'g2'
>>> coordinaten2fide(8, 7)
Traceback (most recent call last):
AssertionError: ongeldige positie
>>> zet('d4', (1, 2)) # alle bewegingen van een paard zijn eenmalig
{'f3'}
>>> zet('d4', (1, 1), herhaald=True) # alle bewegingen van een loper zijn herhaald
{'e3', 'f2', 'g1'}
>>> zet('x9', (1, 2))
Traceback (most recent call last):
AssertionError: ongeldige positie
>>> paard = {(1, 2), (2, 1), (-1, 2), (-2, 1), (1, -2), (2, -1), (-1, -2), (-2, -1)}
>>> zetten('d4', paard)
{'b3', 'b5', 'c2', 'c6', 'e2', 'e6', 'f3', 'f5'}
>>> zetten('g2', paard)
{'e1', 'e3', 'f4', 'h4'}
>>> zetten('x9', paard)
Traceback (most recent call last):
AssertionError: ongeldige positie
>>> groepsgrootte(paard)
{2: 4, 3: 8, 4: 20, 6: 16, 8: 16}
>>> sterkte(paard)
336
>>> mobiliteit(paard)
'4 × 2 + 8 × 3 + 20 × 4 + 16 × 6 + 16 × 8'
>>> loper = {(1, 1), (1, -1), (-1, 1), (-1, -1)}
>>> zetten('d4', herhaald=loper)
{'a1', 'a7', 'b2', 'b6', 'c3', 'c5', 'e3', 'e5', 'f2', 'f6', 'g1', 'g7', 'h8'}
>>> zetten('g1', herhaald=loper)
{'a7', 'b6', 'c5', 'd4', 'e3', 'f2', 'h2'}
>>> groepsgrootte(herhaald=loper)
{7: 28, 9: 20, 11: 12, 13: 4}
>>> sterkte(herhaald=loper)
560
>>> mobiliteit(herhaald=loper)
'28 × 7 + 20 × 9 + 12 × 11 + 4 × 13'
De sterkte en de mobiliteit van een paard kunnen afgeleid worden uit deze vijf groepen.

De titel van deze opgave verwijst naar een vaak gespeelde schaakopening die begint met de zetten d2 → d4, d7 → d5, en c2 → c4 aan de kant van het sterkste schaakstuk op het bord: de dame/koningin (sterkte: 1456).

Het damegambiet heet in het Engels the Queen's Gambit, waarnaar ook een zevendelige miniserie werd vernoemd die op 23 oktober 2020 werd uitgebracht op Netflix. De serie won een Golden Globe als beste miniserie. Anya Taylor-Joy kreeg een Golden Globe als beste hoofdrolspeelster in een miniserie.