int n1 = 5, n2 = 5;
int a1[10] = {1, 4, 9, 12, 54};
int a2[] = {99, 17, 9, 8, 4};
int i1 = 0, i2 = n2-1, i = n1+n2-1;
while (i >= 0) {
if (i1 > n1-1) {
a1[i--] = a2[i2--];
} else if (i2 < 0) {
i = -1;
} else if (a1[i1] < a2[i2]) {
a1[i--] = a1[i1++];
} else {
a1[i--] = a2[i2--];
}
}
function makeBasket($sum, $prices, $result) {
if ($sum % $prices[0] == 0) {
return array_merge($result, [$sum / $prices[0]]);
}
if (count($prices) == 1) {
return false;
}
for ($i = 0; $i <= $sum / $prices[0]; $i++) {
$res = makeBasket($sum - $prices[0] * $i, array_slice($prices, 1), array_merge($result, [$i]));
if ($res != false) {
return $res;
}
}
return false;
}
$prices = array_values($accessories[$article]);
$res = makeBasket($accessoriesSum, $prices, []);
$result = [];
$i = 0;
foreach ($accessories[$article] as $key => $val) {
if (($i < count($res)) && ($res[$i] != 0)) {
$result[$key] = $res[$i];
}
$i++;
}
print_r($result);
- в пустой (мёртвой) клетке, рядом с которой ровно три живые клетки, зарождается жизнь;
- если у живой клетки есть две или три живые соседки, то эта клетка продолжает жить; в противном случае, если соседей меньше двух или больше трёх, клетка умирает («от одиночества» или «от перенаселённости»)
function nod(m, n) {
var mult = 0;
while (true) {
if (0 == m) {
return n << mult;
}
if (0 == n) {
return m << mult;
}
if (1 == m || 1 == n) {
return 1 << mult;
}
if (m == n) {
return m << mult;
}
if (0 == (m & 1) && 0 == (n & 1)) {
mult++;
m >>= 1;
n >>= 1;
} else if (0 == (m & 1)) {
m >>= 1;
} else if (0 == (n & 1)) {
n >>= 1;
} else if (m > n) {
m = (m-n) >> 1;
} else {
n = (n-m) >> 1;
}
}
}
function reduceFrac(numerator, denomerator) {
var divider = nod(numerator, denomerator);
return {n: numerator/divider, d: denomerator/divider};
}
$intervals =
[['start' => '2017-01-01', 'end' => '2017-01-06'],
['start' => '2017-01-21', 'end' => '2017-01-30'],
['start' => '2017-01-10', 'end' => '2017-01-20'],
['start' => '2017-01-05', 'end' => '2017-01-16'],
['start' => '2017-01-15', 'end' => '2017-01-20']];
function is_intersect($int1, $int2) {
return ($int2['end'] >= $int1['start'] && $int1['end'] >= $int2['start']);
}
function combine($int1, $int2) {
if (!isset($int1['subintervals'])) {
$int1['subintervals'] = [$int1];
}
if (!isset($int2['subintervals'])) {
$int2['subintervals'] = [$int2];
}
return array('start' => min($int1['start'], $int2['start']), 'end' => max($int1['end'], $int2['end']),
'subintervals' => array_merge($int1['subintervals'], $int2['subintervals']));
}
function combine_intersected($intervals) {
$result = [];
$noIntersects = true;
foreach ($intervals as $int1) {
$combined = false;
foreach ($result as &$int2) {
if (is_intersect($int1, $int2)) {
$int2 = combine($int1, $int2);
$noIntersects = false;
$combined = true;
break;
}
}
if (!$combined) {
$result[] = $int1;
}
}
if ($noIntersects) {
return false;
}
return $result;
}
while ($ints = combine_intersected($intervals)) {
$intervals = $ints;
}
Array (
[0] => Array (
[start] => 2017-01-01
[end] => 2017-01-20
[subintervals] => Array (
[0] => Array (
[start] => 2017-01-10
[end] => 2017-01-20
)
[1] => Array (
[start] => 2017-01-15
[end] => 2017-01-20
)
[2] => Array (
[start] => 2017-01-05
[end] => 2017-01-16
)
[3] => Array (
[start] => 2017-01-01
[end] => 2017-01-06
)
)
)
[1] => Array (
[start] => 2017-01-21
[end] => 2017-01-30
)
)
SELECT *
FROM `table`
ORDER BY (`phone` = :phone) * 8 +
(`lastName` = :lastName) * 2 +
(`firstName` = :firstName) * 2 +
(`middleName` = :middleName) * 2 +
(`city` = :city)
DESC