Bifidcodering is één van de klassieke coderingstechnieken die ook makkelijk met de hand kunnen uitgevoerd worden. De techniek werd rond 1901 uitgevonden door amateur-cryptograaf Felix Delastelle. De codering is een combinatie van substitutie met fractionering. Hierbij wordt gebruik gemaakt van een vierkant \(n \times n\) rooster (\(2 \leq n \leq 10\)). In dit rooster worden alle symbolen geplaatst die in het te coderen tekstfragment kunnen voorkomen. Om de techniek verder uit te leggen, zullen we bij wijze van voorbeeld werken met onderstaand \(9 \times 9\) rooster. Let hierbij op het feit dat een spatie als symbool voorkomt in het rooster op rij zes en kolom acht (rijen en kolommen worden genummerd vanaf nul).

Om de originele tekst This is a dead parrot! te coderen, wordt eerst elk symbool van de tekst omgezet naar het corresponderende rij- en kolomnummer waar het symbool terug te vinden is in het rooster. Zo vinden we bijvoorbeeld de hoofdletter T in het rooster terug op rij 2 en kolom 1. Deze rij- en kolomnummers worden verticaal onder de corresponderende symbolen van de originele tekst geschreven.
originele tekst: T h i s i s a d e a d p a r r o t !
-------------------------------------------
rij: 2 4 4 6 6 4 6 6 4 6 4 4 4 4 6 5 4 5 5 5 6 7
kolom: 1 7 8 0 8 8 0 8 0 8 3 4 0 3 8 6 0 8 8 5 1 5
Daarna worden de cijfers achter elkaar uitgeschreven: eerst de rijnummers, gevolgd door de kolomnummers.
2 4 4 6 6 4 6 6 ... 5 5 6 7 1 7 8 0 ... 8 6 0 8 8 5 1 5
Tenslotte worden de cijfers in groepen van twee samengenomen, en wordt elk cijferpaar omgezet naar het corresponderende symbool in het vierkant rooster. Het eerste cijfer van elk paar stelt hierbij het rijnummer voor in het rooster, en het tweede cijfer het kolomnummer. Zo correspondeert het paar 2|4 bijvoorbeeld met de hoofdletter W, die we in het rooster terugvinden op rij 2 en kolom 4.
2|4 4|6 6|4 6|6 ... 5|5 6|7 1|7 8|0 ... 8|6 0|8 8|5 1|5
W g w y o z Q ( $ I } O
Op die manier werd geïllustreerd hoe de originele tekst This is a dead parrot! volgens het bifidcijfer wordt omgezet in de gecodeerde tekst WgwygeexfozQ(%II5D$I}O. Voor decodering van een gecodeerd tekstbericht moet de omgekeerde bewerking uitgevoerd worden.
Definieer een klasse Bifid waarvan de objecten kunnen gebruikt worden om tekstfragmenten te coderen en te decoderen volgens de bifidcodering met een gegeven \(n \times n\) rooster. Bij het aanmaken van een nieuwe bifidcodering (Bifid) moeten twee argumenten doorgegeven worden: de waarde \(n\) en een string van lengte \(n^2\) met de symbolen van het rooster, uitgeschreven van links naar rechts en van boven naar onder. De constructor moet nagaan dat \(1 \leq n \leq 10\) en dat de opgegeven string de correcte lengte heeft. Als de eerste voorwaarde niet voldaan is, dan moet de constructor een exception opwerpen van het type BifidError met de boodschap er moet gelden dat 1 <= n <= 10. Als de tweede voorwaarde niet voldaan is, dan moet de constructor een exception opwerpen van het type BifidError met de boodschap aantal symbolen komt niet overeen met grootte van het rooster.
Voorts moet je op een bifidcodering \(b\) (Bifid) minstens de volgende methoden kunnen aanroepen:
Een methode symbool waaraan een rijnummer \(r\) (Number) en een kolomnummer \(k\) (Number) moeten doorgegeven worden. Als de opgegeven positie niet binnen het rooster van bifidcodering \(b\) valt, dan moet de methode een exception van het type BifidError opwerpen met de boodschap ongeldige positie in rooster. Anders moet de methode het symbool (String) teruggeven dat in het rooster van bifidcodering \(b\) gevonden worden op rij \(r\) en kolom \(k\).
Een methode positie waaraan een symbool \(s\) (String) moet doorgegeven worden. Als symbool \(s\) niet uit één enkel karakter bestaat, dan moet de methode een exception van het type BifidError opwerpen met de boodschap symbool moet uit 1 karakter bestaan. Als symbool \(s\) niet voorkomt in het rooster van bifidcodering \(b\), dan moet de methode een exception van het type BifidError opwerpen met de boodschap onbekend symbool: s, waarbij op de plaats van s symbool \(s\) moet ingevuld worden. Anders moet de methode een array (Array) teruggeven met het rijnummer \(r\) (Number) en kolomnummer \(k\) (Number) van de positie in het rooster van bifidcodering \(b\) waar symbool \(s\) (String) kan teruggevonden worden.
Een methode codeer waaraan een klare tekst (String) moet doorgegeven worden. De functie moet de corresponderende cijfertekst (String) teruggeven volgens bifidcodering \(b\).
Een methode decodeer waaraan een cijfertekst (String) moet doorgegeven worden die gecodeerd werd volgens bifidcodering \(b\). De functie moet de corresponderende klare tekst (String) teruggeven.
> const bifid = new Bifid(9, "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz .,;:?!\"'-()[]{}$=%")
> bifid.symbool(2, 1)
"T"
> bifid.symbool(-2, 5)
BifidError: ongeldige positie in rooster
> bifid.symbool(-7, 8)
BifidError: ongeldige positie in rooster
> bifid.symbool(7, 10)
BifidError: ongeldige positie in rooster
> bifid.symbool(12, 3)
BifidError: ongeldige positie in rooster
> bifid.positie("T")
[2, 1]
> bifid.positie("")
BifidError: symbool moet uit 1 karakter bestaan
> bifid.positie("SPAM")
BifidError: symbool moet uit 1 karakter bestaan
> bifid.positie("~")
BifidError: onbekend symbool: ~
> bifid.codeer("This is a dead parrot!")
"WgwygeexfozQ(%II5D$I}O"
> bifid.decodeer("WgwygeexfozQ(%II5D$I}O")
"This is a dead parrot!"
> new Bifid(20, "...")
BifidError: er moet gelden dat 1 <= n <= 10
> new Bifid(0, "...")
BifidError: er moet gelden dat 1 <= n <= 10
> new Bifid(3, "ABCDEFGHIJKLMNOPQRSTUVWXYZ")
BifidError: aantal symbolen komt niet overeen met grootte van het rooster
> new Bifid(3, "ABC")
BifidError: aantal symbolen komt niet overeen met grootte van het rooster