Să presupunem că avem la dispoziție un calculator cu putere de procesare nelimitată, dar cu foarte puțină memorie RAM. Ne propunem să optimizăm memoria printr-un script ce presupune crearea a două funcții: una de “arhivare” a unui array și a doua de căutare în acest array.
Avem și câteva reguli pe care vă rugăm să le respectați:
1: Se va utiliza doar PHP
2: Se va modifica doar în cele două funcții
3: Nu se vor folosi: Memcached, apc, files, alt thread…. ETC.
4: Nu trișați!
5: Fiecare poate afișa noul record ori de câte ori… obține unul!
function getMem() {
$mem = memory_get_usage(true) / 1024;
return $mem;
}
$array = range(1,1000000);
shuffle($array);
$mem = getMem();
$string = compress($array);
echo 'You used : ',getMem() - $mem,' Kb',PHP_EOL;
function compress($array){
/** TODO create a compress function**/
return implode(',',$array);
}
function get($nr,$string) {
/** TODO create get function**/
$x = explode(',',$string);
return $x[$nr];
}
for($i = 0;$i <100; $i++) {
$test = rand(0,1000000-1);
if($array[$test] != get($test,$string)) {
try {
throw New Exception('You failed!!!');
} catch(Exception $e) {
echo $e->getMessage();die;
}
}
}
echo 'You Win',PHP_EOL;
echo date('Y-m-d H:i:s'),PHP_EOL;
Acest test a fost propus de Alin, Team Leader @INNOBYTE.
Care este al vostru?
Mda, eu recunosc, am incercat ceva (sa scriu numerele in binar apoi sa folosesc RLE) dar nu a iesit nimic cat de cat aproape de recordul vostru (sau macar decent) si… n-am mai insistat.
Insa, mor de curiozitate sa vad algoritmul ala cu care ziceati ca ati ajuns la 512kb.
Emil, noi (alin) a doborat orice record cu secventa:
function get($nr,$string) {
$x = floor($nr / 1000) + 1;
$y = $nr % 1000;
$rgb = imagecolorat($string, $x, $y);
return $rgb;