Sae/note

【Codewars】pangramの検出

目次

    毎日codewarsに取り組んでいます!

    codewarsで学んだこと、もう少し深堀して調べたことをで残します。
    今回はcodewarsでやったパングラムについてやっていきます

    pangramとは

    パングラム (pangram) は、アルファベットを使用する言葉遊びである。ギリシア語で「すべての文字」という意味がある通り、すべての文字(26個のアルファベット)を使い文章を作るのが目的である。

    https://ja.wikipedia.org/wiki/%E3%83%91%E3%83%B3%E3%82%B0%E3%83%A9%E3%83%A0

    Let's Challenge

    inputした文字列がa~zのアルファベットをすべて含んでいたらをtrue、
    いなければfalseを返す関数を作成する

    最初に書いたコード

    40分かけて生み出したコードです...

    渡ってきた文字列をアルファベット順にsortし、
    Setを使用し重複を取り除き、変数alhaと一致しているかの結果を返しました

    const f = (string) => {
      const alha = "abcdefghijklmnopqrstuvwxyz";
      const arr = string.toLowerCase().split("");
      const filterArr = arr.sort().filter((s) => alha.includes(s));
      return [...new Set(filterArr)].join("") === alha;
    };
    
    console.log(f("The quick brown fox jumps over the lazy dog.")); // true
    console.log(f("This is not a pangram.")); // false
    console.log(f("Cozy lummox gives smart squid who asks for job pen.")); // true
    

    いろんな回答をみてみる

    codewarsではほかの方の回答を見ることができ、「いいね!」と思った回答にはbestPracticeを押すことができます。いくつかピックアップしてみてみました。

    match

    これは思いつかないな、と感じました。。。

    const f = (string) => {
       return  new Set(string.toLowerCase().match(/[a-z]/g)).size === 26;
    };
    

    filter

    アルファベットをfilterして一致しないアルファベットの数が0か否かの結果を返す

    const f = (string) => {
        const s = string.toLowerCase();
        const alha = "abcdefghijklmnopqrstuvwxyz";
        return alha.split("").filter((a) => s.indexOf(a) === -1 ).length === 0;
    };
    

    every

    個人的にはこれが一番わかりやすくてイイナと思いました

    const f = (string) => {
       const alha = [..."abcdefghijklmnopqrstuvwxyz"];
       return alha.every((a) => string.toLowerCase().includes(a));
    };