Очень интересная задача на Хакерранке, которая называется Веселая строка.

Проблема:

В этом задании вы определите, забавная строка или нет. Чтобы определить, является ли строка забавной, создайте копию строки в обратном порядке, например.
abc-› cba. Перебирая каждую строку, сравните абсолютную разницу в значениях ascii символов в позициях 0 и 1, 1 и 2 и так далее до конца. Если список абсолютных различий одинаков для обеих строк, они забавны.

Определить, является ли строка Give забавной. Если это так, верните Funny, иначе верните Not Funny.

Например, для строки s="lmnop" порядковые значения символов равны [108,109,110,111,112] sReverse="ponml", а порядковые номера - [112,111,110,109,108]. Абсолютная разница соседних элементов для обеих строк равна [1,1,1,1], поэтому ответ равен Funny.

Выполните функцию funnyString в редакторе ниже. Для каждого теста он должен возвращать строку Funny или Not Funny.

Мое решение Javascript для этой проблемы:

function funnyString(s) {
let n = s.split(‘’);
let r = n.slice().reverse();
let j = 1;
for(let i = 1; i < n.length; i++){
   if(Math.abs(n[i].charCodeAt() — n[i-1].charCodeAt()) ===
      Math.abs(r[i].charCodeAt() — r[i-1].charCodeAt())){
        j++;
      }
 }
  return j === n.length ? “Funny” : “Not Funny”
}

Вот как я это сделал:

1. Чтобы использовать методы массива, я сделал массив из введенной строки, назвал его «n».

2. Затем я сделал перевернутый массив из «n», используя метод reverse(). Первоначально этот метод будет изменять массив «n»:

let n = s.split() -----> n = ["e","x","a","m","p","l","e"]
let r = n.reverse() ---> r = ["e","l","p","m","a","x","e"] 
                         and n = ["e","l","p","m","a","x","e"]

Чтобы получить совершенно новый перевернутый массив, я использовал метод slice(). Он создает копию массива «n», а затем метод reverse() изменяет его:

let n = s.split() ---> n = ["e","x","a","m","p","l","e"]
let r = n.slice().reverse() ---> r = ["e","l","p","m","a","x","e"] 
                         and n = ["e","x","a","m","p","l","e"]

3. Затем я зацикливаю массив «n», чтобы сверить текущий элемент с предыдущим, начиная с элемента с индексом «1»:

n[1] compared to n[0], n[2] compared to n[1] and so on.

4. В условии сказано, что я должен сравнить asciiзначения символов заданной и перевернутой строк. Вот почему я использовал метод charCodeAt():

Этот метод возвращает целое число от 0 до 65535, представляющее кодовую единицу UTF-16 по заданному индексу. Именно то, что нам нужно для преобразования строковых символов в числа ASCII.

5. Также условием было сравнение абсолютной разницы в ascii значениях символов, поэтому я использовал метод Math.abs().
Функция Math.abs() в JavaScript используется для возврата абсолютного значения числа. Он принимает число в качестве параметра и возвращает его абсолютное значение:

Math.abs(-4) ---> 4
if(Math.abs(n[i].charCodeAt() — n[i-1].charCodeAt()) ===
      Math.abs(r[i].charCodeAt() — r[i-1].charCodeAt())){
-----> Math.abs(110 -109) === Math.abs(109-110) 
-----> 1 === 1 
-----> true 
-----> j++

6. Если абсолютная разность значений ascii n элементов равна r элементам, мы будем увеличивать «j», которому для нашего удобства присваивается значение «1».

7. И затем функция возвращает Забавно в случае, если каждое условие было правдивым и j увеличивалось каждый раз, когда я проверял, одинакова ли разница значений элементов ascii, другая Функцияways возвращает Не смешно

Спасибо, надеюсь, вам понравилось мое решение :)