<?php
array(1,1,1,0,0,1,0,0,0,1,0,1,1,0,1,0,0,1,0,0,), array(0,0,0,0,0,0,0,0,0,1,0,0,1,1,1,0,0,0,0,0,), array(0,0,0,0,0,1,0,0,0,0,1,1,0,1,1,1,0,1,0,0,), array(0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,1,), array(0,1,1,0,0,0,0,1,0,0,1,0,1,0,0,1,0,0,0,0,), array(0,0,0,1,0,0,0,1,1,0,0,0,0,0,1,1,0,0,1,0,), array(1,0,0,0,1,0,0,0,1,0,1,1,0,0,0,0,1,0,1,0,), array(0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,), array(0,1,0,1,0,0,0,0,0,1,0,0,1,1,0,1,0,0,0,0,), array(0,1,0,0,1,0,0,0,0,0,0,0,1,0,1,1,0,1,0,0,), array(0,0,0,1,0,0,1,0,0,1,0,1,0,0,0,0,1,1,1,0,), array(0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,1,), array(0,1,0,1,1,1,0,0,0,1,0,0,0,0,0,1,0,0,1,0,), array(0,0,0,0,0,1,0,1,0,0,0,1,1,0,1,1,1,0,0,0,), array(0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,), array(1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,), array(0,0,0,1,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,1,), array(0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,), array(0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,), array(0,0,0,0,0,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,), array(0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,),
);
$shape_nr=1;
$cl_max=count($array[0]); $done=[];
//LOOP ALL CELLS, GIVE 1's unique number
for($ln=0;$ln<$ln_max;++$ln){
for($cl=0;$cl<$cl_max;++$cl){
if($array[$ln][$cl]===0)continue;
$array[$ln][$cl] = $shape_nr;
if($cl+1<$cl_max && $array[$ln][$cl+1] ===1){
$array[$ln][$cl+1] = $shape_nr;
}
++$shape_nr;
}}
//DETECT SHAPES
for($ln=0;$ln<$ln_max;++$ln){
for($cl=0;$cl<$cl_max;++$cl){
if($array[$ln][$cl]===0)continue;
$shape_nr=$array[$ln][$cl];
look_around($ln,$cl,$ln_max,$cl_max,$shape_nr,$array);
$done[]=$shape_nr;
}}
for($ln=0;$ln<$ln_max;++$ln){
for($cl=0;$cl<$cl_max;++$cl){
if($array[$ln][$cl]===0)continue;
if(!isset($res[$array[$ln][$cl]]))$res[$array[$ln][$cl]]=1; else $res[$array[$ln][$cl]]++;
}}
echo 'TOOK: '.($end-$start)."\n";
for($ln=0;$ln<$ln_max;++$ln){
for($cl=0;$cl<$cl_max;++$cl){
if($array[$ln][$cl]===0){echo '░';}
else if($array[$ln][$cl]===$sh_max){
echo '▓';
}
else echo '▒';
}
echo "\n";
}
function look_around($ln,$cl,$ln_max,$cl_max,$nr,&$array){
$mini=mini($ln,$cl,$ln_max,$cl_max);
if($mini===false)return false;
foreach($mini as $v){
if($array[$v[0]][$v[1]]===0){continue;}
if($array[$v[0]][$v[1]]!==$nr){
$array[$v[0]][$v[1]]=$nr;
look_around($v[0],$v[1],$ln_max,$cl_max,$nr,$array);
}
}
return $nr;
}
function mini($ln,$cl,$ln_max,$cl_max){
$look=[];
$mini=[
[-1,-1],
[-1,0],
[-1,1],
[0,-1],
[0,1],
[1,-1],
[1,0],
[1,1]
];
foreach($mini as $v){
if( $ln + $v[0] >= 0 &&
$ln + $v[0] < $ln_max &&
$cl + $v[1] >= 0 &&
$cl + $v[1] < $cl_max
){
$look[]=[$ln + $v[0], $cl + $v[1]];
}
}
if(count($look)===0){return false;} return $look;
}
Cgo8P3BocCAKJGFycmF5ID0gYXJyYXkoCmFycmF5KDEsMSwxLDAsMCwxLDAsMCwwLDEsMCwxLDEsMCwxLDAsMCwxLDAsMCwpLAphcnJheSgwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwxLDEsMSwwLDAsMCwwLDAsKSwKYXJyYXkoMCwwLDAsMCwwLDEsMCwwLDAsMCwxLDEsMCwxLDEsMSwwLDEsMCwwLCksCmFycmF5KDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwxLDEsMSwpLAphcnJheSgwLDEsMSwwLDAsMCwwLDEsMCwwLDEsMCwxLDAsMCwxLDAsMCwwLDAsKSwKYXJyYXkoMCwwLDAsMSwwLDAsMCwxLDEsMCwwLDAsMCwwLDEsMSwwLDAsMSwwLCksCmFycmF5KDEsMCwwLDAsMSwwLDAsMCwxLDAsMSwxLDAsMCwwLDAsMSwwLDEsMCwpLAphcnJheSgwLDAsMCwxLDAsMSwwLDAsMCwwLDAsMCwxLDAsMCwwLDEsMCwwLDAsKSwKYXJyYXkoMCwxLDAsMSwwLDAsMCwwLDAsMSwwLDAsMSwxLDAsMSwwLDAsMCwwLCksCmFycmF5KDAsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDEsMCwxLDEsMCwxLDAsMCwpLAphcnJheSgwLDAsMCwxLDAsMCwxLDAsMCwxLDAsMSwwLDAsMCwwLDEsMSwxLDAsKSwKYXJyYXkoMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDEsMCwwLDEsMCwxLCksCmFycmF5KDAsMSwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMCwwLDEsMCwwLDEsMCwpLAphcnJheSgwLDAsMCwwLDAsMSwwLDEsMCwwLDAsMSwxLDAsMSwxLDEsMCwwLDAsKSwKYXJyYXkoMCwwLDAsMCwxLDAsMSwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLCksCmFycmF5KDEsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMSwwLDAsMSwpLAphcnJheSgwLDAsMCwxLDAsMCwwLDAsMCwwLDEsMCwwLDEsMSwwLDAsMCwwLDEsKSwKYXJyYXkoMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwxLDAsMCwwLCksCmFycmF5KDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwpLAphcnJheSgwLDAsMCwwLDAsMCwxLDAsMCwxLDAsMSwwLDAsMCwwLDAsMCwwLDAsKSwKYXJyYXkoMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLCksCgoKCgoKKTsKCiRzdGFydD1taWNyb3RpbWUodHJ1ZSk7Cgokc2hhcGVfbnI9MTsKJGxuX21heD1jb3VudCgkYXJyYXkpOwokY2xfbWF4PWNvdW50KCRhcnJheVswXSk7CiRkb25lPVtdOwoKLy9MT09QIEFMTCBDRUxMUywgR0lWRSAxJ3MgdW5pcXVlIG51bWJlcgpmb3IoJGxuPTA7JGxuPCRsbl9tYXg7KyskbG4pewpmb3IoJGNsPTA7JGNsPCRjbF9tYXg7KyskY2wpewoJaWYoJGFycmF5WyRsbl1bJGNsXT09PTApY29udGludWU7CgkkYXJyYXlbJGxuXVskY2xdID0gJHNoYXBlX25yOwoJaWYoJGNsKzE8JGNsX21heCAmJiAkYXJyYXlbJGxuXVskY2wrMV0gPT09MSl7CgkkYXJyYXlbJGxuXVskY2wrMV0gPSAkc2hhcGVfbnI7Cgl9CgkrKyRzaGFwZV9ucjsKfX0KCi8vREVURUNUIFNIQVBFUwpmb3IoJGxuPTA7JGxuPCRsbl9tYXg7KyskbG4pewpmb3IoJGNsPTA7JGNsPCRjbF9tYXg7KyskY2wpewoJaWYoJGFycmF5WyRsbl1bJGNsXT09PTApY29udGludWU7CgkKCSRzaGFwZV9ucj0kYXJyYXlbJGxuXVskY2xdOwoJaWYoaW5fYXJyYXkoJHNoYXBlX25yLCRkb25lKSljb250aW51ZTsKCWxvb2tfYXJvdW5kKCRsbiwkY2wsJGxuX21heCwkY2xfbWF4LCRzaGFwZV9uciwkYXJyYXkpOwoJJGRvbmVbXT0kc2hhcGVfbnI7Cn19CQoKJHJlcz1hcnJheSgpOwpmb3IoJGxuPTA7JGxuPCRsbl9tYXg7KyskbG4pewpmb3IoJGNsPTA7JGNsPCRjbF9tYXg7KyskY2wpewoJaWYoJGFycmF5WyRsbl1bJGNsXT09PTApY29udGludWU7CglpZighaXNzZXQoJHJlc1skYXJyYXlbJGxuXVskY2xdXSkpJHJlc1skYXJyYXlbJGxuXVskY2xdXT0xOwoJZWxzZSAkcmVzWyRhcnJheVskbG5dWyRjbF1dKys7Cn19CgokZW5kPW1pY3JvdGltZSh0cnVlKTsKCmVjaG8gJ1RPT0s6ICcuKCRlbmQtJHN0YXJ0KS4iXG4iOwoKJG1heCA9IG1heCgkcmVzKTsKJHNoX21heCA9IGFycmF5X3NlYXJjaCAoJG1heCwgJHJlcyk7CgoKZm9yKCRsbj0wOyRsbjwkbG5fbWF4OysrJGxuKXsKZm9yKCRjbD0wOyRjbDwkY2xfbWF4OysrJGNsKXsKCWlmKCRhcnJheVskbG5dWyRjbF09PT0wKXtlY2hvICfilpEnO30KCWVsc2UgaWYoJGFycmF5WyRsbl1bJGNsXT09PSRzaF9tYXgpewoJCWVjaG8gJ+KWkyc7CgkJfQoJZWxzZSBlY2hvICfilpInOwoJfQplY2hvICJcbiI7Cn0KCgkKZnVuY3Rpb24gbG9va19hcm91bmQoJGxuLCRjbCwkbG5fbWF4LCRjbF9tYXgsJG5yLCYkYXJyYXkpewoJJG1pbmk9bWluaSgkbG4sJGNsLCRsbl9tYXgsJGNsX21heCk7CglpZigkbWluaT09PWZhbHNlKXJldHVybiBmYWxzZTsKCgkkY2hhbmdlPWFycmF5KCk7Cglmb3JlYWNoKCRtaW5pIGFzICR2KXsKCQlpZigkYXJyYXlbJHZbMF1dWyR2WzFdXT09PTApe2NvbnRpbnVlO30KCQlpZigkYXJyYXlbJHZbMF1dWyR2WzFdXSE9PSRucil7CgkJCSRhcnJheVskdlswXV1bJHZbMV1dPSRucjsKCQkJCgkJCWxvb2tfYXJvdW5kKCR2WzBdLCR2WzFdLCRsbl9tYXgsJGNsX21heCwkbnIsJGFycmF5KTsKCQkJfQoJCX0KCXJldHVybiAkbnI7Cgl9CgpmdW5jdGlvbiBtaW5pKCRsbiwkY2wsJGxuX21heCwkY2xfbWF4KXsKCSRsb29rPVtdOwkKCSRtaW5pPVsKCQlbLTEsLTFdLAoJCVstMSwwXSwKCQlbLTEsMV0sCgkJWzAsLTFdLAoJCVswLDFdLAoJCVsxLC0xXSwKCQlbMSwwXSwKCQlbMSwxXQoJCV07Cglmb3JlYWNoKCRtaW5pIGFzICR2KXsKCQlpZigJJGxuICsgJHZbMF0gPj0gMCAmJgoJCQkkbG4gKyAkdlswXSA8ICRsbl9tYXggJiYKCQkJJGNsICsgJHZbMV0gPj0gMCAmJgoJCQkkY2wgKyAkdlsxXSA8ICRjbF9tYXgKCQkJKXsKCQkJJGxvb2tbXT1bJGxuICsgJHZbMF0sICRjbCArICR2WzFdXTsKCQkJfQoJCX0KCQkKCWlmKGNvdW50KCRsb29rKT09PTApe3JldHVybiBmYWxzZTt9CglyZXR1cm4gJGxvb2s7Cgl9Cgo=