Итак, в основном я делаю некоторые упражнения JS, и я понимаю этот код, просто не могу понять, какая математика стоит за получением символов кода Ascii в функции String.fromCharCode? почему мы уменьшаем на 18?
Пусть функция LetterChanges(str) принимает передаваемый параметр str и изменяет его, используя следующий алгоритм. Замените каждую букву в строке буквой, следующей за ней в алфавите (т. е. c становится d, z становится a). Затем сделайте каждую гласную в этой новой строке (a, e, i, o, u) прописной и, наконец, верните эту измененную строку.
function LetterChanges(str) {
str = str.trim().toLowerCase();
var len = str.length;
var newStr = '';
for (var i = 0; i < len; i++) {
if (/[a-ce-gi-mo-su-y]/.test(str[i])) {
newStr += String.fromCharCode(((str[i].charCodeAt(0) - 18) % 26) +
97)
}
else if (/[zdhnt]/.test(str[i])) {
newStr += String.fromCharCode(((str[i].charCodeAt(0) - 18) % 26) +
65);
}
else {
newStr += str[i];
}
}
return newStr;
}
LetterChanges(readline());
Покажите нам, что вы сделали, чтобы попытаться понять код, и отредактируйте свой вопрос, чтобы он соответствовал тому, что вы спрашиваете. Вопросы с домашним заданием подходят для Stack Overflow, но вам нужно будет немного поработать. См. Как задавать и отвечать на вопросы по домашнему заданию



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Факт: charCode для 'a' равен 97 и (97 - 18)% 26 == 1
Возьмем, к примеру, 'b', (98 - 18) % 26 == 2, поэтому после изменения его charCode, равный 97 + 2 == 99, станет 'c'. Это правило распространяется на все 'a-z'.
Теперь вы должны увидеть узор.
Тест: что, если вы хотите изменить заглавные буквы, что бы вы выбрали в качестве «магического числа» для этого случая?
О ASCII
Ну, как вы знаете, компьютеры не хранят символы в виде «a», «b», «z» или «.», они принимают только двоичные биты (0 или 1). Эти двоичные биты можно использовать для формирования целых чисел и чисел, но не строк и символов.
Так как же компьютер хранит символы? Вот тут-то и появляется ASCII (американский стандартный код для обмена информацией).
Таким образом, идея состоит в том, что каждый символ должен быть хранится как число, а код ASCII является стандартизацией того, какое число соответствует какому символу, и наоборот.
Итак, чтобы ответить на ваш первый вопрос:String.fromCharCode(x) просто возвращает вам символ в стандартизированной таблице ASCII, соответствующий числу x. Например, String.fromCharCode(65) вернет вам 'A', потому что код ASCII для 'A' стандартизирован как 65.
Почему -18
Это умный (но сбивающий с толку) хак, чтобы заменить все строчные буквы символом, следующим за ним.
Поскольку str была сделана строчной из строки str = str.trim().toLowerCase();, str[i] теперь будет содержать только значения от 97 ('a') до 97+25 = 122 ('z').
Теперь 18 = 122 (mod 26) или 122%26.
Это необходимо для учета того факта, что «z» нужно перейти к «a», и поскольку у нас есть только 26 символов от «a» до «z», которые нам нужно «обернуть» (модуль/%)
Обратите внимание, что:
(97('a')-18)%26 = 1
(98('b')-18)%26 = 2
...
(122('z')-18)%26 = 0
Поэтому, когда вы добавляете 97 ('a') к каждому из чисел, вы получаете функциональное отображение 'a'->'b', 'b'->'c', ..., 'z'->'a '
Я не могу точно знать, что происходит, если вы не опубликуете, что должен делать код... Это одна из проблем CoderByte или что-то в этом роде?