Заметки по javascript (nodejs)
Разберем задачи для самопроверки по javascript, которые будем запускать на платформе Node.js установленной на нашем ПК в роли сервера.
2. Равномерно разложить в ряд число Х с количеством элементов У
3. Выборка последней (более поздней) даты из таблицы mysql
Предварительные действия:
1Node.js - это платформа на которой можно выполнять запросы javascript, необходимо установить LTS версию программы, доступную по ссылке https://nodejs.org/en/download/
После скачивания, запустить установочный файл и пройти по шагам, нажимая на "Next" -> "Next" -> "Finish".
2Исходный код javascript будем запускать из "блокнота", сохраненного в расширении *.js. Будет более удобно использовать программу Notepad++, доступную по ссылке https://notepad-plus-plus.org/downloads/
Установка так же простая: "Далее" -> "Далее" до финиша.
3В некоторых заданиях нужно выполнить выборку из таблиц. Node.js может взаимодействовать с базами данных, например с mysql. Для этого установим mysql, доступный по ссылке https://dev.mysql.com/get/Downloads/MySQLInstaller/mysql-installer-community-8.0.12.0.msi
Установка через "Next" -> "Next", чекбоксы все оставляем по-умолчанию и проходим до финиша установки.
Дано 2 числа Х и У. Как разложить в ряд число Х с количеством элементов У, чтобы они были размещены равномерно.
При Х = 8, У = 3.
При Х = 7, У = 3.
При Х = 13, У = 4.
Решение задания №1
В блокноте создать файл с именем summands.js со следующим кодом:
// summands.js:
function closest_summands(x, y) {
    var div = x / y,
        rem = x % y,
        res = [];
    for (var i=0; i<rem; i++)
        res.push( Math.ceil(div) );
    for (       ; i<y;   i++) // continue
        res.push( Math.floor(div) );
    return res;
}
x = 13; // задать значение x
y = 4; // задать значение y
console.log(closest_summands(x,y)); // вывести в консоль ряд
Для x, y присваиваем значения из задания. Получаем результат в консоли Командной строки Windows (cmd). Через команду cd перейти в папку с сохраненным файлом summands.js и запустить его через команду node:

При x=13, y=4 ряд равен 4+3+3+3, т.е. сумма (x)=13 разложилась на количество элементов (y)=4 равномерно по значениям в порядке убывания значения элемента до тех пор, пока хватает суммы 13 для равномерного разложения на слагаемые. Равномерное - здесь ключевое слово, программа раскладывает так, чтобы было задействовано как можно меньше чисел слагаемых, чтобы было более равномерное разложение. Если рассматривать ряд = [ 4, 4, 3, 2 ] (в котором сумма тоже равна 13), то он уступает ряду [ 4, 3, 3, 3 ] по равномерности, т.к. задействовано три разных значения (4,3,2), а в результате ряда [ 4, 3, 3, 3 ] условие выполняется более равномерно, т.к. задействовано два числа (4,3).
- При Х = 8, У = 3. Ряд имеет вид -> [ 3, 3, 2 ];
 - При Х = 7, У = 3. Ряд имеет вид -> [ 3, 2, 2 ].
 
