packages feed

swarm-0.4: data/scenarios/Challenges/_bridge-building/flower-ring-check.sw

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


def isItemInDirection = \direction. \item. 
    x <- scan direction;
    return $ case x (\_. false) (\y. y == item);
    end;

def isFlankedByItem = \item.
    hasLeft <- isItemInDirection left item;
    hasRight <- isItemInDirection right item;
    return $ hasLeft && hasRight;
    end;

def flowersInCardinalDirections = \item. \n.
    if (n > 0) {
        x <- isItemInDirection forward item;
        if x {
            turn left;
            flowersInCardinalDirections item $ n - 1;
        } {
            return false;
        };
    } {
        return true;
    }
    end;

def flowersAround = \item.
    hasCardinals <- flowersInCardinalDirections item 4;
    if hasCardinals {
        move;
        isFlanked1 <- isFlankedByItem item;
        turn back;
        move;
        if isFlanked1 {
            move;
            isFlanked2 <- isFlankedByItem item;
            turn back;
            move;
            return isFlanked2;
        } {
            return false;
        }
    } {
        return false;
    }
    end;

// loop until condition is met
def waitUntilSurrounded =
    isSurrounded <- flowersAround "flower";
    if isSurrounded {} {
        wait 2;
        waitUntilSurrounded;
    }
    end;

waitUntilSurrounded;

_t <- swap "painted plate";
selfdestruct;