packages feed

swarm-0.7.0.0: data/scenarios/Testing/1535-ping/_1535-in-range/solution.sw

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

def goToBuddy = \loc.

    // log $ format loc;
    match loc \lateralDist. \longitudinalDist.
    absFwd <- if (longitudinalDist < 0) {
        turn back;
        pure $ -longitudinalDist;
    } {
        pure longitudinalDist;
    };
    doN absFwd move;
    if (longitudinalDist < 0) {
        turn back;
    } {};

    absSide <- if (lateralDist < 0) {
        turn left;
        pure $ -lateralDist;
    } {
        turn right;
        pure lateralDist;
    };
    doN absSide move;
    end;

def checkNeedToMove = \f. \loc.
    wait 3;
    if (loc == (0, 0)) {
        pure ()
    } {
        goToBuddy loc;
        f;
    }
    end;

def pingLoop = \buddy.
    maybeLoc <- ping buddy;
    case maybeLoc pure $ checkNeedToMove $ pingLoop buddy;
    end;

def giveToBuddy = \buddy.
    give buddy "map piece";
    pingLoop buddy;
    end;

def go =
    move;
    maybeBuddy <- meet;
    case maybeBuddy pure giveToBuddy;
    grab;
    end;

go;