Advent of code 2019/4
Ajax Direct

Answer

Part 1 :
Part 2 :
// ==================================================
// > SOLUTION 1 - ~500ms
// ==================================================
$solution_1 = 0;
foreach ($input->range as $pwd) {

    $pwd = (string) $pwd;
    $cons = false;
    $desc = false;

    for ($i = 0; $i <= strlen($pwd) - 2; $i++) {

        if ($pwd[$i] == $pwd[$i + 1]) {
            $cons = true;
        }

        if ($pwd[$i] > $pwd[$i + 1]) {
            $desc = true;
        }
    }

    if ($cons && !$desc) {
        $solution_1++;
    }
}

// ==================================================
// > SOLUTION 1 - ~500ms
// ==================================================
$decreas = set(range(9, 1))->map(fn ($i) => set(range($i - 1, 0))->map(fn ($j) => "$i$j")->join("|"))->join("|");
$couples = set(range(0, 9))->map(fn ($i) => "$i$i")->join("|");

$solution_1 = $input->range->filter(
    fn ($number) => !preg_match("/($decreas)/", $number) && preg_match("/($couples)/", $number)
)->count();

// ==================================================
// > SOLUTION 1 - ~120ms
// ==================================================
$digits = $input->range->join("\n") . "\n";
$digits = preg_replace("/[0-9]*($decreas)[0-9]*\n/", "", $digits);
$digits = preg_replace("/[0-9]*($couples)[0-9]*\n/", "+\n", $digits);
$digits = preg_replace("/[0-9].*\n/", "", $digits);
$solution_1 = count(explode("\n", trim($digits)));


// ==================================================
// > SOLUTION 2
// ==================================================
$trouples = set(range(0, 9))->map(fn ($i) => "$i$i$i$i$i$i|$i$i$i$i$i|$i$i$i$i|$i$i$i")->join("|");

$solution_2 = $input->range->filter(
    fn ($number) => !preg_match("/($decreas)/", $number) && (($number = preg_replace("/($trouples)/", "", $number)) && preg_match("/($couples)/", $number))
)->count();