Temat: Codility - rozwiązania zadań - wyniki

Jeżeli ktoś ma ochotę na odrobinę rywalizacji to zapraszam do podzielenia się swoimi rozwiązaniami zadań treningowych z Codility http://codility.com/train/

Przyczym proszę o zachowanie szablonu:

Nazwa zadania:
Ilość punktów:
Złożoność:
Kod:

Nazwa zadania: falling_disks
Ilość punktów: 67
Złożoność: O(N*M)
Kod:

function solution ( $A,$B ) {

$DNO = count($A);
$ILE = 0;

if($DNO == 1){

if($A[0] >= $B[0]){
return 1;
} else {
return 0;
}

}

if($A[0] < $B[0]){
return 0;
}

foreach ($B as $dysk){

if($A[0] < $dysk){
break;
}

for($k=0 ; $k < $DNO ; $k++){

if($k == $DNO - 1 && $A[$k] >= $dysk){
$ILE++;
$DNO = $k;
break;
}

if($A[$k] < $dysk){
$DNO = $k-1;
$ILE++;
break;
}

}

if($DNO == 0){
break;
}

}

return $ILE;

}

konto usunięte

Temat: Codility - rozwiązania zadań - wyniki

Suma pkt: 73,33

function solution ( $A,$B ) {
$dl = count($A);
$count = 0;
reset($A);
reset($B);
if(count($A) == 1)
{
if(current($A) >= current($B)) return 1;
else return 0;
}
if(current($A) < current($B)) return 0;

do
{
if($A[0] < current($B)) break;
$n=-1;
do
{
$n++;
if($count==count($B)-1) return $count;
if($n == $dl - 1 && current($A) >= current($B)){
$count++;
$dl = $n;
break;
}
if(current($A) < current($B)){
$dl = $n-1;
$count++;
break;
}
} while (false !== next($A) && $n<=$dl);
if($dl == 0) break;
} while (false !== next($B));
return $count;
}


Chętnie zobaczę solucję za setkę... :)
Piotr Jasiulewicz

Piotr Jasiulewicz PHP/Java
professional

Temat: Codility - rozwiązania zadań - wyniki

A ktore to zadanie? Tam nie ma podzialu na nazwy, tylko jakies sesje?

Temat: Codility - rozwiązania zadań - wyniki

Wojciech M.:

Chętnie zobaczę solucję za setkę... :)

Może być ciężko ponieważ PHP ma chyba źle dobrane (za krótkie) limity czasu wykonania. Wnioskuję po tym, że trochę inny mój algo ale tak samo trywialny O(N*M) jak wyżej przepisany 1:1 na C dostał dużo więcej punktów w tym przeszedł jedno z zadań High Load.Ten post został edytowany przez Autora dnia 12.05.13 o godzinie 12:07

Temat: Codility - rozwiązania zadań - wyniki

Piotr J.:
A ktore to zadanie? Tam nie ma podzialu na nazwy, tylko jakies sesje?

Najnowsze - Omega 2013
Ale możesz robić dowolne.Ten post został edytowany przez Autora dnia 12.05.13 o godzinie 12:05

konto usunięte

Temat: Codility - rozwiązania zadań - wyniki

Piotr R.:
Wojciech M.:

Chętnie zobaczę solucję za setkę... :)

Może być ciężko ponieważ PHP ma chyba źle dobrane (za krótkie) limity czasu wykonania. Wnioskuję po tym, że trochę inny mój algo ale tak samo trywialny O(N*M) jak wyżej przepisany 1:1 na C dostał dużo więcej punktów w tym przeszedł jedno z zadań High Load.

Kwestia optymalizacji. Zaproponowane przeze mnie rozwiązanie przechodzi przez wszystkie próby czasu wykonania, ale niestety nie ująłem w nim dodatkowych warunków, które spełniałyby wszystkie założenia obliczeniowe, co skutkuje zwracaniem błędnych wyników w poszczególnych przypadkach testowania.

Reasumując w 11 przypadkach zwraca dobry wynik, a próbę czasu wykonania przechodzi na wszystkich testach.

Temat pozostaje otwarty...

Temat: Codility - rozwiązania zadań - wyniki

Wojciech M.:
Piotr R.:
Wojciech M.:

Chętnie zobaczę solucję za setkę... :)

