// Confirms
// Сохраните в массив ответы на вопросы, заданные с помощью confirm. Используйте литеральный (декларативный)
// синтаксис массивов ([....,....,....])
confirms: {
  let responseArray = [confirm('Do you like travel?'), confirm('Are you live in Ukraine?'),
  confirm('Do you eat fish?')];
  console.log(responseArray);
}

// Prompts
// Сохраните в массив ответы на вопросы, заданные с помощью prompts. Используйте доступ к массиву по индексу
// и присвоение (arr[....] = ....)
prompts: {
  let arr = [];
  arr[0] = prompt('What are you doing?');
  arr[1] = prompt('How old are you?');
  arr[2] = prompt('Where are you from?');
  console.log(arr);
}

// Item access
// Попросите пользователя ввести (prompt) индекс в массиве. Выведите значение элемента по этому индексу.
// Попробуйте так же ввести индекс "length".
item_access: {
  let arr = ['apple', 'orange', 'banana', 'lemon', 'cherry', 'raspberry'];
  alert(arr[prompt('Enter an index')]);
}

// Item change
// Попросите пользователя ввести (prompt) индекс в массиве, а так же значение для этого индекса. Присвойте
// в введенный индекс введенное значение
item_change: {
  let arr = [];
  arr[prompt('Enter an index')] = prompt('Enter value');
  console.log(arr);
}

// Multiply table
// Создайте таблицу умножения 5x5 используя декларативный синтаксис вложенных массивов
// const arr = [[....], [....], [....], .....]. Числа во вложенных массивах должны быть равны произведению
// индекса внешнего массива на индекс внутреннего массива: arr[2][3] === 6
multiply_table: {
  const arr =
    [[0, 0, 0, 0, 0],
    [0, 1, 2, 3, 4],
    [0, 2, 4, 6, 8],
    [0, 3, 6, 9, 12],
    [0, 4, 8, 12, 16]];
  alert(arr[prompt('Enter an outer array index')][prompt('Enter an internal array index')]);

  // Multiply table slice
  // Используя slice создайте массив массивов (другую таблицу/матрицу) из таблицы умножения, в которой не
  // будет нулей
  let arrWithoutZeros = arr.slice(1);
  arrWithoutZeros[0] = arrWithoutZeros[0].slice(1);
  arrWithoutZeros[1] = arrWithoutZeros[1].slice(1);
  arrWithoutZeros[2] = arrWithoutZeros[2].slice(1);
  arrWithoutZeros[3] = arrWithoutZeros[3].slice(1);
  console.log(arrWithoutZeros);

  // Multiply table rest
  // Реализуйте задание Multiply table slice, используя оператор rest при деструктуризации. Используйте
  // вложенную деструктуризацию. После получения четырех обрезанных вложенных массивов - соберите общий
  // массив без нулей
  let [[a], [b, ...other1], [c, ...other2], [d, ...other3], [e, ...other4]] = arr;
  let arrWithoutZerosRest = [other1, other2, other3, other4];
  console.log(arrWithoutZerosRest);

  // Copy
  // Скопируйте массив созданный в задании Multiply table неглубоко
  let copy = [...arr];
  console.log(copy);

  // Deep Copy
  // Скопируйте массив созданный в задании Multiply table включая вложенные массивы (глубокая копия)
  let deepCopy = JSON.parse(JSON.stringify(arr));
  console.log(deepCopy);

  // Flat
  // Соберите все элементы всех вложенных массивов из задания Multiply table в один массив. Его длина должна
  // быть равна 25. Используйте spread-оператор
  let allElement = [...arr[0], ...arr[1], ...arr[2], ...arr[3], ...arr[4]];
  console.log(allElement);
  console.log(allElement.length);
}

// IndexOf Word
// Спросите у пользователя строку из нескольких слов. Спросите у него искомое слово. Выведите, каким по
// счету является это слово в строке из нескольких слов. Если слово не найдено, выведите сообщение об этом
// (а не -1)
index_of_word: {
  const arrayOfStr = prompt('Enter a string').split(' ');
  const searchWord = prompt('Enter the search word');
  alert(arrayOfStr.indexOf(searchWord) == -1 ?
    'Word not found' : 'Your word is the ' + (arrayOfStr.indexOf(searchWord) + 1) + ' on the string');
}

// Reverse
// Добавьте в массив пять введенных пользователем через prompt элементов(используйте push). Создайте другой
// массив с этими же элементами в обратном порядке. Для этого извлекайте элементы из первого массива
// используя pop, добавляйте их во второй используя push
reverse: {
  let arr = [];
  let firstElement = prompt('Enter something');
  arr.push(firstElement);
  let secondElement = prompt('Enter something');
  arr.push(secondElement);
  let thirdElement = prompt('Enter something');
  arr.push(thirdElement);
  let fourthElement = prompt('Enter something');
  arr.push(fourthElement);
  let fifthElement = prompt('Enter something');
  arr.push(fifthElement);
  let arrReverse = [];
  arr.pop(fifthElement);
  arrReverse.push(fifthElement);
  arr.pop(fourthElement);
  arrReverse.push(fourthElement);
  arr.pop(thirdElement);
  arrReverse.push(thirdElement);
  arr.pop(secondElement);
  arrReverse.push(secondElement);
  arr.pop(firstElement);
  arrReverse.push(firstElement);
  console.log(arrReverse);
  // Reverse 2
  // Переверните второй массив из предыдущего задания еще раз (последовательность будет как в первом массиве),
  // используя shift и unshift
  let arrReverse2 = [];
  arrReverse.shift(fifthElement);
  arrReverse2.unshift(fifthElement);
  arrReverse.shift(fourthElement);
  arrReverse2.unshift(fourthElement);
  arrReverse.shift(thirdElement);
  arrReverse2.unshift(thirdElement);
  arrReverse.shift(secondElement);
  arrReverse2.unshift(secondElement);
  arrReverse.shift(firstElement);
  arrReverse2.unshift(firstElement);
  console.log(arrReverse2);
}

