De chef-kok van een restaurant is nogal van het slordige type. Als hij een stapel pannenkoeken moet bakken dan zijn er nooit twee pannenkoeken met dezelfde grootte. De maitre d'hotel eist echter dat de kelners alle pannenkoeken in een stapel eerst van klein naar groot sorteren — met de kleinste pannenkoek van boven en de grootste van onder — voor ze die naar de tafelgasten brengen.
Om een stapel pannenkoeken te sorteren, kunnen de kelners echter slechts één handeling uitvoeren: ze schuiven een spatel onder één van de pannenkoeken in de stapel, wentelen alle pannenkoeken op de spatel samen om en leggen die terug bovenop het resterende deel van de stapel. Ze kunnen deze handeling verschillende keren na elkaar uitvoeren, waarbij ze de spatel telkens onder een andere pannenkoek kunnen schuiven. Om snel te kunnen werken, maken de kelners er een sport van om een stapel te sorteren met zo weinig mogelijk wentelingen.
De uitdaging wordt nog groter als de chef-kok weer eens te diep in het glas gekeken heeft, waardoor hij de onderkant van alle pannenkoeken heeft laten aanbranden. De maitre d'hotel verwacht dan immers niet alleen dat zijn kelners de pannenkoeken van klein naar groot sorteren, maar dat ze er ook voor zorgen dat de aangebrande kant van de pannenkoeken van onder ligt.
Bij het wentelen van een aantal aangebrande pannenkoeken aan de bovenkant van de stapel, verandert in dat geval niet alleen de volgorde van de pannenkoeken, maar keren ook alle pannenkoeken om. Daardoor zal een pannenkoek die met de aangebrande kant naar onder lag na het wentelen met de aangebrande kant naar boven liggen, en omgekeerd.
Er bestaat een eenvoudig algoritme om een stapel van
zoek de positie
wentel de bovenste
enkel voor aangebrande pannenkoeken: wentel de bovenste pannenkoek als die met de aangebrande kant naar onder ligt, zodat die met de aangebrande kant naar boven komt te liggen
wentel de bovenste
Om de volledige stapel pannenkoeken te sorteren, volstaat het dan om deze
sorteerstap achtereenvolgens uit te voeren voor de bovenste
Een pannenkoek wordt voorgesteld door een getal
Een stapel van
Je opdracht bestaat erin om een gegeven stapel van
Een functie wentel die de stapel pannenkoeken teruggeeft die men bekomt door alle pannenkoeken van de gegeven stapel te wentelen.
Een functie wentel_bovenste waaraan een tweede
verplicht argument
Een functie zoek_grootste waaraan een tweede verplicht
argument
Een functie sorteerstap waaraan een tweede verplicht
argument
Een functie sorteerstappen die een lijst (list)
met stapels pannenkoeken moet teruggeven. Het eerste element van de
lijst is de gegeven stapel pannenkoeken. De functie moet de gegeven
stapel pannenkoeken sorteren door de sorteerstap achtereenvolgens uit
te voeren voor de bovenste
>>> wentel((9, 2, 7, 5, 8, 1, 4, 6, 3)) (3, 6, 4, 1, 8, 5, 7, 2, 9) >>> wentel((-9, -2, -7, 5, 8, -1, -4, -6, 3), aangebrand=True) (-3, 6, 4, 1, -8, -5, 7, 2, 9) >>> wentel_bovenste((1, 4, 6, 3, 5, 2, 7, 8, 9), 3) (6, 4, 1, 3, 5, 2, 7, 8, 9) >>> wentel_bovenste((6, 4, 1, 3, 5, 2, 7, 8, 9), 6) (2, 5, 3, 1, 4, 6, 7, 8, 9) >>> wentel_bovenste((-1, -4, -6, 3, -5, -2, 7, 8, 9), 3, aangebrand=True) (6, 4, 1, 3, -5, -2, 7, 8, 9) >>> wentel_bovenste((6, 4, 1, 3, -5, -2, 7, 8, 9), 1, aangebrand=True) (-6, 4, 1, 3, -5, -2, 7, 8, 9) >>> wentel_bovenste((-6, 4, 1, 3, -5, -2, 7, 8, 9), 6, aangebrand=True) (2, 5, -3, -1, -4, 6, 7, 8, 9) >>> zoek_grootste((1, 4, 6, 3, 5, 2, 7, 8, 9), 6) 3 >>> zoek_grootste((-1, -4, -6, 3, -5, -2, 7, 8, 9), 6) 3 >>> sorteerstap((1, 4, 6, 3, 5, 2, 7, 8, 9), 6) (2, 5, 3, 1, 4, 6, 7, 8, 9) >>> sorteerstap((-1, -4, -6, 3, -5, -2, 7, 8, 9), 6, aangebrand=True) (2, 5, -3, -1, -4, 6, 7, 8, 9) >>> sorteerstappen((1, 8, 5, 7, 2, 9, 4, 6, 3)) [(1, 8, 5, 7, 2, 9, 4, 6, 3), (3, 6, 4, 1, 8, 5, 7, 2, 9), (2, 7, 5, 3, 6, 4, 1, 8, 9), (1, 4, 6, 3, 5, 2, 7, 8, 9), (2, 5, 3, 1, 4, 6, 7, 8, 9), (4, 1, 3, 2, 5, 6, 7, 8, 9), (2, 3, 1, 4, 5, 6, 7, 8, 9), (1, 2, 3, 4, 5, 6, 7, 8, 9)] >>> sorteerstappen((1, -8, -5, 7, 2, 9, -4, -6, 3), aangebrand=True) [(1, -8, -5, 7, 2, 9, -4, -6, 3), (-3, 6, 4, 1, -8, -5, 7, 2, 9), (-2, -7, 5, -3, 6, 4, 1, 8, 9), (-1, -4, -6, 3, -5, -2, 7, 8, 9), (2, 5, -3, -1, -4, 6, 7, 8, 9), (4, 1, 3, 2, 5, 6, 7, 8, 9), (-2, -3, -1, 4, 5, 6, 7, 8, 9), (1, -2, 3, 4, 5, 6, 7, 8, 9), (1, 2, 3, 4, 5, 6, 7, 8, 9)]
Het eenvoudige algoritme uit deze opgave minimaliseert allerminst het aantal wentelingen dat nodig is om een stapel pannenkoeken te sorteren. Zoeken naar het minimaal aantal wentelingen blijkt echter een heel moeilijke opdracht te zijn. In 1979 publiceerde de oprichter van Microsoft — Bill Gates1 (toen nog William Gates) — samen met Christos Papadimitriou2 (toen op Harvard, nu in Columbia) zijn enige bekende wetenschappelijk artikel getiteld Bounds for sorting by prefix reversal, waarin ze een veel efficiënter algoritme beschrijven om stapels pannenkoeken te sorteren. Ook David X. Cohen3 (toen nog David S. Cohen) — maker van de animatiereeks Futurama4 — publiceerde een wetenschappelijk artikel met een efficiënt algoritme om stapels verbrande pannenkoeken te sorteren. Daarvoor werkte hij samen met Manuel Blum5 (toen op Berkeley, nu aan de Carnegie Mellon University).
In 2008 bouwde een groep studenten een bacteriële computer die in staat was om een eenvoudig stapel met verbrande pannenkoeken te sorteren. Ze deden dit door E. coli bacteriën zo te programmeren dat ze in staat zijn tot het omkeren van DNA-segmenten die analoog zijn aan verbrande pannenkoeken. DNA heeft immers een oriëntatie (5' en 3') en een volgorde. Hoewel de rekenkracht die wordt gerealiseerd door het omkeren van DNA behoorlijk laag is, levert het grote aantal bacteriën in een kweek een grote parallelle computer op. De bacteriën laten weten wanneer ze de pannenkoeken gesorteerd hebben door resistent te worden voor antibiotica.
Cohen DS, Blum M (1995). On the problem of sorting burnt pancakes. Discrete Applied Mathematics 61(2), 105–120. 6
Gates WH, Papadimitriou CH (1979). Bounds for sorting by prefix reversal. Discrete Mathematics 27(1), 47–57. 7
Haynes KA, Broderick ML, Brown AD, Butner TL, Dickson JO, Harden WL, Heard LH, Jessen EL, Malloy KJ, Ogden BJ, Rosemond S (2008). Engineering bacteria to solve the burnt pancake problem. Journal of Biological Engineering 2(1), 8. 8