// while confirm
// Сделайте цикл с confirm, который продолжается по Отмена и заканчивается по ОК.
while_confirm: {
  while (!confirm('Do you want to continue?')) {
    continue;
  }
}

// array fill
// Создайте пустой массив и добавляйте в него элементы, пока пользователь не нажмет Отмена в очередном prompt.
// Используйте push для удобства: push
array_fill: {
  let arr = [];
  let answer;
  while (answer = prompt('Enter something')) {
    arr.push(answer);
  }
  console.log(arr);
}

// array fill nopush
// Сделайте предыдущее задание, не используя push, а обращаясь к элементам по индексу.
array_fill_nopush: {
  let arr = [];
  let answer;
  for (let i = 0; i >= 0; i++) {
    answer = prompt('Enter something');
    if (!answer) {
      break;
    }
    arr[i] = answer;
  }
  console.log(arr);
}

// infinite probability
// Создайте бесконечный цикл, который прерывается с помощью конструкции break, когда Math.random() > 0.9.
// Код должен подсчитывать количество итераций и вывести это число с помощью alert.
infinite_probability: {
  let i = 0;
  while (true) {
    i++;
    if (Math.random() > 0.9) {
      break;
    }
  }
  alert(i);
}

// empty loop
// Сделайте цикл с prompt, который прерывается по нажатию OK и продолжается по нажатию "Отмена" c пустым телом цикла.
empty_loop: {
  while (prompt('Enter something') == undefined) { };
}

// progression sum
// Подсчитать сумму арифметической прогрессии от 1 до N c шагом 3 (1,4,7....) используя цикл for.
// Метод Гаусса не применять, наоборот, сделать максимально наивное решение.
progression_sum: {
  function sum(firstNumber, difference, count) {
    let sum = 0;
    let value = firstNumber;
    for (let i = 1; i <= count; i = i + 1) {
      sum = sum + value;
      value = value + difference;
    }
    alert(sum);
  }
  sum(1, 3, 15);
}

// chess one line
// Сформировать строку " # # # # # " с помощью цикла for. Длина строки может быть четной и нечетной, и
// указывается в одном месте в коде.
chess_one_line: {
  function createChessBoardLine(lenght) {
    let str = '';
    for (let i = 0; i < lenght; i++) {
      if (i % 2 == 0) {
        str += ' ';
      } else {
        str += '#';
      }
    }
    console.log(str);
  }
  createChessBoardLine(3);
  createChessBoardLine(6);
  createChessBoardLine(10);
}

// numbers
// Сформировать строку c помощью вложенных циклов. Для перевода строки используйте \n.
numbers: {
  let str = '';
  for (let i = 0; i < 10; i++) {
    for (let j = 0; j < 10; j++) {
      str += j;
    }
    str += '\n';
  }
  console.log(str);
}

// chess
// Сформируйте строку с шахматной доской из вложенных циклов. Для перевода строки используйте \n. Код должен
// поддерживать легкое изменение размеров доски.
chess: {
  function createChessBoard(rowCount, columnCount) {
    let str = '';
    for (let i = 0; i < rowCount; i++) {
      for (let j = 0; j < columnCount; j++) {
        if (i % 2 == 0) {
          j % 2 == 0 ? str += '.' : str += '#';
        } else {
          j % 2 == 0 ? str += '#' : str += '.';
        }
      }
      str += '\n';
    }
    console.log(str);
  }
  createChessBoard(10, 10);
}

// cubes
// Сформируйте массив из N элементов, содержащий в себе кубы индексов, т. е:
// [0,1,8,27,64...]
cubes: {
  function createCubeNumbers(n) {
    let arr = [];
    for (let i = 0; i < n; i++) {
      arr.push(i ** 3);
    }
    return arr;
  }
  console.log(createCubeNumbers(4));
}

// multiply table
// C помощью вложенного цикла сформируйте массив массивов "таблица умножения". Для инициализации вложенных
// массивов используйте arr[i] = [] //в i-тый элемент массива заносится новый пустой массив
// arr[5][6] должен быть равен, соответственно, 30, arr[7][2] == 14 и так далее.
multiply_table: {
  let arr = [];
  for (let i = 0; i < 10; i++) {
    arr[i] = [];
    for (let j = 0; j < 10; j++) {
      if (i == 0) {
        arr[0][j] = j;
      } else if (j == 0) {
        arr[i][0] = i;
      } else {
        arr[i][j] = i * j;
      }
    }
  }
  console.log(arr);
}

// read array of objects
// Напишите функцию readArrayOfObjects, которая циклически добавляет в массив объекты, которые ввел пользователь.
// Пользователь вводит ключи и значения (их в каждом объекте может быть любое количество), используя prompt.
// Когда пользователь нажимает "Отмена" в окне prompt, ввод объекта заканчивается и объект добавляется в массив.
// Перед вводом следующего объекта пользователю задается вопрос (используя confirm), хочет ли он продолжить это
// мучение ввод объектов. При утвердительном ответе, опять работает ввод любюго количества ключей для создания
// нового объекта. Функция должна возвращать созданный массив с объектами.
read_array_of_objects: {
  function readArrayOfObjects() {
    let arr = [];
    while (true) {
      arr.push(createObj());
      if (!confirm('Do you want to continue?')) {
        break;
      }
    }
    return arr;
  }
  function createObj() {
    let obj = {};
    while (true) {
      let key = prompt('Enter a key');
      if (key == undefined) {
        break;
      }
      let value = prompt('Enter a value');
      obj[key] = value;
    }
    return obj;
  }
  console.log(readArrayOfObjects());
}

// ромбик
// Сформировать следующую строку - ромбик:
generate_rhombus: {
  function generateRow(rhombusLength, rowLength) {
    let row = '';
    const emptyCellsLength = (rowLength - rhombusLength) / 2;
    for (let i = 0; i < rowLength; i++) {
      row += i < emptyCellsLength || i >= emptyCellsLength + rhombusLength ? '.' : '#';
    }
    return row;
  }

  function generateRhombus(size) {
    let rhombus = '';
    for (let i = 0; i < size; i++) {
      let center = Math.floor(size / 2);
      const halfWidth = i <= center ? i : size - i - 1;
      const width = halfWidth * 2 + 1;
      rhombus += generateRow(width, size) + '\n';
    }
    return rhombus;
  }

  console.log(generateRhombus(11));
}