Javascript, ход мыслей и инсайты

Я уже писал о том, что полюбил делать задачи для программистов. Сегодня поделюсь задачами и решениями, которые буквально заставили меня схватиться за голову от удивления. Но сначала кратко расскажу о сайте codewars.com и его особенностях. Оформление сделано в стилистике японских боевых искусств — задачи называются «катами», а сложность задач и рейтинг пользователей обозначаются кю — от 8 по 1, по мере возрастания сложности задач или умений борца. Уникальное отличие этого сайта от других аналогов — удобная среда для ввода кода, огромное количество поддерживаемых языков и хорошее сообщество.

Задача «Пары медведей»

Description:

In order to prove it’s success and gain funding, the wilderness zoo needs to prove to environmentalists that it has x number of mating pairs of bears.

You must check within string (s) to fid all of the mating pairs, and return a string containing only them. Line them up for inspection.

Rules: Bears are either ‘B’ (male) or ‘8’ (female), Bears must be together in male/female pairs ‘B8’ or ‘8B’, Mating pairs must involve two distinct bears each (‘B8B’ may look fun, but does not count as two pairs).

Return an array containing a string of only the mating pairs available. e.g:

‘EvHB8KN8ik8BiyxfeyKBmiCMj’ —> ‘B88B’ (empty string if there are no pairs)

and true if the number is more than or equal to x, false if not:

(6, ‘EvHB8KN8ik8BiyxfeyKBmiCMj’) —> [‘B88B’, false];

x will always be a positive integer, and s will never be empty

С ходу я решил, что это задача — упрощенный вариант поиска палиндромов в строке. То, что задача всего лишь на 6 kyu меня не смутило, и я стал обдумывать базовый алгоритм:

  1. Ищем в строке букву «B», пока не дойдём до конца строки
  2. Если буква найдена, проверяем есть ли символ «8» слева, а потом справа
  3. Если есть слева, добавляем комбинацию «8B» в результат, увеличиваем счётчик пар на единицу
  4. Если есть справа, добавляем комбинацию «B8» в результат, увеличиваем счётчик пар на единицу
  5. Подготавливаем и возвращаем результат

Этот алгоритм не совсем рабочий для строки «B8B8», потому что вместо «B8B8» он вернёт «B88BB8». Поэтому, в случае, если мы нашли восьмерку справа, нам надо запомнить индекс и этот факт и в следующий итерации пропустить поиск восьмерки слева и обнулить флаг, отвечающий за это. В итоге, у меня получилось вот так:

Довольный, я нажал на кнопку «Submit final» и стал смотреть лучшие чужие решения. Вот такие варианты я увидел в топе:

Крайнее удивление

Да, эта задача решается в две строчки c помощью метода String.match (). Палиндромы в моей голове так сильно засели, что я просто забыл про регулярные выражения. Могло сыграть роль то, что в целом, я стараюсь избегать использования регулярных выражений, так как при частом изменении кода, их обслуживание может превратиться в ад. Ещё один аналогичный пример, нужно было создать функцию проверки ip адресов формата IPv4, вот моё решение:

А вот лучшее решение:

Задача «Шпион»

Description:

In testing, a spy function is one that keeps track of various metadata regarding its invocations. Some examples of properties that a spy might track include:

  • Whether it was invoked
  • How many times it was invoked
  • What arguments it was called with
  • What contexts it was called in
  • What values it returned
  • Whether it threw an error

For this kata, implement a spyOn function which takes any functionfunc as a parameter and returns a spy for func. The returned spymust be callable in the same manner as the original func, and include the following additional properties/methods:

  • .callCount() — returns the number of times spy has been called
  • .wasCalledWith(val) – returns true if spy was ever called with val, else returns false.
  • .returned(val) — returns true if spy ever returned val, else returns false

Эта задача напомнила мне основы JavaScript’а. На первый взгляд, очевидно, что надо обернуть функцию в другую, но как сделать вызов методов? Что нужно возвращать — объект? Функцию? Метод? Вот решение:

Я просто забыл, что функции являются объектами в JS и к ним можно прикреплять методы. Если об этом помнить, то задача становится очень легкой.

Задача «Разминирование бомбы»

Description:

There are a series of 10 bombs about to go off! Diffuse them all! Simple, right?

Note: This is not an ordinary Kata, but more of a series of puzzles. The point is to figure out what you are supposed to do, then how to do it. Instructions are intentionally left vague.

Иногда встречаются любопытные задачи, больше похожие на головоломки. Вам даётся объект Bomb с методом defuse, нужно исследовать его разными способами, чтобы разминировать все десять бомб. У меня пока не получилось разминировать все бомбы, быть может, вы сможете это сделать? Регистрируйтесь на сайте codewars.com и спасайте мир или считайте медведей решая классные задачи!


Also published on Medium.

Добавить комментарий