Invert

Problem written by Eric Roberts

For a world of any size, with any configuration of beepers (no square will have more than one), invert all the beepers so that, where there was a beeper previously there is no beeper... and where there was no beeper previously, there is a beeper. Consider the following example.

Solution

/**
* Program: Invert
* ---------------
* Invert all the beepers so that, where there was a beeper previously
* there is no beeper... and where there was no beeper previously, there is a
* beeper.
*/
public class InvertBeepers extends SuperKarel {
public void run() {
invertRow();
returnToWest();
while(leftIsClear()) {
turnLeft();
move();
turnRight();
invertRow();
returnToWest();
}
}
/**
* Method: Invert Row
* ------------------
* Invert a single row. At the start, Karel should be facing east from
* the west side of the row. After Karel should be facing east from the
* east side of the same row, and all beepers in the row will be inverted.
*/
private void invertRow() {
while(frontIsClear()) {
invertBeeper();
move();
}
invertBeeper();
}
/**
* Method: Invert Beeper
* --------------------
* Inverts the beeper configuration on a square. If there was previously
* a beeper, it is picked up. If there was previously no beeper, a beeper
* is placed.
*/
private void invertBeeper() {
if(beepersPresent()) {
pickBeeper();
} else {
putBeeper();
}
}
/**
* Method: Return To West
* ----------------------
* Turn around and go back to the wall that you came from!
*/
private void returnToWest() {
turnAround();
while(frontIsClear()) {
move();
}
turnAround();
}
}