Javascript обратный алфавит - PullRequest
0 голосов
/ 02 января 2019

, так что в последнее время я возился с функцией .replace () и хотел, чтобы она изменяла все, что вводит пользователь. (Aka a -> z, A -> Z, b -> y, B -> Y, ...)

Я использую функцию стекирования, поэтому я просто добавил .replace (). Replace () ... для каждой буквы, но, конечно, это не сработает, так как всякий раз, когда он нажимает n, он начинает переворачивать все прогресс, и я получаю неточный перевод. Любая идея, как я могу обойти это, поскольку, насколько я знаю, JS не имеет функции .reverse (), как Python?

Если вам это нужно, вот мой код

//replacing letters
lettertext = ttext.replace("a", "z")
.replace("A", "Z")
.replace("b", "y")
.replace("B", "y")
.replace("c", "x")
.replace("C", "X")
.replace("d", "w")
.replace("D", "W")
.replace("e", "v")
.replace("E", "V")
.replace("f", "u")
.replace("F", "U")
.replace("g", "t")
.replace("G", "T")
.replace("h", "s")
.replace("H", "S")
.replace("i", "r")
.replace("I", "R")
.replace("j", "q")
.replace("J", "Q")
.replace("k", "p")
.replace("K", "P")
.replace("l", "o")
.replace("L", "O")
.replace("m", "n")
.replace("M", "N")
.replace("n", "m")
.replace("N", "M")
.replace("o", "l")
.replace("O", "L")
.replace("p", "k")
.replace("P", "K")
.replace("q", "j")
.replace("Q", "J")
.replace("r", "i")
.replace("R", "I")
.replace("s", "h")
.replace("S", "H")
.replace("t", "g")
.replace("T", "G")
.replace("u", "f")
.replace("U", "F")
.replace("v", "e")
.replace("V", "E")
.replace("w", "d")
.replace("W", "D")
.replace("x", "c")
.replace("X", "C")
.replace("y", "b")
.replace("Y", "B")
.replace("z", "a")
.replace("Z", "A")
.replace("ä", "ß")
.replace("Ä", "ẞ")
.replace("ö", "ü")
.replace("Ö", "Ü")
.replace("ü", "ö")
.replace("Ü", "Ö")
.replace("ß", "ä")
.replace("ẞ", "Ä")

Ответы [ 8 ]

0 голосов
/ 02 января 2019

Здесь уже есть много ответов, но это выглядело забавно, поэтому вот мое решение объяснено:

  1. Разделить алфавит на первую и вторую части
  2. Перевернуть вторуючасть
  3. Проверьте каждую букву, в какой части она находится, и замените ее на тот же индекс, но в обратном порядке другой части
  4. Добавьте каждую букву в решение

РЕДАКТИРОВАТЬ: ЕслиВы хотите завершить предложения, также проверьте на пробел:)

var alphabet = 'abcdefghijklmnopqrstuvwxyz';
var firstpart = alphabet.substring(0,13).split('');
var secondpart = alphabet.substring(13).split('').reverse();
var button = document.getElementById("button");
var solution = '';

// Click function
button.onclick = function() {
var b = document.getElementById("text").value.split('');
// Loop every letter of input
for (var i = 0 ; i < b.length; i++) {
 if (firstpart.indexOf(b[i]) !== -1) {
   solution += secondpart[firstpart.indexOf(b[i])];
 } else {
   solution += firstpart[secondpart.indexOf(b[i])];
  }
}
console.log(solution);
// Reset solution
solution = '';
}
<input type="text" id='text'>
<button type='button'id='button'>Reverse</button>
0 голосов
/ 02 января 2019

Замена не будет работать в этом случае, потому что - как вы уже заметили - она ​​не будет отслеживать, какие буквы были заменены предыдущей операцией замены. Итак, последовательность операций замены, таких как

//...
.replace("M", "N")
//...
.replace("N", "M")
//...

просто отменит себя (если за это время не произойдет замена подстрок "N").

Однако вы можете просто отобразить строку в виде массива и затем поработать над кодировкой символов ASCII / UTF8, чтобы изменить алфавитную последовательность.

const s = "AzByCx";

const f = (string) => Array.from(string)
  .map(c => {
      const code = c.charCodeAt(0);

      // Leave characters `c` outside the character set [a-zA-Z] unchanged.
      if (code < 0x41 || (code > 0x5A && code < 0x61) || code > 0x7A) { 
          return c;
      }
      
      // Compute offset to last character in the set [a-z] (ASCII/UTF8: 0x41-0x5A) respectively [A-Z] (ASCII/UTF8: 0x61-0x7A)
      let offset;
      let base;
      if (code <= 0x5A) {
          offset = 0x5A - code;
          base = 0x41;
      } else {
         offset = 0x7A - code;
         base = 0x61;
      }

      // Compute new character encoding and convert back to string.
      return String.fromCharCode(base + offset)
  })
  .join('');

console.log(`${s} ~> ${f(s)}`);
console.log(`${f(s)} ~> ${f(f(s))}`);

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

0 голосов
/ 02 января 2019

Самый простой способ - использовать встроенные функции, разбивать, реверсировать и объединять

function reverseString(str) {

    // Step 1. Use the split() method to return a new array ["h", "e", "l", "l", "o"]
    var splitString = str.split(""); 


    // Step 2. Use the reverse() method to reverse the new created array
    // will look like ["o", "l", "l", "e", "h"]
    var reverseArray = splitString.reverse(); 

    // Step 3. Use the join() method to join all elements of the array into a string
    // will look like "olleh"
    var joinArray = reverseArray.join(""); 


    //Step 4. Return the reversed string
    return joinArray; // "olleh"
}

