explode(',', str_replace(' -> ', ',', $line)), $input); $map = array_fill(0, 1000, array_fill(0, 1000, 0)); foreach ($input as $coordinates) { if ($coordinates[0] === $coordinates[2]) { $start = min([$coordinates[1], $coordinates[3]]); $end = max([$coordinates[1], $coordinates[3]]); for ($i = $start; $i <= $end; $i++) { $map[$coordinates[0]][$i]++; } } if ($coordinates[1] === $coordinates[3]) { $start = min([$coordinates[0], $coordinates[2]]); $end = max([$coordinates[0], $coordinates[2]]); for ($i = $start; $i <= $end; $i++) { $map[$i][$coordinates[1]]++; } } if ($coordinates[0] !== $coordinates[2] && $coordinates[1] !== $coordinates[3]) { $startx = $start = min([$coordinates[0], $coordinates[2]]); $endx = max([$coordinates[0], $coordinates[2]]); $starty = $startx === $coordinates[0] ? $coordinates[1] : $coordinates[3]; $endy = $startx === $coordinates[2] ? $coordinates[1] : $coordinates[3]; $slope = $starty > $endy ? -1 : 1; for ($i = $startx, $step = 0; $i <= $endx; $i++, $step++) { $map[$i][$starty + ($step * $slope)]++; } } } echo count(array_filter(call_user_func_array('array_merge', $map), fn($el) => $el > 1)); //22213