Не могу понять, как работает ответ сообщества в этом задании - PullRequest
1 голос
/ 02 июня 2019

Я изучаю машинопись с нуля, делая упражнения на упражнения

Я успешно выполнил 5-е упражнение Панграммы

Мое решение, как показано ниже

class Pangram {

     alphabet = "abcdefghijklmnopqrstuvwxyz"

    constructor(private pangram:string) {
        this.pangram = pangram.toLowerCase().normalize()
    }

    isPangram():boolean{
        for( let leter of this.alphabet){
            if(this.pangram.indexOf(leter) < 0) return false 
        }
        return true;
    }
}

export default Pangram

Чтобы стать лучше, я пытаюсь взглянуть на решение других, чтобы поучиться, и это привлекло мое внимание, так как я не настолько хорош в регулярных выражениях (пока)

class Pangram {
    constructor(private text:string) {
    }

    isPangram():boolean {
        var set = new Set(this.text.toLowerCase().replace(/[^A-Za-z]/g, ''))
        return set.size == 26        
    }
}

export default Pangram

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

Пожалуйста, что на самом деле происходит во втором решении

Я добавляю использованный набор тестов для этого задания для любопытных читателей

import Pangram from './pangram'

describe('Pangram()', () => {
  it('empty sentence', () => {
    const pangram = new Pangram('')
    expect(pangram.isPangram()).toBe(false)
  })

  it('pangram with only lower case', () => {
    const pangram = new Pangram("the quick brown fox jumps over the lazy dog")
    expect(pangram.isPangram()).toBe(true)
  })

  it("missing character 'x'", () => {
    const pangram = new Pangram("a quick movement of the enemy will jeopardize five gunboats")
    expect(pangram.isPangram()).toBe(false)
  })

  it("another missing character 'x'", () => {
    const pangram = new Pangram("the quick brown fish jumps over the lazy dog")
    expect(pangram.isPangram()).toBe(false)
  })

  it("pangram with underscores", () => {
    const pangram = new Pangram("the_quick_brown_fox_jumps_over_the_lazy_dog")
    expect(pangram.isPangram()).toBe(true)
  })

  it("pangram with numbers", () => {
    const pangram = new Pangram("the 1 quick brown fox jumps over the 2 lazy dogs")
    expect(pangram.isPangram()).toBe(true)
  })

  it('missing letters replaced by numbers', () => {
    const pangram = new Pangram("7h3 qu1ck brown fox jumps ov3r 7h3 lazy dog")
    expect(pangram.isPangram()).toBe(false)
  })

  it('pangram with mixed case and punctuation', () => {
    const pangram = new Pangram("\"Five quacking Zephyrs jolt my wax bed.\"")
    expect(pangram.isPangram()).toBe(true)
  })

  it('pangram with non-ascii characters', () => {
    const pangram = new Pangram("Victor jagt zwölf Boxkämpfer quer über den großen Sylter Deich.")
    expect(pangram.isPangram()).toBe(true)
  })
})

Спасибо

1 Ответ

1 голос
/ 02 июня 2019

В строке

var set = new Set(this.text.toLowerCase().replace(/[^A-Za-z]/g, ''))

Регулярное выражение соответствует всем не алфавитным символам (или, точнее, всем символам, не входящим в базовый латинский алфавит ISO ). Таким образом, строка, переданная в конструктор Set, будет содержать строчные версии всех буквенных символов в строке text.

Конструктор Set принимает итеративный параметр и просматривает его, добавляя только один из его отдельных элементов в набор. Строка - это повторяемый объект, элементами которого являются символы в строке. Таким образом, new Set("pangram") будет Set, содержащим ровно 6 элементов "p", "a", "n", "g", "r" и "m". Обратите внимание, что в нем 6, а не 7 элементов. Строка "pangram" имеет два экземпляра буквы "a", но Set содержит только уникальные / отличные элементы. Таким образом, (new Set("pangram")).size есть 6.

В строчном латинском алфавите ровно 26 различных букв. Если строка, содержащая только строчные буквы, передается в конструктор Set, size результирующего Set может быть не более 26. Если это ровно 26, это означает, что по крайней мере один из каждого из 26 Должны присутствовать буквы ... это означает, что исходная строка является панграммой. Если оно меньше 26, то в исходной строке должна отсутствовать хотя бы одна из 26 букв алфавита, то есть это не панграмма.

Итак, str => new Set(str.toLowerCase().replace(/[^a-z]/g,'')).size === 26 - это краткий способ написать функцию, чтобы определить, является ли ее входная строка панграммой или нет. Краткость имеет свои достоинства, хотя она может быть абсурдной , если ее довести до крайности .

Хорошо, надеюсь, это помогло. Удачи в кодировании!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...