Небольшая пошаговая инструкция по 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