// Array Equals
// Создайте код, в котором будет две переменных с массивами (arr и arr2), которые равны друг другу
// (arr1 === arr2)
array_equals: {
  const arr = [1, 2, 3, 4];
  const arr2 = arr;
  console.log(arr === arr2);
}

// Destruct
// Извлеките первую, пятую и девятую букву из строки, введенной пользователем, используя деструктуризацию.
// Выведите их
destruct: {
  let [letter1, , , , letter5, , , , letter9] =
    prompt('Enter the string longer then 9 characters').split('');
  alert(letter1 + ' ' + letter5 + ' ' + letter9);
}

// Destruct default
// Извлеките вторую, четвертую и пятую букву из строки, введенной пользователем, используя деструктуризацию.
// Если в строке таких букв не окажется задайте переменным значение по умолчанию ! (восклицательный знак).
// Выведите эти переменные
destruct_default: {
  let [, letter2 = '!', , letter4 = '!', letter5 = '!'] =
    prompt('Enter the string').split('');
  alert(letter2 + ' ' + letter4 + ' ' + letter5);
}

// For Alert
// Есть массив ["John", "Paul", "George", "Ringo"]. Выведите каждое имя отдельным alert(), используя цикл
// for .... of
for_alert: {
  let names = ['John', 'Paul', 'George', 'Ringo'];
  for (let name of names) {
    alert(`Hello, ${name}`);
  }
}

// Function Capitalize
// Реализуйте задачу String: capitalize как отдельную функцию:
function_capitalize: {
  const capitalize = str => {
    let result = str.slice(0, 1).toUpperCase() + str.slice(1).toLowerCase();
    return result //именно этот код обеспечит возврат результата функции
  }
  console.log(capitalize("cANBerRa")); //Canberra

  // Map Capitalize
  // Пусть пользователь вводит строку. Разбейте её по пробелам. Используя map и capitalize создайте массив в
  // котором каждое слово будет с большой буквы. Соберите массив в строку обратно

  let arrOfStr = prompt('Enter the string').split(' ');
  let everyWordIsCapitalized = arrOfStr.map(x => capitalize(x)).join(' ');
  alert(everyWordIsCapitalized);
}

// Filter Lexics
// Пусть пользователь вводит строку. Разбейте её по пробелам. Используя filter верните true если элемент
// массива не состоит в определенном массиве недопустимых слов. Если же элемент массива - недопустимое
// слово, функция, переданная в filter должна возвращать false. Соберите массив в строку обратно.
filter_lexics: {
  let arrOfStr = prompt('Enter the string').split(' ');
  let blockList = ['chocolate', 'coffee', 'cigarettes'];
  let filteredStr = arrOfStr.filter(item => !blockList.includes(item.toLowerCase())).join(' ');
  alert(filteredStr);
}

// Beep Lexics
// Пусть пользователь вводит строку. Разбейте её по пробелам. Используя map и тернарный оператор верните из
// функции слово без изменений, если оно не состоит в каком-то другом массиве запрещенных слов. Если же
// слово состоит в этом списке, функция должна вернуть слово BEEP. Соберите массив обратно в строку через
// пробел. Таким образом вы сможете реализовать замену нескольких запрещенных слов на BEEP.
beep_lexics: {
  let arrOfStr = prompt('Enter the string').split(' ');
  let blockList = ['chocolate', 'coffee', 'cigarettes'];
  let filteredStr = arrOfStr.map(item => blockList.includes(item.toLowerCase()) ? 'BEEP' : item).join(' ');
  alert(filteredStr);
}

// For Brackets Hell Check
// Пусть пользователь вводит строку с любыми парными скобками в ней, например [ [ ] () {{{[]()}}}]. Найдите
// место возможной ошибки (непарности) в этой строке. Для этого, каждую открывающую скобку добавляйте в стек.
// При нахождении закрывающей она должна соответствовать вершине стека. Если она не соответстует, выведите
// сообщение об ошибке и позицию в строке. Если соответствует - уберите скобку из стека. Если строка ошибок
// не содержит, порадуйте пользователя.
for_brackets_hell_check: {
  const line = prompt();
  const bracketsStack = [];
  let i = 0;
  let result = true;
  for (let character of line) {
    //не обращайте внимания на символы, кроме трех видов скобок 
    if (character == '(' || character == '[' || character == '{') {
      bracketsStack.push(character);
    }
    const lastOpenedBracket = bracketsStack[bracketsStack.length - 1];
    if (character == ')' && lastOpenedBracket != '('
      || character == ']' && lastOpenedBracket != '['
      || character == '}' && lastOpenedBracket != '{') {
      result = false;
      break; //оператор break прерывает цикл преждевременно
    }
    if (character == ')' || character == ']' || character == '}') {
      bracketsStack.pop(character);
    }
    i++;
  }
  alert(result ? 'VALID' : 'ERROR');
}