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;