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); } }
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; } }
function leftmost($list) { return is_atom(car($list)) ? car($list) : leftmost(car($list)); }
function is_lat($list) { return is_null($list) ? true : (is_atom(car($list)) ? is_lat(cdr($list)) : false); }
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)); } } } } } } } } } }