Może być ciężko ponieważ PHP ma chyba źle dobrane (za krótkie) limity czasu wykonania. Wnioskuję po tym, że trochę inny mój algo ale tak samo trywialny O(N*M) jak wyżej przepisany 1:1 na C dostał dużo więcej punktów w tym przeszedł jedno z zadań High Load.

Kwestia optymalizacji. Zaproponowane przeze mnie rozwiązanie przechodzi przez wszystkie próby czasu wykonania, ale niestety nie ująłem w nim dodatkowych warunków, które spełniałyby wszystkie założenia obliczeniowe, co skutkuje zwracaniem błędnych wyników w poszczególnych przypadkach testowania.

Reasumując w 11 przypadkach zwraca dobry wynik, a próbę czasu wykonania przechodzi na wszystkich testach.

Temat pozostaje otwarty...

Nawet słowo pisane potrafi być mylące. Nie miałem na myśli twojego kodu tylko swój. A twoje rozwiązanie cacy :) Fakt wywala się na paru przypadkach szczególnych ale dobry kandydat na 100% :)Ten post został edytowany przez Autora dnia 12.05.13 o godzinie 13:12

konto usunięte

Temat: Codility - rozwiązania zadań - wyniki

Sumka pkt: 100


function solution ( $A,$B ) {
$count = 0;
$minimum = $A[0];
$n = count($A)-1;
for($i=0; $i<count($A); $i++)
{
if($A[$i]<$minimum) $minimum = $A[$i];
if($A[$i]>$minimum) $A[$i] = $minimum;
}
end($A);
do
{
if(current($A) >= $B[$count]) $count++;
if(key($A) == 0) return $count;
prev($A); } while(key($A)>=0 && $count < count($B));
return $count;
}


Setka na miły początek tygodnia :)

Temat: Codility - rozwiązania zadań - wyniki

Nazwa zadania: prefix_set (Alpha 2010)
Ilość punktów: 100
Złożoność: O(N)
Kod:


$R = array_unique($A, SORT_NUMERIC);
end($R);
return key($R);


Zaczynają się sypać setki - dobrze :)
Te zadanie nie jest wybitnie trudne ale ze zwięzłości zapisu jestem dumny ;)
Jak ktoś ma ochotę pogłówkować to da się jeszcze przyspieszyć (jakieś 30%) kosztem zwięzłości zapisu i bazując na fakcie, że klucze tablic są domyślnie uporządkowane. Jak nikt chętny się nie znajdzie do następnego poniedziałku to podam też ten szybszy kod.

Pozdrawiam
Alan Gabriel B.

Alan Gabriel B. Software Engineer,
IFX

Temat: Codility - rozwiązania zadań - wyniki

Piotr R.:
Jak ktoś ma ochotę pogłówkować to da się jeszcze przyspieszyć (jakieś 30%) kosztem zwięzłości zapisu i bazując na fakcie, że klucze tablic są domyślnie uporządkowane.


function solution ( $A ) {

$values = array_flip($A);

foreach ($values as &$value) {
$value = null;
}

$current = array(); // current values
for ($i = 0, $n = count($A); $i < $n; $i++) {
$current[$A[$i]] = null;

if ($current == $values) {
break;
}

}

return $i;
}

Temat: Codility - rozwiązania zadań - wyniki

Nazwa zadania: Beta 2010
Ilość punktów: 53
Złożoność: O(n^2)
Kod:

function solution ( $A ) {

$sizeA = count($A);
$intersections = 0;
$DISKS = array();

foreach ($A as $key => $entry){

$tig = $key+$entry;
if($tig > $sizeA) $tig = $sizeA;

$tid = $key-$entry;
if($tid < 0) $tid = 0;

$DISKS[$key] = new stdClass();
$DISKS[$key]->id = $tid;
$DISKS[$key]->ig = $tig;

}

foreach ($A as $key => $disk){

for($a = $key+1 ; $a < $sizeA ; $a++){

if($a != $key && $DISKS[$key]->ig >= $DISKS[$a]->id){

$intersections++;

}
if($intersections > 10000000) return -1;
}

}
return $intersections;
}


Poprawne ale mało wydajne rozwiązanie bazujące na przedziałach. Jawnie wprowadziłem na początku dodatkową tablicę trzymającą nową reprezentację danych wejściowych aby łatwiej się czytało.Ten post został edytowany przez Autora dnia 17.05.13 o godzinie 15:27
Michał Szymczak

Michał Szymczak Lead programmer

