Как обнаружить панграмму - PullRequest
0 голосов
/ 28 ноября 2018

Панграмма - это предложение, которое содержит каждую букву алфавита хотя бы один раз.

Вот мой код:

const isPangram = (string) => {
    let alpha = string.toUpperCase().split("");
    for (let beta = 65; beta < 65 + alpha.length; beta++) {
        let gamma = String.fromCharCode(beta);
        if (alpha.includes(gamma)) {
            continue;
        }
        else {
            return false;
        }
    }
    return true;
}

console.log(isPangram("Detect Pangram"));

Почему «Detect Pangram» возвращает true

Ответы [ 6 ]

0 голосов
/ 28 ноября 2018

const isPangram = (string) => {
    let alpha = string.toUpperCase().split("");

    // corecteded the bounding condition in the loop
    for (let beta = 65; beta < 91; beta++) {
        
        let gamma = String.fromCharCode(beta);
        if (alpha.includes(gamma)) {
            continue;
        }
        else {
            return false;
        }
    }
    return true;
}

console.log(isPangram("Detect Pangram"));
console.log(isPangram("abcd efgh ijkl mnop qrst uvwx yz"));
console.log(isPangram("abcd efgh ijkl mnop qrst uvwx y"));
console.log(isPangram("bcd efgh ijkl mnop qrst uvwx yz"));
0 голосов
/ 28 ноября 2018

Ваш подход состоит в том, чтобы перебрать алфавит и убедиться, что каждая буква az присутствует в целевой строке.Однако условный цикл, 65 + alpha.length, не будет охватывать размер алфавита, если длина входной строки не равна 26. Итерация от 65 до 91 включительно устранит проблему.

Вот еще одно решение:

const isPangram = s =>
  new Set(s.toUpperCase().split``
   .filter(e => /[A-Z]/.test(e)))
   .size === 26
;

[
  "Detect Pangram",
  "abcd efgh ijkl mnop qrst uvwx yz",
  "abcd efgh ijkl mnop qrst uvwx y",
  "bcd efgh ijkl mnop qrst uvwx yz",
  "abcdefghijklmnopqrstuvwxyy",
  "AbCdEfGhIjKlM zYxWvUtSrQpOn",
  "How quickly daft jumping zebras vex."
].forEach(test => console.log(`${isPangram(test)}\t${test}`));
0 голосов
/ 28 ноября 2018
const isPangram = (string) => {
let alpha = string.toUpperCase().split("");
for (let beta = 65; beta < 91; beta++) {
    let gamma = String.fromCharCode(beta);
    if (alpha.includes(gamma)) {
        continue;
    }
    else {
        return false;
    }
}
return true;

}

https://jsfiddle.net/xjys9dat/ - рабочий пример того же

Ваша ошибка в том, что вы выполняли цикл до тех пор, пока длина строки не составляла AZ.

Надеюсь, это поможет.

0 голосов
/ 28 ноября 2018

Регулярный подход:

function isPangram(str){
    var regex = /([a-z])(?!.*\1)/gi;
    return (str.match(regex) || []).length === 26;
}

console.log(isPangram('abcdEfgHijklmnOpqrStuvwxyZ943')); //true
console.log(isPangram('hello 049 ds')); //false

Ссылка: Javascript Pangram Regex

0 голосов
/ 28 ноября 2018

Вы можете сделать это очень простым способом с .every, как показано ниже.

alphabets = 'abcdefghijklmnopqrstuvwxyz'.split("");

const isPangram = (string) => {
    string = string.toLowerCase();
    return alphabets.every(x => string.includes(x));
}

console.log(isPangram("Detect Pangram"));
console.log(isPangram("abcd efgh ijkl mnop qrst uvwx yz"));

Подробнее о every можно узнать по ссылкам ниже.

  1. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/every
  2. https://www.w3schools.com/jsref/jsref_every.asp
0 голосов
/ 28 ноября 2018

Альтернативный подход:

const alphabets26 = 'abcdefghijklmnopqrstuvwxyz';
let input = prompt();
input = input.toLowerCase();
let icount = 0;

for (let i = 0; i < alphabets26.length; i++) {
  var letter = alphabets26[i];
  if (input.indexOf(letter) > -1)
    icount++;
}

if (icount == 26)
  alert('All letters found at least once');
else
  alert('Few letters missing');
...