Ниже ситуация отражающая периоды действия цен на товар в виде случайно пересекающихся периодов. Актуальной считается цена с более поздней датой создания.
| Цена | Дата "с" | Дата "по" | Дата создания | 
| 100 | 01.01.2018 | 15.05.2018 | 31.12.2017 | 
| 150 | 10.01.2018 | 15.01.2018 | 07.01.2018 | 
| 120 | 01.02.2018 | 01.03.2018 | 10.01.2018 | 
| 110 | 16.05.2018 | 01.06.2018 | 10.05.2018 | 
| 130 | 28.08.2018 | 01.07.2018 | 01.06.2018 | 
Напишите алгоритм по избавлению данных от пересечений. Каков будет его результат? Написать решение на javascript (nodejs).
Решение задания №2
Необходимо создать таблицу в mysql как описано в моей статье.
В блокноте создать файл с именем maxdata.js со следующим кодом:
// maxdata.js:
const mysql = require("mysql2");
const connection = mysql.createConnection({
  host: "localhost",
  user: "root",
  database: "sorso",
  password: "123456",
  timezone : "+00:00"
});
const sql = 'SELECT cena, data_sozdanyia FROM price t JOIN (SELECT MAX(data_sozdanyia) max FROM price) m ON m.max = t.data_sozdanyia;'; 
connection.query(sql, function(err, results) {
    if(err) console.log(err);
    console.log(results);
});
connection.end();
Согласно коду, мы подключаемся к базе mysql используя данные авторизации и названия базы. Далее будет выполняться sql запрос последней даты из таблицы "price".
Проверяем результат запроса в консоли Командной строки Windows (cmd) через команду node:
![]()
Как результат мы получили цену соответствующую последней "Дата создания" после выборки из таблицы mysql.
Написать результат всех возможных объединений двух таблиц.
| Таблица 1 | Таблица 2 | 
| 1 | 1 | 
| 1 | 1 | 
| 2 | 2 | 
| null | 2 | 
| 4 | 2 | 
| null | |
| null | |
| 3 | 
Решение задания №3
Необходимо создать таблицу в mysql как описано в моей статье. При заполнении значения null в таблице через команду INSERT INTO пишем 'null'.
В блокноте создать файл с именем innerjoin.js со следующим кодом:
// innerjoin.js:
const mysql = require("mysql2");
const connection = mysql.createConnection({
  host: "localhost",
  user: "root",
  database: "sorso",
  password: "123456",
  timezone : "+00:00"
});
const sql = 'SELECT * FROM table1 INNER JOIN table2 ON table1.number1 = table2.number2'; 
connection.query(sql, function(err, results) {
    if(err) console.log(err);
    console.log(results);
});
connection.end();
Согласно коду, мы подключаемся к базе mysql используя данные авторизации и названия базы. Далее будет выполняться sql запрос слияния 2-х таблиц через INNER JOIN.
Проверяем результат запроса в консоли Командной строки Windows (cmd) через команду node:

Т.е. можно сказать, что получили таблицу после слияния:
+---------+---------+
| number1 | number2 |
+---------+---------+
| 1 | 1 |
| 1 | 1 |
| 1 | 1 |
| 1 | 1 |
| 2 | 2 |
| 2 | 2 |
| 2 | 2 |
+---------+---------+
Палиндром — слово, предложение или последовательность символов, которая абсолютно одинаково читается как в привычном направлении, так и в обратном. К примеру, “Anna” — это палиндром, а “table” и “John” — нет.
Постановка:
Дана строка; нужно написать функцию, которая позволяет вернуть значение true, если строка является палиндромом, и false — если нет. При этом нужно учитывать пробелы и знаки препинания.
Решение задания №4
Следует заметить, что согласно заданию паллиндром должен проверяться без учета регистра (заглавные или прописные буквы). В блокноте создать файл с именем palindrome.js: со следующим кодом:
  // palindrome.js:
  function isPalindrome(str) {
str = str.toLowerCase() // преобразование в нижний регистр
    var strLen = str.length,
        strReverse = str.split('').reverse().join(''); //Разбиваем строку посимвольно  и превращаем ее в массив с помощью split(''), потом применяем к нему метод reverse() и собираем все символы в строку с помощью join('')
    if (strReverse == str) {
      return 'is palindrome';
    } else {
      return 'is not palindrome';
    }
  }
  test = isPalindrome('Anna'); // тестовые палиндромы
  test2 = isPalindrome('John');
  test3 = isPalindrome('table');
  console.log('Anna',test); // вывод результата истинности палиндрома
  console.log('John',test2);
  console.log('table',test3);
Проверяем результат запроса в консоли Командной строки Windows (cmd) через команду node:
