
Originariamente inviata da
RoTeam
Andiamo sul personale
Codice PHP:
abstract class IResettableArray
{
protected $array;
public function reset()
{
$this->array = [];
}
}
class IntegrableArray extends IResettableArray
{
public function __construct(array $arr)
{
foreach($arr as $num)
$this->add($num);
}
public function add($e)
{
if(is_numeric($e))
$this->array[] = $e;
else
throw new Exception("Sono permessi solo numeri");
}
public function count()
{
return count($this->array);
}
public function getArray()
{
return $this->array;
}
}
class MaxUniqueSumBuilder extends IResettableArray
{
public function computeSum()
{
$maxs = array_map('max',$this->array);
$sum = [];
foreach($this->array as $k => $arr)
{
$max = max($arr);
unset($maxs[$k]);
while(in_array($max,$maxs) && count($arr)>0)
{
$arr = array_diff($arr,[$max]);
$max = max($arr);
}
if(is_numeric($max)) $sum[] = $max;
}
return new ComputedSum($sum);
}
public function addMultiArray(array $arr)
{
foreach($arr as $ia)
if($ia instanceof IntegrableArray)
$this->addArray($ia);
}
public function addArray(IntegrableArray $arr)
{
$this->array[] = $arr->count()>0 ? $arr->getArray() : [0];
}
}
class ComputedSum extends IntegrableArray
{
public function __construct(array $max)
{
parent::__construct($max);
}
public function getSum()
{
return array_sum($this->array);
}
}
$array = [new IntegrableArray([30,29]),new IntegrableArray([30,23,21,20])];
$builder = new MaxUniqueSumBuilder();
$builder->addMultiArray($array);
echo $builder->computeSum()->getSum();