'1'
и заголовок становится 2 - click again!1
indexOf()
начнёт ошибаться — а номер заголовка.const headers = ['Мойте руки', 'Сидите дома', 'Помогайте соседям', ];
let currentHeader = 0;
$('#header').on('click', function() {
$(this).text(headers[currentHeader]);
currentHeader += 1;
currentHeader %= headers.length;
});
[x0, x1, ... xN]
.y_true = [f(x0), f(x1), ... f(xN)]
x
получить их «предсказания» y_pred = [Fn(x0), Fn(x1), ... Fn(xN)]
y_true - y_pred
выданных каждой из функций на наборе входных значений x
x = [1, 2, 4, 8, 16, 32, 64]
f(x) = [y0, y1, y2, y3, y4, y5, y6]
// n
[1, 2, 4, 8, 16, 32, 64]
sum = (y0 - 1)^2 + (y1 - 2)^2 + (y2 - 4)^2 + ... + (y6 - 64)^2 = sum0
// n^2
[1, 4, 16, 64, 256, 1024, 4096]
sum = (y0 - 1)^2 + (y1 - 4)^2 + (y2 - 16)^2 + ... + (y6 - 4096)^2 = sum1
// так же посчитать суммы ошибок для остальных функций:
// n * log(n), n!
sumN
укажет функцию, наиболее близкую к искомой. 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)
if (A > C) [A, C] = [C, A]; // поменять местами значения A и C
// теперь точно A < B < C
if (X < A) { // вар. 0
} else if (X == A) { // вар. 1
} else if (X < B) { // вар. 2
} else if (X == B) { // вар. 3
} else if (X < C) { // вар. 4
} else if (X == C) { // вар. 5
} else { // X > C // вар. 6
}
A > B > C
и A < B < C
вроде бы подтвердилась, поэтому оставлю первый шаг, где меняем местами A и C, чтобы последовательность точно была возрастающей.0 1 2 3 4 5 6
---o-----o-----o---
A B C
0 1 0 1 0 1 0 1
0 0 1 1 0 0 1 1
0 0 0 0 1 1 1 1
if (A > C) [A, C] = [C, A]; // поменять местами значения A и C
// теперь точно A < B < C
if (X > B) {
if (X > C) { // вар. 6
} else {
if (X == C) { // вар. 5
} else { // вар. 4
}
}
} else {
if (X > A) {
if (X == B) { // вар. 3
} else { // вар. 2
}
} else {
if (X == A) { // вар. 1
} else { // вар. 0
}
}
}
Так менее наглядно и читаемо, но сэкономили на спичках – меньше проверок.username.github.io
, и корень этого репо будет корнем сайта.