||
const year = prompt('В каком году появилась спецификация ECMAScript-2015?');
alert( year == '2015' || year == '2016' ? 'правильно' : 'неправильно' );
x > y
, значит, x = y + ненулевое_число
. Можно так перезаписать слагаемые:m = k0
z = m + k1 = k0 + k1
y = z + k2 = k0 + k1 + k2
x = y + k3 = k0 + k1 + k2 + k3
-----------------------------
m+z+y+x = 4k0 + 3k1 + 2k2 + k3 = SUM
ki — это натуральные числа от 1. k
— вычислили x, y, z, m.k0
k1..k3
уходит минимум 6, когда все по 1,k0
остаётся диапазон [1, (SUM - 6) / 4]
k0
должен быть целым.k0
в этом диапазоне, SUM1 = SUM - 4 * k0
,3k1 + 2k2 + k3 = SUM1
k3
это весь остаток.const addUpTo = (top, n) => {
const getDiffs = (sum, n, acc = []) => {
if (n === 1) {
x = sum;
} else {
const headroom = (n - 1) * n / 2;
const cap = Math.floor((sum - headroom) / n);
if (cap < 1) throw("Impossible. " + JSON.stringify(acc));
x = 1 + Math.floor(Math.random() * cap);
}
acc.push(x);
if (n <= 1) {
return acc;
} else {
return getDiffs(sum - x * n, n - 1, acc);
}
}
return getDiffs(top, n).map((_, i, a) => a.reduce((acc, c, j) => j <= i ? acc + c : acc)).reverse();
}
addUpTo(100, 4) /*
[ 34, 30, 21, 15 ]
[ 31, 24, 23, 22 ]
[ 66, 17, 13, 4 ]
[ 47, 22, 21, 10 ]
...
*/
addUpTo(10, 4) // [ 4, 3, 2, 1 ]
addUpTo(9, 4) // ошибка, невозможно разложить
$timestamp = date('2020-03-29T23:59:00+03:00'); // +03:00 потому что по МСК
echo "<script>const theMoment = ${timestamp};</script>";
const checkTime = (ts) => {
if (Date.now() < ts) return setTimeout(() => checkTime(ts), 1000);
// время пришло
document.getElementById('price').innerText = '39 990';
}
checkTime(theMoment * 1000); // в JS timestamp считается в миллисекундах
// а из PHP приходит в целых секундах
<p>
Специальная цена на наш утюг: <span id="price">29 990</span>
<br>
действует до 30 марта!
</p>
indexOf()
this.children
, а хочется.[]
и его метод indexOf
call()
(подробнее)indexOf
в качестве this
(где искать) — this.children
,event.target
event.target
среди this.children
-1
, если не нашлось. test()
можно обернуть исходные функции с их аргументами в функции:function test(fn1, fn2){
if(fn1()){
console.log('blabla');
} else {
fn2();
}
}
// в вызове оборачивайте в функции:
test(() => real_function1(arg0, arg1), () => real_function2(arg3));
test(real_func1.bind(null, arg1, arg2), real_func2.bind(null, arg3));
d
делается с помощью тега animate
, где указываются атрибуты from
и to
– состояния из которого, и куда.d
, но останется ощущение «шагов» в таком движении.city
объекта user — опционально.friends.items[42]
– возможно, кто-то не указал свой город, и ваш скрипт не создал для него поле coords
.else
в условии if (item.city) {
// ...
}
const langTests = {
'en': textEn,
'ru': textRu,
};
const getText = (lang) => {
const tests = langTests[lang];
return tests[Math.floor(Math.random() * tests.length)];
}
let language = 'en';
getText(language) // 'test2'
filter-name
,arr.reduce((acc, cur) => {
if (cur.name === 'filter-name') acc.push({});
acc[acc.length - 1][cur.name] = cur.value;
return acc;
}, []);
'1'
и заголовок становится 2 - click again!1
indexOf()
начнёт ошибаться — а номер заголовка.const headers = ['Мойте руки', 'Сидите дома', 'Помогайте соседям', ];
let currentHeader = 0;
$('#header').on('click', function() {
$(this).text(headers[currentHeader]);
currentHeader += 1;
currentHeader %= headers.length;
});
qq
, raysa
, j
?qq
у всех лучей рано или поздно становится 1
и у них перстают обновляться координаты.isStopped
const ctx = document.getElementById("canvas").getContext("2d");
const gun = {
x: 10,
y: 10,
}
const rays = [];
const blocks = [];
for (let i = 0; i < 20; i++) {
rays.push({x: 0, y: 0,
angle: i,
radius: 0,
isStopped: false,
raysa: 0
});
}
blocks.push({x: 20, y: 20});
function draw() {
rays.forEach(ray => {
const radians = ray.angle / 180 * Math.PI;
if (!ray.isStopped) {
ray.x = Math.cos(radians) * ray.raysa + gun.x;
ray.y = Math.sin(radians) * ray.raysa + gun.y;
ray.radius = ray.raysa;
if (ray.x >= 100) ray.isStopped = true;
ray.raysa += 1;
if (ray.isStopped) {
ray.x = Math.cos(radians) * ray.radius + gun.x;
ray.y = Math.sin(radians) * ray.radius + gun.y;
}
}
ray.angle += 2;
if (i % 10 == 0) console.log(ray.angle);
ctx.clearRect(0, 0, 320, 320);
ctx.beginPath();
ctx.moveTo(gun.x, gun.y);
ctx.lineTo(ray.x, ray.y);
ctx.stroke();
});
}
//setInterval(draw,20);
const src = '"По приказу ОАО "Рога и Копыта""';
src.split('').reduce((acc,c,i,arr) => {
if (c === '"') {
const prev = i ? arr[i - 1] : '';
if (i && prev !== ' ') {
if (prev === '"') return acc;
acc += '»';
} else {
acc += '«';
}
} else {
acc += c;
}
return acc;
}, '')
const requote = source => {
const Q_OPEN = 1;
const Q_CLOSE = 2;
const SPACE = 3;
const OTHER = 4;
let prev = SPACE;
return source.split('').reduce((acc, c, i, arr) => {
if (c === '"') {
if (prev !== SPACE) {
if (prev === Q_CLOSE) return acc;
acc += '»';
prev = Q_CLOSE;
} else {
acc += '«';
prev = Q_OPEN;
}
} else {
acc += c;
prev = c === ' ' ? SPACE : OTHER;
}
return acc;
}, '')
}
requote(src)