Мой велосипед на PHP (с алгоритмом оптимизированного поиска):
<?php
error_reporting (E_ALL); // включаем лог ошибок
function array_flatten($array) {
$return = array();
foreach ($array as $key => $value) {
if (is_array($value)){ $return = array_merge($return, array_flatten($value));}
else {$return[$key] = $value;}
}
return $return;
}
function rotate90($array) {
array_unshift($array, null);
$array = call_user_func_array('array_map', $array);
$array = array_map('array_reverse', $array);
return $array;
}
$Map = [
[0, 1, 1, 1, 0, 0, 1, 1],
[0, 0, 0, 1, 0, 1, 0, 0],
[1, 0, 1, 0, 0, 0, 0, 1],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 1, 0, 0, 0, 0, 0, 0],
[0, 0, 1, 0, 0, 0, 0, 1],
[0, 1, 0, 0, 1, 0, 0, 0],
[0, 0, 1, 0, 0, 0, 1, 1]
];
$Map90 = array_flatten(rotate90($Map));
$Map = array_flatten($Map);
$s='';
$s90='';
foreach ($Map as $k=>$i) {
$s.=$i;
$s90.=$Map90[$k];
}
echo $s.'<br>';
echo $s90.'<br>';
//убрать переносы на след.строку
$i=0;
do {
$n=strpos($s,'111',$i++);
if ($n) {
if($n%8>5) $i=8*(1+floor($n/8));
else break; //найдено! :)
} else break; //не найдено :(
} while (-1);
//убрать переносы на след.строку
$i=0;
do {
$n90=strpos($s90,'111',$i++);
if ($n90) {
if($n90%8>5) $i=8*(1+floor($n90/8));
else break; //найдено! :)
} else break; //не найдено :(
} while (-1);
if ($n90!==false) {
$n90=(8-$n90%8-3)*8+floor($n90/8); //конвертим в верный индекс
if(!$n||$n&&$n90<$n) $n=$n90; //берём минимальный ближайший к началу.
}
//OUT
if ($n!==false) {
echo "Позиция в массиве (начиная с 0): ".$n.'<br>'; //позиция первого элемента совпадения в "плоском" массиве.
echo "Координаты по X*Y в двумерном массиве: ".($n%8).'x'.floor($n/8); //COLxROW
} else echo "не найдено!";
?>