De Forsyth-Edwards notatie (FEN) is een standaardnotatie waarmee een bepaalde spelsituatie van een schaakspel kan beschreven worden. FEN bevat alle informatie die nodig is om een schaakspel vanaf een bepaalde spelsituatie te kunnen hervatten. Het systeem werd ontwikkeld door David Forsyth — journalist van een Schotse krant — die het reeds in 19e eeuw populariseerde. Steven J. Edwards breidde FEN later uit zodat het ook door computers kon gebruikt worden.
In het eerste deel van FEN (we laten hier gemakshalve een aantal onderdelen van een spelsituatie vallen, zoals bijvoorbeeld wie als volgende aan zet is) wordt de plaatsing van de stukken op het schaakbord beschreven vanuit het gezichtspunt van speler wit. De rijen worden beschreven van boven naar onder, en de bezetting van de velden op elke rij wordt beschreven van links naar rechts. Volgens de Standaard Algebraïsche notatie1 (SAN) wordt elk schaakstuk omschreven met één enkele letter: K = koning, Q = dame/koningin, R = toren/kasteel, B = loper/raadsheer, N = paard, P = pion. Witte stukken worden aangeduid met een hoofdletter (KQRBNP) en zwarte stukken met een kleine letter (kqrbnp). Lege velden worden aangeduid met de cijfers 1 tot en met 8, die het aantal opeenvolgende lege velden aanduiden. Een schuine streep (/) wordt gebruikt om de rijen van elkaar te scheiden.
Schrijf een functie fen2grid waarmee de opstelling van een schaakbord in FEN kan omgezet worden naar een stringvoorstelling in de vorm van een $$8 \times 8$$ rooster. Bij deze laatste omschrijving worden de rijen van elkaar gescheiden door newlines (\n) en wordt elk leeg veld aangeduid met één bepaald ASCII karakter. De stukken worden met dezelfde letters aangeduid als bij FEN. Aan deze functie moet als eerste argument een string met de FEN omschrijving doorgegeven worden. Als tweede optionele argument kan men aan de functie ook nog het ASCII karakter doorgeven waarmee lege velden aangeduid worden (standaard wordt hiervoor een sterretje (*) gebruikt). De functie moet de string met de roostervoorstelling als resultaat teruggeven.
Schrijf een functie grid2fen die precies het omgekeerde doet als de functie fen2grid, dus een omschrijving in de vorm van een rooster omzetten in een omschrijving in FEN. Als eerste argument moet een string met de roosteromschrijving doorgegeven worden, en als tweede optionele argument een karakter dat aangeeft hoe lege velden voorgesteld worden in de roosteromschrijving. Het sterretje (*) wordt hierbij opnieuw als standaardwaarde gebruikt. De functie moet als resultaat de string met de FEN omschrijving teruggeven.
>>> print(fen2grid('rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR'))
rnbqkbnr
pppppppp
********
********
********
********
PPPPPPPP
RNBQKBNR
>>> print(fen2grid('rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR', '.'))
rnbqkbnr
pppppppp
........
........
....P...
........
PPPP.PPP
RNBQKBNR
>>> print(fen2grid('rnbqkbnr/pp1ppppp/8/2p5/4P3/8/PPPP1PPP/RNBQKBNR', '+'))
rnbqkbnr
pp+ppppp
++++++++
++p+++++
++++P+++
++++++++
PPPP+PPP
RNBQKBNR
>>> rooster = '''rnbqkbnr
... pppppppp
... ********
... ********
... ********
... ********
... PPPPPPPP
... RNBQKBNR'''
>>> print(grid2fen(rooster))
rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR
>>> print(grid2fen(fen2grid('rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR')))
rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR
>>> print(grid2fen(fen2grid('rnbqkbnr/pp1ppppp/8/2p5/4P3/8/PPPP1PPP/RNBQKBNR', '.'), '.'))
rnbqkbnr/pp1ppppp/8/2p5/4P3/8/PPPP1PPP/RNBQKBNR
>>> print(grid2fen(fen2grid('rnbqkbnr/pp1ppppp/8/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R', '+'), '+'))
rnbqkbnr/pp1ppppp/8/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R