Esempio n. 1
0
 protected function is_atom($feedxml)
 {
     if (defined('STRICT_TYPES') && CAMEL_CASE == '1') {
         return (bool) self::parameters(['feedxml' => DT::TEXT])->call(__FUNCTION__)->with($feedxml)->returning(DT::TEXT);
     } else {
         return (bool) is_atom($feedxml);
     }
 }
Esempio n. 2
0
function decode_atom(&$in)
{
    $inptr = $in;
    decode_lwsp($inptr);
    $start = $inptr;
    $i = 0;
    while (strlen($inptr) > 0 && is_atom($inptr[0])) {
        $inptr = substr($inptr, 1);
        $i++;
    }
    $in = $inptr;
    if ($i > 0) {
        return substr($start, 0, $i);
    } else {
        return false;
    }
}
Esempio n. 3
0
function leftmost($list)
{
    return is_atom(car($list)) ? car($list) : leftmost(car($list));
}
Esempio n. 4
0
function is_lat($list)
{
    return is_null($list) ? true : (is_atom(car($list)) ? is_lat(cdr($list)) : false);
}
Esempio n. 5
0
function Track_Beam($f_szDirection, $f_arrFrom, $f_arrTo = NULL)
{
    global $SIDES, $arrUpdates, $szExitColour;
    if (NULL === $f_arrTo) {
        $f_arrTo = $f_arrFrom;
    }
    $szColorWhite = "#fff";
    $szColorAbsorbed = "#555";
    $bLeave = false;
    // Curent coords
    $x = $f_arrTo[0];
    $y = $f_arrTo[1];
    /**
     * naar rechts	= y+1
     * naar links	= y-1
     * naar onder	= x+1
     * naar boven	= x-1
     *
     * Y is horizontal movement
     * X is vertical movement
     *
     **/
    if ($f_szDirection == "r") {
        if (is_atom($x, $y + 1)) {
            // Absorbed! -> beginveld grijs
            $arrUpdates[] = array($f_arrFrom[0], $f_arrFrom[1], $szColorAbsorbed);
        } else {
            if (is_atom($x + 1, $y + 1) && is_atom($x - 1, $y + 1)) {
                // U-turn, want beam is ingesloten (kan niet rechts en niet links, moet dus terug)
                if (valid_coords($x, $y)) {
                    return Track_Beam("l", $f_arrFrom, array($x, $y));
                } else {
                    if (valid_coords($x, $y - 1)) {
                        // Volgende stap ligt buiten het veld, dus terug naar niks
                        $arrUpdates[] = array($f_arrFrom[0], $f_arrFrom[1], $szColorWhite);
                    } else {
                        if (!valid_coords($x, $y)) {
                            // Eerste stap, meteen U-turn terug naar niks
                            $arrUpdates[] = array($f_arrFrom[0], $f_arrFrom[1], $szColorWhite);
                        } else {
                            echo __LINE__ . "::DIT IS ONMOGELIJK!!! {$f_szDirection}";
                            exit;
                        }
                    }
                }
            } else {
                if (is_atom($x + 1, $y + 1)) {
                    if (!valid_coords($x, $y)) {
                        // Eerste stap onmogelijke bocht want nog niet in veld
                        $arrUpdates[] = array($f_arrFrom[0], $f_arrFrom[1], $szColorWhite);
                    } else {
                        // Bocht naar links: van right naar up
                        return Track_Beam("u", $f_arrFrom, array($x, $y));
                    }
                } else {
                    if (is_atom($x - 1, $y + 1)) {
                        if (!valid_coords($x, $y)) {
                            // Eerste stap onmogelijke bocht want nog niet in veld
                            $arrUpdates[] = array($f_arrFrom[0], $f_arrFrom[1], $szColorWhite);
                        } else {
                            // Bocht naar rechts: van right naar down
                            return Track_Beam("d", $f_arrFrom, array($x, $y));
                        }
                    } else {
                        if (!valid_coords($x, $y + 1)) {
                            // De straal komt uit het veld, zonder U-turn -> twee vakjes kleuren!
                            if (array($x, $y + 1) == $f_arrFrom) {
                                // Teruggekaatst -> 1 vakje gekleurd
                                $kleur = $szColorWhite;
                            } else {
                                // AB -> Twee vakjes gekleurd
                                $kleur = $szExitColour;
                                $arrUpdates[] = array($x, $y + 1, $kleur);
                            }
                            $arrUpdates[] = array($f_arrFrom[0], $f_arrFrom[1], $kleur);
                        } else {
                            // Drie veldjes zijn vrij en volgend veldje is nog binnen het veld
                            return Track_Beam("r", $f_arrFrom, array($x, $y + 1));
                        }
                    }
                }
            }
        }
    } else {
        if ($f_szDirection == "d") {
            if (is_atom($x + 1, $y)) {
                // Absorbed! -> beginveld grijs
                $arrUpdates[] = array($f_arrFrom[0], $f_arrFrom[1], $szColorAbsorbed);
            } else {
                if (is_atom($x + 1, $y + 1) && is_atom($x + 1, $y - 1)) {
                    // U-turn, want beam is ingesloten (kan niet rechts en niet links, moet dus terug)
                    if (valid_coords($x, $y)) {
                        return Track_Beam("u", $f_arrFrom, array($x, $y));
                    } else {
                        if (valid_coords($x, $x - 1)) {
                            // Volgende stap ligt buiten het veld, dus terug naar niks
                            $arrUpdates[] = array($f_arrFrom[0], $f_arrFrom[1], $szColorWhite);
                        } else {
                            if (!valid_coords($x, $y)) {
                                // Eerste stap, meteen U-turn terug naar niks
                                $arrUpdates[] = array($f_arrFrom[0], $f_arrFrom[1], $szColorWhite);
                            } else {
                                echo __LINE__ . "::DIT IS ONMOGELIJK!!! {$f_szDirection}";
                                exit;
                            }
                        }
                    }
                } else {
                    if (is_atom($x + 1, $y - 1)) {
                        // Bocht naar links
                        if (!valid_coords($x, $y)) {
                            // Eerste stap onmogelijke bocht want nog niet in veld
                            $arrUpdates[] = array($f_arrFrom[0], $f_arrFrom[1], $szColorWhite);
                        } else {
                            // Bocht naar links: van down naar right
                            return Track_Beam("r", $f_arrFrom, array($x, $y));
                        }
                    } else {
                        if (is_atom($x + 1, $y + 1)) {
                            // Bocht naar rechts
                            if (!valid_coords($x, $y)) {
                                // Eerste stap onmogelijke bocht want nog niet in veld
                                $arrUpdates[] = array($f_arrFrom[0], $f_arrFrom[1], $szColorWhite);
                            } else {
                                // Bocht naar rechts: van down naar left
                                return Track_Beam("l", $f_arrFrom, array($x, $y));
                            }
                        } else {
                            if (!valid_coords($x + 1, $y)) {
                                // De straal komt uit het veld, zonder U-turn -> twee vakjes kleuren!
                                if (array($x + 1, $y) == $f_arrFrom) {
                                    // Teruggekaatst -> 1 vakje kleuren
                                    $kleur = $szColorWhite;
                                } else {
                                    // AB -> Twee vakjes kleuren
                                    $kleur = $szExitColour;
                                    $arrUpdates[] = array($x + 1, $y, $kleur);
                                }
                                $arrUpdates[] = array($f_arrFrom[0], $f_arrFrom[1], $kleur);
                            } else {
                                // Drie veldjes zijn vrij en volgend veldje is nog binnen het veld
                                return Track_Beam("d", $f_arrFrom, array($x + 1, $y));
                            }
                        }
                    }
                }
            }
        } else {
            if ($f_szDirection == "l") {
                if (is_atom($x, $y - 1)) {
                    // Absorbed! -> beginveld grijs
                    $arrUpdates[] = array($f_arrFrom[0], $f_arrFrom[1], $szColorAbsorbed);
                } else {
                    if (is_atom($x + 1, $y - 1) && is_atom($x - 1, $y - 1)) {
                        // U-turn, want beam is ingesloten (kan niet rechts en niet links, moet dus terug)
                        if (valid_coords($x, $y)) {
                            return Track_Beam("r", $f_arrFrom, array($x, $y));
                        } else {
                            if (valid_coords($x, $y + 1)) {
                                // Volgende stap ligt buiten het veld, dus terug naar niks
                                $arrUpdates[] = array($f_arrFrom[0], $f_arrFrom[1], $szColorWhite);
                            } else {
                                if (!valid_coords($x, $y)) {
                                    // Eerste stap, meteen U-turn terug naar niks
                                    $arrUpdates[] = array($f_arrFrom[0], $f_arrFrom[1], $szColorWhite);
                                } else {
                                    echo __LINE__ . "::DIT IS ONMOGELIJK!!! {$f_szDirection}";
                                    exit;
                                }
                            }
                        }
                    } else {
                        if (is_atom($x + 1, $y - 1)) {
                            if (!valid_coords($x, $y)) {
                                // Eerste stap onmogelijke bocht want nog niet in veld
                                $arrUpdates[] = array($f_arrFrom[0], $f_arrFrom[1], $szColorWhite);
                            } else {
                                // Bocht naar rechts: van left naar up
                                return Track_Beam("u", $f_arrFrom, array($x, $y));
                            }
                        } else {
                            if (is_atom($x - 1, $y - 1)) {
                                if (!valid_coords($x, $y)) {
                                    // Eerste stap onmogelijke bocht want nog niet in veld
                                    $arrUpdates[] = array($f_arrFrom[0], $f_arrFrom[1], $szColorWhite);
                                } else {
                                    // Bocht naar links: van left naar down
                                    return Track_Beam("d", $f_arrFrom, array($x, $y));
                                }
                            } else {
                                if (!valid_coords($x, $y - 1)) {
                                    // De straal komt uit het veld, zonder U-turn -> twee vakjes kleuren!
                                    if (array($x, $y - 1) == $f_arrFrom) {
                                        // Teruggekaatst -> 1 vakje kleuren
                                        $kleur = $szColorWhite;
                                    } else {
                                        // A->B -> Twee vakjes kleuren
                                        $kleur = $szExitColour;
                                        $arrUpdates[] = array($x, $y - 1, $kleur);
                                    }
                                    $arrUpdates[] = array($f_arrFrom[0], $f_arrFrom[1], $kleur);
                                } else {
                                    // Drie veldjes zijn vrij en volgend veldje is nog binnen het veld
                                    return Track_Beam("l", $f_arrFrom, array($x, $y - 1));
                                }
                            }
                        }
                    }
                }
            } else {
                if ($f_szDirection == "u") {
                    if (is_atom($x - 1, $y)) {
                        // Absorbed! -> beginveld grijs
                        $arrUpdates[] = array($f_arrFrom[0], $f_arrFrom[1], $szColorAbsorbed);
                    } else {
                        if (is_atom($x - 1, $y + 1) && is_atom($x - 1, $y - 1)) {
                            // U-turn, want beam is ingesloten (kan niet rechts en niet links, moet dus terug)
                            if (valid_coords($x, $y)) {
                                return Track_Beam("d", $f_arrFrom, array($x, $y));
                            } else {
                                if (valid_coords($x, $x + 1)) {
                                    // Volgende stap ligt buiten het veld, dus terug naar niks
                                    $arrUpdates[] = array($f_arrFrom[0], $f_arrFrom[1], $szColorWhite);
                                } else {
                                    if (!valid_coords($x, $y)) {
                                        // Eerste stap, meteen U-turn terug naar niks
                                        $arrUpdates[] = array($f_arrFrom[0], $f_arrFrom[1], $szColorWhite);
                                    } else {
                                        echo __LINE__ . "::DIT IS ONMOGELIJK!!! {$f_szDirection}";
                                        exit;
                                    }
                                }
                            }
                        } else {
                            if (is_atom($x - 1, $y - 1)) {
                                if (!valid_coords($x, $y)) {
                                    // Eerste stap onmogelijke bocht want nog niet in veld
                                    $arrUpdates[] = array($f_arrFrom[0], $f_arrFrom[1], $szColorWhite);
                                } else {
                                    // Bocht naar rechts: van up naar right
                                    return Track_Beam("r", $f_arrFrom, array($x, $y));
                                }
                            } else {
                                if (is_atom($x - 1, $y + 1)) {
                                    if (!valid_coords($x, $y)) {
                                        // Eerste stap onmogelijke bocht want nog niet in veld
                                        $arrUpdates[] = array($f_arrFrom[0], $f_arrFrom[1], $szColorWhite);
                                    } else {
                                        // Bocht naar links: van up naar left
                                        return Track_Beam("l", $f_arrFrom, array($x, $y));
                                    }
                                } else {
                                    if (!valid_coords($x - 1, $y)) {
                                        // De straal komt uit het veld, zonder U-turn -> twee vakjes kleuren!
                                        if (array($x - 1, $y) == $f_arrFrom) {
                                            // Teruggekaatst -> 1 vakje kleuren
                                            $kleur = $szColorWhite;
                                        } else {
                                            // AB -> Twee vakjes kleuren
                                            $kleur = $szExitColour;
                                            $arrUpdates[] = array($x - 1, $y, $kleur);
                                        }
                                        $arrUpdates[] = array($f_arrFrom[0], $f_arrFrom[1], $kleur);
                                    } else {
                                        // Drie veldjes zijn vrij en volgend veldje is nog binnen het veld
                                        return Track_Beam("u", $f_arrFrom, array($x - 1, $y));
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}