Handouts: Karel Reference
File: invert_beeper.py

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

from karel.stanfordkarel import *

"""
File: invert_beeper.py
------------------------
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.
"""


def main():
    # There is always at least one row in the world
    invert_row()
    return_to_west()

    # Invert any remaining rows
    while left_is_clear():
        go_to_next_row()
        invert_row()
        return_to_west()


def go_to_next_row():
    """
    Karel moves up one row.  Assumes that there is a row above Karel,
    and that Karel is facing east.  After this function finishes, 
    Karel will be one row above its original position, facing east.
    """
    turn_left()
    move()
    turn_right()


def 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
    right side of the same row, and all beepers in the row will be inverted
    (e.g. no beeper -> beeper, beeper -> no beeper).
    """
    while front_is_clear():
        invert_beeper()
        move()
    invert_beeper()


def 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.
    """
    if beepers_present():
        pick_beeper()
    else:
        put_beeper()


def return_to_west():
    """
    Karel turns around and goes back to the wall in that direction.
    After this function, Karel will be facing the same direction as
    it originally was.
    """
    turn_around()
    while front_is_clear():
        move()
    turn_around()


def turn_around():
    """
    Karel turns 180 degrees - e.g. if Karel is facing east, now Karel will
    face west.  If Karel is facing north, Karel will now face south.
    """
    turn_left()
    turn_left()


def turn_right():
    """
    Karel turns right - e.g. if Karel is facing east, now Karel will face
    south.  If Karel is facing north, Karel will now face east.
    """
    for i in range(3):
        turn_left()


# There is no need to edit code beyond this point

if __name__ == "__main__":
    run_karel_program()