packages feed

swarm-0.6.0.0: data/scenarios/Challenges/Sokoban/_foresight/solution.sw

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

def moveUntilBlocked =
    isBlocked <- blocked;
    if isBlocked {} {
        move;
        moveUntilBlocked;
    }
    end;

def pushUntilBarrier =
    try {
        push;
        pushUntilBarrier;
    } {}
    end;

def goAroundCell =
    turn right;
    move;
    turn left;
    doN 2 move;
    turn left;
    end;

def repositionFromMiddle =
    turn right;
    move;
    turn left;
    move;
    turn right;
    moveUntilBlocked;
    end;

def childShared =
    goAroundCell;
    moveUntilBlocked;
    end;

def childSharedPrep =
    move;
    turn back;
    watch forward;
    wait 200;
    end;

def childSharedWait =
    childSharedPrep;
    pushUntilBarrier;
    end;

def firstChild =
    childShared;
    turn right;
    childSharedWait;

    doN 4 (turn left; moveUntilBlocked);
    repositionFromMiddle;
    turn left;
    childSharedWait;
    end;

def secondChild =
    childShared;

    doN 1 (turn left; moveUntilBlocked);
    
    turn right;
    childSharedWait;
    doN 3 (turn left; moveUntilBlocked);

    repositionFromMiddle;
    doN 1 (turn right; moveUntilBlocked);
    turn left;
    childSharedWait;
    end;

def thirdChild =
    childShared;
    
    doN 2 (turn left; moveUntilBlocked);
    turn right;
    childSharedWait;
    doN 2 (turn left; moveUntilBlocked);
    
    repositionFromMiddle;
    doN 2 (turn right; moveUntilBlocked);
    turn left;
    childSharedWait;
    end;

def fourthChild =
    childShared;
    doN 3 (turn left; moveUntilBlocked);
    turn right;
    childSharedWait;
    doN 1 (turn left; moveUntilBlocked);

    repositionFromMiddle;
    doN 3 (turn right; moveUntilBlocked);
    turn left;
    childSharedWait;
    end;

def fifthChild =
    childShared;
    doN 4 (turn left; moveUntilBlocked);
    turn right;
    childSharedPrep;
    doN 2 push;

    repositionFromMiddle;
    doN 4 (turn right; moveUntilBlocked);
    turn left;
    childSharedWait;

    turn right;
    move;
    turn left;
    move;
    turn left;
    doN 3 push;
    end;

def firstLeg =
    build {fifthChild};
    build {fourthChild};
    build {thirdChild};
    build {secondChild};
    build {firstChild};
    wait 10;
    
    push;
    turn right;
    move;
    turn left;
    move;
    turn left;
    pushUntilBarrier;

    wait 4;
    moveUntilBlocked;
    doN 5 (turn left; moveUntilBlocked);

    turn right;
    move;
    turn left;
    doN 2 move;
    turn left;
    doN 2 move;
    turn left;
    move;
    turn left;
    doN 3 push;
    end;

def getToCaveEntrance =
    moveUntilBlocked;
    turn right;
    move;
    turn left;
    move;
    turn right;
    move;
    turn left;
    doN 2 move;
    turn left;
    move;
    turn left;
    push;
    turn right;
    doN 2 move;
    turn right;
    push;
    turn right;
    push;
    turn left;
    doN 3 move;
    turn left;
    doN 3 move;

    x <- grab;
    equip x;
    doN 18 move;
    turn left;
    doN 5 move;
    turn left;
    move;
    turn right;
    doN 10 push;
    end;

def go =
    getToCaveEntrance;
    firstLeg;
    end;

go;