// Задание на черный пояс: Электронная гадалка // Пользователь вводит 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, то: // predictArray[1][1][1][1] = 0; //1,1,1,1 - история, 0 - новое значение // history = [1, 1, 1, 0] //удаляем старую единицу из истории и добавляем введенный только что 0 // Для предсказания следующего достаем значение массива predictArray[1, 1, 1, 0], а после ввода опять записываем туда то, // что ввёл пользователь(пусть 1): // predictArray[1][1][1][0] = 1; //1,1,1,0 - история, 1 - новое значение // history = [1, 1, 0, 1] //удаляем старую единицу из истории и добавляем введенный только что 1 // Таким образом в predictArray накапливаются знания о том, что вводит пользователь после определенной истории чисел. const task17block = document.createElement('div'); task17block.style = "border: 2px solid green; border-radius:5px; margin-bottom:10px; padding:10px"; const task17title = document.createElement('h2'); task17title.innerText = 'Task-17 Digital Vanga'; const task17comment = document.createElement('p'); task17comment.innerText = 'Возможно сохранение истории в n-мерный массив'; const playVangaBtn = document.createElement('button'); playVangaBtn.innerText = 'Play'; playVangaBtn.style = 'margin-bottom:17px'; root.appendChild(task17block); task17block.appendChild(task17title); task17block.appendChild(task17comment); task17block.appendChild(playVangaBtn); playVangaBtn.onclick = () => { let history = []; let predictArray = [-1, -1]; let VangaNumber = null; let step = null; let userNumber = null; const historyDeep=+prompt('Введите кол-во элементов, записываемых в историю') // const historyDeep = 4; // Формирование начального многомерного массива predictArray произвольной глубины вложенности function predictArrayFirstFilling(predictArray, historyDeep) { let prePredictArray = []; if (historyDeep ===0) { return predictArray; } else { prePredictArray = JSON.parse(JSON.stringify(predictArray)); //Деструктуризация и слайс не дали глубокого копирования, потому использовала JSON.parse(JSON.stringify) // prePredictArray = [...predictArray]; // prePredictArray = predictArray.slice(0); for (let j = 0; j < 2; j++) { // predictArray[j] = prePredictArray.slice(0); // predictArray[j] = [...prePredictArray]; predictArray[j] = JSON.parse(JSON.stringify(prePredictArray)); } return predictArrayFirstFilling (predictArray, historyDeep - 1); } } predictArrayFirstFilling(predictArray, historyDeep-1); // для постоянной глубины истории =4 // for (let i = 0; i < 2; i++) { // predictArray[i] = []; // for (let j = 0; j < 2; j++) { // predictArray[i][j] = []; // for (let k = 0; k < 2; k++) { // predictArray[i][j][k] = []; // for (let l = 0; l < 2; l++) { // predictArray[i][j][k][l] = -1; // } // } // } // } // Формирование 1-го массива history for (step = 0; step < historyDeep; step++) { VangaNumber = (Math.random() > 0.5) ? 1 : 0; console.log(`Гадалка задумала: ${VangaNumber}`); userNumber = prompt('Введите одно из чисел: 0 или 1'); if (!(userNumber === null)) { if (!(userNumber === "")) { if (userNumber == 1 || userNumber == 0) { history[step] = userNumber; VangaNumber == userNumber ? alert(`Гадалка угадала, что ты загадал ${userNumber} `) : alert('Гадалка не угадала твое число') } else { alert("Ошибка ввода. Нужно ввести число 0 или 1"); step--; } } else { alert("Ошибка ввода. Нужно ввести число 0 или 1"); step--; } } else break; } console.log(`history=[${ history }]`); // Формирование 2-го и более массивов history и внесение статистики в predictArray while (!(userNumber === null)) { //Проверка наличия записи в predictArray let predictArrayElement = predictArray; let prePredictArrayElement = []; for (let i = 0; i < historyDeep; i++) { prePredictArrayElement = predictArrayElement; if (i < historyDeep - 1) { predictArrayElement = [...prePredictArrayElement[history[i]]]; } else { predictArrayElement = predictArrayElement[history[i]]; } } //Выбор гадалки if (predictArrayElement == 0 || predictArrayElement == 1) { VangaNumber = predictArrayElement; console.log(`Гадалка задумала: ${VangaNumber}`); } else { VangaNumber = (Math.random() > 0.5) ? 1 : 0; console.log(`Гадалка задумала: ${VangaNumber}`); }; userNumber = prompt('Введите одно из чисел: 0 или 1') if (!(userNumber === null)) { if (!(userNumber === "")) { if (userNumber == 1 || userNumber == 0) { VangaNumber == userNumber ? alert(`Гадалка угадала, что ты загадал ${userNumber} `) : alert('Гадалка не угадала твое число'); //Перезапись нужного элемента массива predictArray let predictArrayElement = 'predictArray'; for (let i = 0; i < historyDeep; i++) { predictArrayElement +=`[${[history[i]]}]`; } predictArrayElement += `=${userNumber}`; eval(predictArrayElement); history.push(userNumber); history.splice(0, 1); console.log(`history=[${history}]`); } else { alert("Ошибка ввода. Нужно ввести число 0 или 1"); step--; } } else { alert("Ошибка ввода. Нужно ввести число 0 или 1"); step--; } } else break; } console.log(`predictArray=`); console.log(predictArray); }