Repte 11 — El tauler d'escacs

Reptes

Repte 11 — El tauler d'escacs ★★★ Avançat

El món és un rectangle buit. En Karel ha d'omplir-lo amb un patró d'escaquer: perles a les caselles «negres» i res a les «blanques». La cantonada inferior esquerra és sempre negra (porta perla).

La teva feina: escriu un programa que funcioni per a qualsevol rectangle, sigui quina sigui l'amplada i l'alçada. El teu codi no pot dependre del nombre exacte de caselles.

Restricció important: no pots usar variables numèriques per comptar files ni columnes. La paritat de cada casella s'ha d'inferir de l'estat físic del món — concretament, de si en Karel ha deixat o no una perla a la casella on és ara.
💡 Pista — el truc de la paritat física Quan en Karel acaba una fila i ha de pujar a la fila de sobre, la darrera casella que ha visitat és la clau: si hi ha perla (pearl_here() = True), la primera casella de la nova fila serà «blanca» (sense perla). Si no hi ha perla, la primera casella de la nova fila serà «negra» (amb perla). Comprova la condició abans de moure't a la nova fila; un cop t'has mogut ja no pots saber-ho.
💡 Pista — el recorregut en serpentí i els dos girs En Karel recorre el món en ziga-zaga: fila de baix cap a l'Est, puja, fila de sobre cap a l'Oest, puja, fila cap a l'Est, … El gir de transició depèn de la direcció actual: des de l'Est cal turn_left(); move(); turn_left() (girar al Nord, pujar, girar a l'Oest). Des de l'Oest cal turn_right(); move(); turn_right() (girar al Nord, pujar, girar a l'Est). Escriu dues funcions de transició, una per a cada direcció.
💡 Pista — omple_fila_des_de_off() L'esquelet et dóna omple_fila_des_de_on() ja implementada: parteix d'una casella «negra», deixa perla, avança dues caselles, deixa perla, … fins al final de la fila. omple_fila_des_de_off() és la versió simètrica: parteix d'una casella «blanca», avança una casella (saltant la blanca), deixa perla, avança dues, deixa perla, … Observa que l'estructura és gairebé idèntica, però l'ordre de les accions dins del while s'intercanvia.