Pour un monde de n'importe quelle taille, avec n'importe quelle configuration de bips (aucun carré n'aura plus d'un), inversez tous les bips de sorte que, là où il y avait un bip auparavant, il n'y en avait pas ... et où il n'y en avait pas auparavant, il y a un bipeur. Prenons l'exemple suivant.

Solution

/**
 *  Programme: Inverser
 * ---------------
 * Inverser tous les beepers de sorte que là où il y avait un bip auparavant
 * il n'y a pas de beeper ... et là où il n'y en avait pas auparavant, il y a un
 * beeper.
 * /
public class InvertBeepers extends SuperKarel {

	public void run() {
		invertRow();
		returnToWest();
		while(leftIsClear()) {
			turnLeft();
			move();
			turnRight();
			invertRow();
			returnToWest();
		}
	}

	/**
	 * Méthode: Inverser la ligne
	 * ------------------
	 * Inverser une seule ligne. Au début, Karel devrait faire face à l'est de
	 * le côté ouest de la rangée. Après Karel devrait être face à l'est de la
	 * Le côté est de la même rangée et tous les avertisseurs de la rangée seront inversés.
	 */
	private void invertRow() {
		while(frontIsClear()) {
			invertBeeper();
			move();
		}
		invertBeeper();
	}

	/**
	 * Méthode: inverser le bip
	 * --------------------
	 * Inverse la configuration du bipeur sur un carré. S'il y avait auparavant
	 * un bip, il est ramassé. S'il n'y avait pas de bip auparavant, un bipeur
	 * est placé.
	 */
	private void invertBeeper() {
		if(beepersPresent()) {
			pickBeeper();
		} else {
			putBeeper();
		}
	}

	/**
	 * Méthode: Retour vers l'ouest
	 * ----------------------
	 * Retourne-toi et retourne au mur d'où tu viens!
	 */
	private void returnToWest() {
		turnAround();
		while(frontIsClear()) {
			move();
		}
		turnAround();
	}
}