function chooseBestSum(t, k, ls) {
/**
* make next combination of N on bits in a 32-bit integer
*/
function nextPerm(x) {
// via https://stackoverflow.com/questions/506807/creating-multiple-numbers-with-certain-number-of-bits-set
if (x === 0) return 0;
const smallest = (x & -x);
const ripple = x + smallest;
const new_smallest = (ripple & -ripple);
const ones = ((new_smallest/smallest) >> 1) - 1;
return ripple | ones;
}
let bestSum = null, bestN;
const len = ls.length;
if (len > 31) throw "Too many (over 31) options for this algorithm";
const maxmask = (1 << len) - 1;
if (len < k) return null; // not enough distances
ls.sort((a, b) => a - b); // todo: skip checking rest of combinations once solid selection of elements exceeds t
let mask = (1 << k) - 1; // initial mask value with k less significant bits on
let sum, pos, n;
while(true) {
for(sum = 0, n = 0, pos = 0; pos < 32; pos++) {
if (mask & (1 << pos)) {
sum += ls[pos];
if (++n === k) break;
}
}
if (sum > bestSum && sum <= t) {
bestSum = sum;
bestN = mask;
}
mask = nextPerm(mask);
if (mask > maxmask) break;
if (mask < 0) break;
}
return bestSum;
}
N
на остаток деления S % n = 0
Вдруг, найдётся число, которое надо просто повторить m
раз, чтобы получить S
N
на разницу: если найдётся разница в 1, можно получить любое число через эти дваN
Подзадача та же, получить 1. Есть 1 – есть любое целое.npm install --save-dev script-loader
import exec from 'script-loader!./script.js';
const data = [
[ '6', 'Shorter', '157' ],
[ '7', 'Fraser', '157' ],
[ '6', 'Chandter', '156' ]
// ...
];
const result = data.reduce((acc, cur) => {
acc.forEach((el, idx) => {el.push(cur[idx])});
return acc;
}, [[], [], []]);
// [["6","7","6"],["Shorter","Fraser","Chandter"],["157","157","156"]]
var numbers = [1,-3,5,-6,-10,13,4,-8];
var arr = numbers.slice(), sum = 0;
while((sum += arr.shift()) !== 0); // изысканный пустой while !
var index = numbers.length - arr.length - 1; // 5
function sum0(arr, idx = 0, sum = 0) {
if ((sum += numbers[idx]) === 0) return idx;
return sum0(arr, idx + 1, sum);
}
sum0([1,-3,5,-6,-10,13,4,-8]) // 5
Этот метод можно вызвать с ключом доступа пользователя, полученным в Standalone-приложении через Implicit Flow, или с использованием окна подтверждения. Требуются права доступа: wall.
Доступ к обычным и расширенным методам работы со стеной.
Данное право доступа по умолчанию недоступно для сайтов (игнорируется при попытке авторизации для приложений с типом «Веб-сайт» или по схеме Authorization Code Flow).
const maker = message => new Promise((res, rej) => {
const v = window.prompt(message);
if (v.length) res(v);
else rej(["Пустой ответ", message, v]);
});
const pAge = maker("Введите ваш возраст");
const pPwd = pAge.then(age => {
if (parseInt(age) > 18) return maker("Введите пароль");
else return Promise.reject("Возраст не подходит");
});
Promise.all([pAge, pPwd])
.then((age, pwd) => {
console.log("Получили и норм. возраст и пароль:", age, pwd);
// пляшем дальше
})
.catch(err => console.error("Что могло пойти не так?", err))
;
function appendValue($key, $value) {
$filepath = "./config.txt"; // путь к файлу
if (!file_exists($filepath)) throw "File not found";
$divider = PHP_EOL; // разделитель строк
$rows = explode($divider, file_get_contents($filepath));
$tmpfname = tempnam(sys_get_temp_dir(), 'Toster');
$fh = fopen($tmpfname, 'w');
$replaced = 0;
foreach($rows as $row) {
$data = explode(':', $row);
if (0 === count($data)) continue;
if ($data[0] == $key) {
array_push($data, $value);
$row = implode(':', $data);
$replaced++;
}
fputs($fh, $row . $divider);
}
fclose($fh);
// поменять файлы местами
unlink($filepath);
rename($tmpfname, $filepath);
return $replaced; // кол-во обновлённых строк. Вдруг, неуникален индекс?
}
appendValue(2, 33);