packages feed

swarm-0.4: data/scenarios/Challenges/_hackman/solution.sw

def doN = \n. \f. if (n > 0) {f; doN (n - 1) f} {}; end;

def tryGrab =
    try {
        grab;
        return ();
    } {};
    end;

def tryGive = \thing.
    hasPowerup <- has thing;
    if hasPowerup {
        r <- meet;
        case r
            (\_. return ())
            (\r. give r thing; wait 10);
    } {};
    end;

def turnAndEat = \d. \c.
    turn d;
    doN c (move; tryGrab; tryGive "donut");
    end;

def eatAllPellets =

    doN 4 move;
    turn right;
    doN 2 move;

    tryGrab;
    turnAndEat right 3;
    turnAndEat left 2;
    turnAndEat left 5;
    turnAndEat right 2;
    turnAndEat left 4;
    turnAndEat right 2;
    turnAndEat right 20;
    turnAndEat right 2;
    turnAndEat right 4;
    turnAndEat left 4;
    turnAndEat right 5;
    turnAndEat right 2;
    turnAndEat right 3;
    turnAndEat left 2;
    turnAndEat left 3;
    turnAndEat right 2;
    turnAndEat left 2;
    turnAndEat left 2;
    turnAndEat right 3;
    turnAndEat left 2;
    turnAndEat left 10;
    turnAndEat left 2;
    turnAndEat right 2;
    turnAndEat right 2;
    turnAndEat left 2;
    turnAndEat right 2;
    turnAndEat right 4;
    turnAndEat left 13;
    turnAndEat right 5;
    turnAndEat right 3;
    turnAndEat right 9;
    turnAndEat right 3;
    turnAndEat right 4;
    turnAndEat right 5;
    turnAndEat right 4;
    turnAndEat right 2;
    turnAndEat right 6;
    turnAndEat right 2;
    turnAndEat left 3;
    turnAndEat right 2;
    turnAndEat left 2;
    turnAndEat left 2;
    turnAndEat right 3;
    turnAndEat left 2;
    turnAndEat left 4;
    turnAndEat back 1;
    turnAndEat left 3;
    turnAndEat right 5;
    turnAndEat right 3;
    turnAndEat left 4;
    turnAndEat left 3;
    turnAndEat left 4;
    turnAndEat left 3;
    turnAndEat right 1;
    turnAndEat back 5;
    turnAndEat right 2;
    turnAndEat right 4;
    turnAndEat right 1;
    turnAndEat back 9;
    turnAndEat right 1;
    turnAndEat back 1;
    turnAndEat right 1;
    turnAndEat back 1;
    turnAndEat right 4;
    turnAndEat right 2;
    turnAndEat right 2;
    turnAndEat left 1;
    end;

def waitToGive =
    tryGive "donut";
    hasDonut <- has "donut";
    if hasDonut {waitToGive} {};
    end;

def returnToCenter =
    turn back;
    move;
    turn right;
    doN 2 move;
    turn left;
    doN 2 move;
    turn left;
    doN 6 move;
    turn right;
    doN 2 move;
    turn left;
    doN 4 move;
    _strawberry <-grab;
    doN 4 move;
    turn right;
    doN 2 move;
    turn left;
    doN 2 move;
    end;

def invadeDen =
    doN 14 move;
    turn right;
    doN 2 move;
    turn left;
    doN 4 move;
    turn left;
    make "den key";
    drill forward;
    doN 2 move;
    end;

eatAllPellets;
returnToCenter;
waitToGive;
invadeDen;