Небольшая пошаговая инструкция по JavaScript.

Некоторое время назад я столкнулся с этой мини-проблемой кода. Это вопрос, который технические компании иногда используют для проверки способностей программиста, прежде чем разрешить ему пройти собеседование.

Эта конкретная задача заключается в JavaScript, но если вам нравится математика, вы прекрасно ее поймете!

Вот в чем проблема:

Идите и попробуйте решить это самостоятельно.

У тебя есть ответ?

Большой! Давайте рассмотрим это ниже и посмотрим, пришли ли мы к такому же решению.

С чего начать?

Давайте разберемся с несколькими первыми объявлениями и тем, как инициализируются наши переменные.

Первое, что происходит в этой программе, - это инициализация x и y. Также обратите внимание, что мы объявляем эти переменные с помощью let; это означает, что мы можем переопределить их значения позже в программе.

let x = 2;
let y = 8;

Затем инициализируем a. Эта переменная объявлена ​​с использованием const; на самом деле это константа, и мы не сможем изменить это позже. Считается, что он предназначен только для чтения.

const a = function(b) {
  return function(c) {
    return x + y + Math.abs(b) + c;
  };
};

Теперь, когда они определены, мы пропускаем строку, которую сможем отредактировать позже (на // ***** Statement will go here *****).

Затем наша программа инициализирует fn, используя наши определения a и x.

const fn = a(x);

Давайте воспользуемся подстановкой, чтобы точно узнать, что будет fn.

Если вы не знакомы с JavaScript, используйте // комментарии в строке, чтобы она не запускалась в коде. Я использовал его в некоторых из этих фрагментов кода, чтобы напомнить себе о том, с чего мы начали, когда мы наметили свой путь к решению.

// const x = 2
// const a = function(b) {
//   return function(c) {
//     return x + y + Math.abs(b) + c;
//   };
// };
// const fn = a(x)
const fn = function(2) {
  return function(c) {
    return x + y + Math.abs(2) + c;
  };
};

Значение Math.abs(2) равно 2, так что давайте воспользуемся этим.

const fn = function(2) {
  return function(c) {
    return x + y + 2 + c;    <-- Change Math.abs(2) to just 2
  };
};

В конечном итоге функция возвращает другую функцию, которая возвращает окончательный расчет. Давайте упростим это.

const fn = function(c) {
  return x + y + 2 + c;
};

Теперь мы куда-то идем!

Вот снова вся наша программа, на этот раз с разбивкой того, к чему fn будет сводиться.

Теперь, когда мы упростили использование подстановки, давайте внимательнее посмотрим на вывод напечатанных чисел.

console.log(fn(Math.random() * 10);

Эту единственную строчку кода трудно понять, когда все сложено вот так. Чтобы облегчить рассмотрение, давайте разберем его на несколько переменных.

const input = Math.random() * 10;
console.log(fn(input));       <-- pull out "Math.random() * 10"

И давайте тоже вытащим функцию:

const input = Math.random() * 10;
const printedNumber = fn(input);
console.log(printedNumber);    <-- pull out fn(input)

Помните наше обновленное определение fn? И снова вот оно:

const fn = function(c) {
  return x + y + 2 + c;
};

Функция fn вернет вычисление x + y + 2 + c, где c будет тем, что передано в функцию. В нашем случае c будет input.

Давайте воспользуемся подстановкой, чтобы увидеть, что fn будет в нашем printedNumber:

// const printedNumber = fn(input);
const printedNumber = x + y + 2 + input;

Мы уже определили наш input. Помнить?

const input = Math.random() * 10;

Можем снова заменить!

// const printedNumber = x + y + 2 + input;
const printedNumber = x + y + 2 + Math.random() * 10;

Фух! Хорошая работа. Вот где мы сейчас находимся, но некоторые вещи определены более четко.

Пора взглянуть на x.

Помните, когда мы объявили x? Программа использовала let, что означает, что мы можем изменить значение.

Значение x снова определяется ПОСЛЕ строки, которую мы можем редактировать. Это означает, что мы знаем, что его ценность не изменится.

Мы можем снова упростить!

// x = 4;
// const printedNumber = x + y + 2 + Math.random() * 10
const printedNumber = 4 + y + 2 + Math.random() * 10

И мы знаем это 4 + 2 = 6, поэтому будем складывать любые простые целые числа.

const printedNumber = y + 6 + Math.random() * 10

Теперь у нас есть над чем поработать!

Какова была наша цель снова?

сделайте напечатанное число всегда между 10 и 20

… И мы знаем, что…

printedNumber = y + 6 + Math.random() * 10;

Итак, давайте посмотрим на это как на диапазон:

10 < ( printedNumber ) < 20

И, учитывая наше определение printedNumber, мы можем снова заменить:

10 < ( y + 6 + Math.random()*10 ) < 20

Давайте разделим этот диапазон на две границы:

// Minimum Boundary Edge
10 = y + 6 + Math.random() * 10
// Maximum Boundary Edge
20 = y + 6 + Math.random() * 10

Math.random ()

Если мы посмотрим на определение Math.random(), мы сможем принять некоторые решения о том, как мы хотим относиться к нему при решении наших новых граничных уравнений.

Функция Math.random () возвращает псевдослучайное число с плавающей запятой в диапазоне от 0 до менее 1 (включая 0, но не 1).

Мы можем рассматривать значения 0 и 1 как наши значения minimum и maximum для Math.random(). Мы подставим их в наши уравнения, чтобы лучше понять.

Минимальный граничный край

Вместо минимального граничного края мы заменим Math.random() = 0.

10 < y + 6 + Math.random() * 10
10 = y + 6 + 0 * 10        <-- Substitute 0 for Math.random()
10 = y + 6                 <-- 6 + 0 is 6
4 = y                      <-- Move 6 to the other side (10 - 6)

Максимальный граничный край

Вместо максимального граничного края мы заменим Math.random() = 1.

20 > y + 6 + Math.random() * 10
20 = y + 6 + 1 * 10        <-- Substitute 0 for Math.random()
20 = y + 16                <-- 6 + 10 is 16
4 = y                      <-- Move 16 to the other side (20 - 16)

Если в нашем коде установлено y = 4, наш напечатанный номер всегда будет находиться в диапазоне от 10 до 20.

Решение? y = 4

Для всего этого мы можем поместить наш однострочный оператор в исходный код.

Подождите ... Как мы узнали, что нужно изменить y, а не x?

Сама программа меняется x после нашей возможности добавить строчку. Однако мы также можем рассмотреть возможность редактирования x, что изменит значение b в нашей инициализации fn.

Вы можете определить, что x не является значением, которое можно изменить методом проб и ошибок, используя то, что мы узнали выше.

Мы можем смело решить, что если y = 8 не изменится, есть вероятность, что наше напечатанное число не попадет в диапазон от 10 до 20.

Заключение

Что вы думаете? Можем ли мы с уверенностью сказать, что y = 4 для нашего окончательного решения?

Если мы вернемся к нашему определению Math.random(), мы можем вспомнить, что значение, которое оно производит, включая 0. Это означает, что наше случайное число может фактически равняться нулю.

Вместо того, чтобы найти ценность, которая удерживает нас здесь:

10 < printedNumber < 20

… Мы закончили с этим?

10 <= printedNumber < 20

Что вы думаете? y = 4; правильный ответ для интервью?

Больше контента на plainenglish.io