# Циклы и массивы: домашнее задание
**Подсказка**: для заданий 6,7,9 используйте *остаток от деления* `%`

## Циклы
0. Сделать цикл с `prompt`, который прерывается по нажатию **OK** и продолжается по нажатию **Отмена**
1. Сделать бесконечный цикл, который прерывается с помощью конструкции `break`, когда Math.random() > 0.9. Подсчитать количество итераций и вывести
   это число с помощью `alert`. Не забывайте, что Math.random() возвращает новое число каждый раз, когда вы его вызываете.
2. Сделать цикл с `prompt`, который прерывается по нажатию **OK** и продолжается по нажатию **Отмена** **c пустым телом цикла**. Т. е. разместите
   все нужные операторы в условии цикла, тело же цикла пусть будет `;` или `{}`.
3. Подсчитать сумму арифметической прогрессии от 1 до N используя цикл `for`.
4. Подсчитать сумму арифметической прогрессии от 1 до N c шагом 3 (1,4,7....) используя цикл `for` **c пустым телом цикла**.
5. Сформировать строку `" # # # # # "` с помощью цикла `for`.
6. Сформировать строку `"34567890"` с помощью цикла `for`.
7. Сформировать строку c помощью вложенных циклов. Для перевода строки используйте **\n**. Этот символ, добавленный в строку, делит ОДНУ строковую
   переменную на две или более строки при выводе на экран. Например: `alert("Первая строка \n Вторая строка\n\n\nВыше две пропущенных строки");`. 
<pre>
0123456789
0123456789
0123456789
0123456789
0123456789
0123456789
0123456789
0123456789
0123456789
0123456789
</pre>
8. Сформируйте строку с шахматной доской из вложенных циклов. Для перевода строки используйте `\n`. Код должен поддерживать легкое изменение размеров
доски.
<pre>
.#.#.#.#.#.#
#.#.#.#.#.#.
.#.#.#.#.#.#
#.#.#.#.#.#.
.#.#.#.#.#.#
#.#.#.#.#.#.
.#.#.#.#.#.#
#.#.#.#.#.#.
.#.#.#.#.#.#
#.#.#.#.#.#.
</pre>
9. Сформируйте массив из N элементов, содержащий в себе квадраты индексов, т. е:
```
[0,1,4,9,16...]
```
10. C помощью вложенного цикла сформируйте массив массивов "таблица умножения". Для инициализации вложенных массивов используйте
```javascript
arr[i] = []
```
`arr[5][6]` должен быть равен, соответственно, 30, `arr[7][2]` == 14 и так далее.

11. Сделайте вложенный цикл, который формирует HTML-таблицу из любого двумерного массива. Т. е. если в нём использовать результат работы 
предыдущего задания, то получится таблица умножения HTML, как на занятии;

12. Сделайте цикл `while`, который подменяет в массиве все строки `"abcd"` на `null`, используя `indexOf`. indexOf - **функция**, 
которая находит те или иные вхождения в строку или массив, и возвращает индекс. Если значение не найдено, `indexOf` возвращает -1

```javascript
var letters = "abcdefghij"
console.log(letters.indexOf("a")); //0
console.log(letters.indexOf("f")); //5
console.log(letters.indexOf("z")); // -1, так как не найдено

var arr = ["foo", 15, 100500, 3.14]
var e   = Math.E
console.log(arr.indexOf("foo"));
console.log(arr.indexOf(3.14));
console.log(arr.indexOf(e));
```

14 Сделайте цикл for, который подменяет в массиве все строки `"abcd"` на `null`, **не** используя `indexOf`

## **Задание на синий пояс**: Треугольник

Сформировать следующую строку - треугольник:
<pre>
.....#.....
....###....
...#####...
..#######..
.#########.
###########
</pre>

## **Задание на черный пояс**: Электронная гадалка

Пользователь вводит 0 или 1. Гадалка пытается угадать, что введет пользователь (естественно **перед** его вводом), но не показывает пользователю,
что бы пользователь не выбрал противоположный вариант, а выводит предполагаемый вариант в консоль, скрытую от пользователя.

### Как это работает?

Гадалка хранит историю ввода (4 последних числа) пользователя в массиве history. Каждое следующее число добавляется с помощью `push` в конец массива,
при этом первое число из массива (самое старое) удаляется с помощью `shift`.

Гадалка запоминает что пользователь ввёл в предыдущий раз после такой истории. То есть, если пользователь вводил 0,1,0,1,0, то логично предположить,
что с историей 0,1,0,1 следующим вариантом будет 0. Для хранения используется 4х мерный массив, индексами которого является история:

predictArray[history[0]][history[1]][history[2]][history[3]] равно тому, что пользователь ввёл после истории в предыдущий раз.

### Алгоритм:

Изначально predictArray содержит, например, -1, или иные значения, которые отличаются от пользовательского ввода. История пусть состоит из единиц:
`history = [1,1,1,1];`, Т. е. считается что пользователь нажимал 1 четыре ряда подряд. Пока мы не можем предсказать, так как в массиве еще не сохранилось
то, что вводил пользователь, мы используем Math.random в качестве предсказания, и записываем ввод пользователя в массив predictArray, добавляя новые значения в history, и 
сдвигая его. Т. е. если пользователь ввел 0, то:
```javascript
predictArray[1,1,1,1] = 0; //1,1,1,1 - история, 0 - новое значение
history = [1,1,1,0]        //удаляем старую единицу из истории и добавляем введенный только что 0
```

Для предсказания следующего достаем значение массива predictArray[1,1,1,0], а после ввода опять записываем туда то, что ввёл пользователь (пусть 1):

```javascript
predictArray[1,1,1,0] = 1; //1,1,1,0 - история, 1 - новое значение
history = [1,1,0,1]        //удаляем старую единицу из истории и добавляем введенный только что 1
```

Таким образом в predictArray накапливаются знания о том, что вводит пользователь после определенной истории чисел.