Когда конечный автомат переходит из одного состояния в другое, он выполняет какие-то действия?Может выполнять. Скажем, для распознавания ключевых слов достаточно знать, в каком допускающем состоянии оказался автомат, а вот для распознавания чисел уже необходимо при переходе выполнять дополнительные действия.
Могут ли из одного состояния в другое, передаваться параметры, как из одной функции в другую?Кроме текущего состояния автомат может помнить какой-то набор параметров, не влияющих на переходы, но меняющийся при переходах. Пример - то же самое распознавание чисел. Автомат должен вычислить/запомнить знак, мантиссу и значение степени.
Что это за входная строка такая? Можно ли обойтись без неё?Входная строка - это строка, состоящая из входных символов, которые управляют переходом автомата из состояния в состояние. Для чисел это будет набор символов
+-123456789.e
. Без входной строки автомату нечего будет распознавать. a = 0;
for (x = 0; 2 * x <= 30; x += 1) {
for (y = 0; 2 * x + 3 * y <= 30; y += 1) {
if (a < x + y) {
a = x + y;
}
}
}
const littleN = (arr, N) => arr.reduce(
(acc, cur) => {
const idx = acc.findIndex((el) => el.distance > cur.distance);
if (idx !== -1) {
acc.pop();
acc.splice(idx, 0, cur);
}
return acc;
},
Array(N).fill(arr[0])
);
// Матрица переходов конечного автомата
// -1 - допустимое конечное состояние
// null - недопустимое состояние
const dka = [
[-1, 1, 5, 4, 10, 9, 15, 14], // 0
[-1, 2, 5, 4, 10, 9, 15, 14], // 1
[-1, 3, 5, 4, 10, 9, 15, 14], // 2
[-1, null, 5, 4, 10, 9, 15, 14], // 3
[-1, 8, 8, 7, null, null, null, null], // 4
[-1, null, null, 6, 10, 9, 15, 14], // 5
[-1, null, null, 7, 10, 9, 15, 14], // 6
[-1, null, null, 8, 10, 9, 15, 14], // 7
[-1, null, null, null, 10, 9, 15, 14], // 8
[-1, null, null, 13, 13, 12, null, null], // 9
[-1, null, null, null, null, 11, 15, 14], // 10
[-1, null, null, null, null, 12, 15, 14], // 11
[-1, null, null, null, null, 13, 15, 14], // 12
[-1, null, null, null, null, null, 15, 14], // 13
[-1, null, null, null, null, 18, 18, 17], // 14
[-1, null, null, null, null, null, null, 16], // 15
[-1, null, null, null, null, null, null, 17], // 16
[-1, null, null, null, null, null, null, 18], // 17
[-1, null, null, null, null, null, null, null], // 18
];
// Алфавит
const alphabet = 'MDCLXVI';
// Разбивает строку на лексемы
// (номера символов в алфавите, начиная с 1)
// для отсутствующих символов возвращает 0
const lexer = (str) => str.split('').map((l) => alphabet.indexOf(l) + 1);
// Проверяет корректность числа в римской записи
const check = (str) => {
const lexems = lexer(str);
let state = 0;
let idx = 0;
while (true) {
const lex = lexems[idx] ?? 0;
state = dka[state][lex];
if (state === null) {
return false;
}
if (state === -1) {
return idx === str.length;
}
idx += 1;
}
}
const w = 640 // Длина волны
let red, green, blue;
if (w < 380 || w > 781) {
[red, gren, blue] = [0, 0, 0];
} else if (w < 440) {
[red, green, blue] = [(440 - w) / 60, 0, 1];
} else if (w < 490) {
[red, green, blue] = [0, (w - 440) / 50, 1];
} else if (w < 510) {
[red, green. blue] = [0, 1, (510 - w) / 20];
} else if (w < 580) {
[red, green, blue] = [(w - 510) / 70, 1, 0];
} else if (w < 645) {
[red, green, blue] = [1, (645 - w) / 65, 0];
} else {
[red, green, blue] = [1, 0, 0];
}
let factor;
if (w < 380 || w > 781) {
factor = 0;
} else if (w < 420) {
factor = 0.3 + 0.7 * (w - 380) / 40;
} else if (w < 701) {
factor = 1.0;
} else {
factor = 0.3 + 0.7 * (780 - w) / 80;
}
const gamma = 0.8;
const R = (red > 0 ? 255 * Math.pow(red * factor, gamma) : 0);
const G = (green > 0 ? 255 * Math.pow(green * factor, gamma) : 0);
const B = (blue > 0 ? 255 * Math.pow(blue * factor, gamma) : 0);
const color = `rgb(${R}, ${G}, ${B})`;
console.log(color); // rgb(255, 32.763138565028974, 0)