Temat: Codility - rozwiązania zadań - wyniki

Na zyczenie, Beta 2010, rozwiązanie na 100%, zlozonosc O(N).
Zeby bylo bardziej rozrywkowo, porozdzielalem odpowiedzialnosc na obiekty, wiec mozna sie wgryzac w kod stopniowo. Najwazniejszy trick to metoda countOverlapingDiscs , ktora uwzglednia 'kumulacje' i dzieki temu mamy zlozonosci liniowa. Tak na marginesie na to rozwiazanie w pare minut wpadla moja dziewczyna ktora nie ma pojecia o zlozonosci i programowaniu :D



function solution($A) {
$plane = new Plane(0, count($A) - 1);
$disc = new Disc($plane);
for ($discCentre = 0; $discCentre <= $plane->getMaxRightPointOnAxis(); $discCentre++) {
$discRadius = $A[$discCentre];
$plane->addDisc(Disc::configureAndGetDisk($disc, $discCentre, $discRadius));
}
return $plane->countOverlapingDiscs();
}

class Disc {
private $maxRightPointOnAxis;
private $minLeftPointOnAxis;
private $leftRange;
private $rightRange;
public function __construct(Plane $plane) {
$this->maxLeftPointOnAxis = $plane->getMaxLeftPointOnAxis();
$this->maxRightPointOnAxis = $plane->getMaxRightPointOnAxis();
}
public static function configureAndGetDisk($usedDisc, $centre, $radius) {
$usedDisc->leftRange = max($usedDisc->maxLeftPointOnAxis, $centre - $radius);
$usedDisc->rightRange = min($usedDisc->maxRightPointOnAxis, $centre + $radius);
return $usedDisc;
}
public function getLeftRange()
{
return $this->leftRange;
}
public function getRightRange()
{
return $this->rightRange;
}
}

class Plane {
private $maxRightPointOnAxis;
private $minLeftPointOnAxis;
private $discsBoundaries = array();
public function __construct($maxLeftPointOnAxis, $maxRightPointOnAxis) {
$this->maxLeftPointOnAxis = $maxLeftPointOnAxis;
$this->maxRightPointOnAxis = $maxRightPointOnAxis;
}
public function getMaxLeftPointOnAxis() {
return $this->maxLeftPointOnAxis;
}
public function getMaxRightPointOnAxis() {
return $this->maxRightPointOnAxis;
}
public function addDisc(Disc $disc) {
if (!isset($this->discsBoundaries[$disc->getLeftRange()])) {
$this->discsBoundaries[$disc->getLeftRange()] = array('L' => 0, 'R' => 0);
}
if (!isset($this->discsBoundaries[$disc->getRightRange()])) {
$this->discsBoundaries[$disc->getRightRange()] = array('L' => 0, 'R' => 0);
}
$this->discsBoundaries[$disc->getLeftRange()]['L']++;
$this->discsBoundaries[$disc->getRightRange()]['R']++;
}
public function getSequenceOfBoundaries() {
$boundariesSequence = array();
for ($position = $this->maxLeftPointOnAxis; $position <= $this->maxRightPointOnAxis; $position++) {
if(isset($this->discsBoundaries[$position])) {
$boundaries = $this->discsBoundaries[$position];
for($i = 0; $i < $boundaries['L']; $i++) {
$boundariesSequence[] = 'L';
}
for($i = 0; $i < $boundaries['R']; $i++) {
$boundariesSequence[] = 'R';
}
}
}
return $boundariesSequence;
}
public function countOverlapingDiscs() {
$sumOfOverlaps = 0;
$maxValue = 10000000;
$defaulValueWhenTooMuchOverlapings = -1;
$discsCumulation = 0;
foreach($this->getSequenceOfBoundaries() as $boundaryType) {
if ('L' === $boundaryType ) {
$sumOfOverlaps = $sumOfOverlaps + $discsCumulation;
if ($sumOfOverlaps > $maxValue) {
return $defaulValueWhenTooMuchOverlapings;
}
$discsCumulation++;
} else {
$discsCumulation--;
}
}
return $sumOfOverlaps;
}
}

Temat: Codility - rozwiązania zadań - wyniki

Pogratulować inteligentnej dziewczyny. BTW nie trzeba być programistą aby znaleźć rozwiązanie. Paradoksalnie bycie programistą potrafi czasem utrudniać :)



Wyślij zaproszenie do