reverseString("hello");
0 голосов
/ 02 января 2019

Просто создайте массив, состоящий из строковых символов из a - z и другого массива, состоящего из всех 8 umlaut символов, которые вы упомянули.

Теперь вы можете просто создать повторно используемую функцию, скажем, reverseChar()который принимает символ в качестве параметра.

Функция может затем проверить, является ли введенный символ алфавитом или умлаут, используя базовый тестер регулярных выражений.

Затем функция пытается соответствовать введенномусимвол со строковыми символами из соответствующего массива и, если есть совпадение, вернуть тот же индексированный символ из массива в обратном порядке.


Попробуйте ввести любой символ из a-z, A-Z или один изсимволы умлаута, упомянутые выше во фрагменте кода ниже, чтобы увидеть, как это работает:

var alpha = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"];
var umlauts = ["ä","Ä","ö","Ö","ü","Ü","ß","ẞ"]

var val = "";

var result = document.getElementById("result");

function reverseChar(x) {
    
    if (/^[a-zA-Z]+$/.test(x)) {
      for (i = 0; i < 26; i++) {
          if (x.toLowerCase() == alpha[i]) {
              if (x == x.toUpperCase()) {
                val = ((alpha.reverse())[i]).toUpperCase();
              } else {
                val = (alpha.reverse())[i];
              }
          }
      }
	  result.innerHTML = `The reversed character for <strong>${x}</strong> is <strong>${val}</strong>`;
    } else {
        for (i = 0; i < umlauts.length; i++) {
        	if (x == umlauts[i]) {
            val = (umlauts.reverse())[i];
          }
        }
        result.innerHTML = `The reversed character for <strong>${x}</strong> is <strong>${val}</strong>`;
    }
}

// JavaScript below is for the HTML Example

var btn = document.getElementById("btn");

function checkChar(){
    var char = document.getElementById("char");
    var input = char.value;
    reverseChar(input);
}

btn.addEventListener("click", checkChar);
<input id="char" type="text" maxlength="1" />
<button type="button" id="btn">Check reversed character</button>
<p id="result"></p>
0 голосов
/ 02 января 2019

Создайте объект, где ключом будут буквы строки, а его значением будет символ, который вы хотите заменить.

При получении входного значения разбейте строку, создайте массив и используйтеmap и внутри его функции обратного вызова проверяется регистр символов.

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

Используйте join для создания окончательной строки

let rvObj = {
  a: 'z',
  b: 'y'
}

function reverse() {
  var b = document.getElementById("text")
    .value //get value of input
    .trim() // remove whitespace
    .split("") // create an array
    .map(function(a) { //map will return new array
      return a === a.toLowerCase() ? rvObj[a] : rvObj[a.toLowerCase()].toUpperCase();
    }).join(""); // create a string from the array
  console.log(b);
};
<input type="text" id='text'>
<button type='button' onclick='reverse()'>Reverse</button>
0 голосов
/ 02 января 2019

Вы можете взять хеш-таблицу для пар и отобразить новый символ или оригинальный символ, если он недоступен в хеш-таблице.

function replace(string) {
    var code = { "a": "z", "A": "Z", "b": "y", "B": "y", "c": "x", "C": "X", "d": "w", "D": "W", "e": "v", "E": "V", "f": "u", "F": "U", "g": "t", "G": "T", "h": "s", "H": "S", "i": "r", "I": "R", "j": "q", "J": "Q", "k": "p", "K": "P", "l": "o", "L": "O", "m": "n", "M": "N", "n": "m", "N": "M", "o": "l", "O": "L", "p": "k", "P": "K", "q": "j", "Q": "J", "r": "i", "R": "I", "s": "h", "S": "H", "t": "g", "T": "G", "u": "f", "U": "F", "v": "e", "V": "E", "w": "d", "W": "D", "x": "c", "X": "C", "y": "b", "Y": "B", "z": "a", "Z": "A", "ä": "ß", "Ä": "ẞ", "ö": "ü", "Ö": "Ü", "ü": "ö", "Ü": "Ö", "ß": "ä", "ẞ": "Ä" };
    return Array.from(string, c => code[c] || c).join('');
}

console.log(replace('Übermut2019')); // 'Öyvinfg2019'
console.log(replace('Öyvinfg2019')); // 'Übermut2019'
0 голосов
/ 02 января 2019

После использования всех заменяющих характеристик вы можете использовать код символа, чтобы автоматически найти подходящую пару:

a='abcxyzABC'.replace(/./g,function(letter){
if (letter>='a' && letter<='z') {
    return String.fromCharCode( 'z'.charCodeAt(0) - letter.charCodeAt(0) + 'a'.charCodeAt(0)  )
}
if (letter>='A' && letter<='Z') {
    return String.fromCharCode( 'Z'.charCodeAt(0) - letter.charCodeAt(0) + 'A'.charCodeAt(0)  )
}
})

//ouptut: 'zyxcbaZYX"
0 голосов
/ 02 января 2019

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

a='abcxyz'.replace(/./g,function(letter){
switch (letter) {
        case 'a':
            return 'z'
    default:
        return letter
}
})

То, что мы делаем, заменит a на z. Но это не заменит его снова. Каждая буква заменяется только один раз.

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

...