2017-11-28 8 views
0

私はCodeFightsというサイトで初心者コーディングをしています。私は、より高い評価を受けたコーダーの多くが私よりはるかに簡潔な答えを持っていることに気付きました。 、より簡潔なアルゴリズムを書くには?

が文を考えると、それはpangramであるかどうかを確認します

は、例えば、この問題を取ります。
例: 文章で「茶色のキツネが怠惰な犬の上を飛びます」と出力 は でなければなりませんisPangram(sentence)= true;
sentence = "abcdefghijklmnopqrstuvwxya"の場合、出力は isPangram(sentence)= falseである必要があります。

入力/出力

  • [期限] 3000ms(CS)
  • [入力]列文

範囲におけるそれらのASCIIコードで文字を含む文字列[ 32,126]。

保証制約:

1≤≤sentence.length 100

  • [出力]文はパングラムがある場合
    真、そうでない場合はfalseのブール。

[C#の]構文のヒント

// Prints help message to the console 
// Returns a string 
string helloWorld(string name) { 
    Console.Write("This prints to the console when you Run Tests"); 
    return "Hello, " + name; 
} 

私のコードは次のとおりです。

bool isPangramMine(string sentence) 
    { 
     char[] stringToCharArray = sentence.ToLower().Distinct().ToArray(); 
     Array.Sort(stringToCharArray); 
     string joinedkArrayToCheck = String.Join("", stringToCharArray); 
     MatchCollection matches = Regex.Matches(joinedkArrayToCheck, "[a-z]"); 
     string[] stringMatchArray = new string[matches.Count]; 
     for (int i = 0; i < matches.Count; i++) 
      stringMatchArray [i] = matches[i].Groups[0].Value; 
     string joinedArrayToString = String.Join("", stringMatchArray); 
     Console.WriteLine(joinedArrayToString); 
     if (joinedArrayToString .Length == 26) 
      return true; 
     else 
      return false; 
    } 

最高の定格C#の答えは、スローモーションという名前の誰かによって書かれました。その答えは次のとおりです。

int isPangram(string s) => s.ToUpper().Distinct().Count(_ => _ > 64 && _ < 91)/26; 

スローモーションのコードがreturnキーワードを使用せずに値を返している方法は?

このような回答はherehereですが、どのように動作するかを説明せずに簡略化したコードしかありません。

私が使用できるリソースを教えてくれる答えを探していますが、自分でSlomoのコードを分解していますが、自分自身で説明する時間がある人も大いに感謝しています。

+0

この種の質問は[codereview.se]に適しています。 – Filburt

+0

正確なプログラミングの問題については尋ねていないが、コーディングをより賢くする方法について質問しているので、それは話題にはならないと私は言うだろう。これは誰も単に答えで説明することができず、そのようなサイトはあなたをクリックするだけです。これを解決するには、常に学び続ける努力が必要です。 – Steve

+0

最高の定格応答が仕様のリターンタイプ要件を満たさないことは皮肉です。 –

答えて

0

簡潔なコードは、必ずしも努力するものではありません。現実的には、あなたが提供したサンプルは、高い評価を受けていますが、私が簡潔に呼ぶものではありません。私はそれを簡潔と呼ぶだろうし、私はそれを間違って呼ぶかもしれない。知識をひけらかすビーイング

、提供されるサンプルのより正確なバージョンは次のようになります。

  1. .ToUpper()が入力を変換します。サンプルが何をするよう

    bool isPangram(string s) => s.ToUpper().Distinct().Count(_ => _ >= 'A' && _ <= 'Z') == 26;

    、いくつかのステップがあります文字列を大文字に変換します。

  2. .Distinct()は、文字列を文字列の個別リストに変換します(文字列に表示される各文字値は、リストに一度表示されます)。
  3. .Count(_ => _ > 64 && _ < 91)は、64より大きい(文字AのASCIIコードは65です)、91未満(文字ZのASCIIコードは90です)の要素の数を返します。
  4. / 26未満26
  5. 01が自動的にキャストされますがある場合は、最終的なリストでは26個の要素は、0(26個の(英語)アルファベットの文字がある)がある場合は1を返します。ブール値falseおよびtrueです。

コードをより簡潔に書く方法は、時間と実践が伴います。あなたの目標に対する抵抗の少ない道を知ることが第一歩です。あなたが選んだ言語のすべてを知っていれば、最も簡単な解決策を実現する最も簡単な方法を見つけるのに役立ちます。

希望に役立ちます。

+0

お返事ありがとうございました。私は幾分自己学習しているので、最初にそれを見たとき、私はコーディングの原則に関する重要な教訓を見逃していたことを心配していました。 –

0

「返信キーワードを使用せずにSlomoのコードはどのように値を返すのですか?」

これはC#を使用しています。これは、式で表される関数を宣言します。ここでは方法のための古いもの C# 6.0 Gets More Concise…

の記事そして、specificationからは次のようになります。

式本体は=>式と セミコロンで構成されており、実行するために単一の式を表し、メソッド が呼び出されたとき。

+0

私はまだupvoteできません、私はすでに答えを受け入れましたが、私はあなたの答え、あなたがリンクしているリソースに感謝しなければなりません。これはまさに私が探していたものでした。 –

関連する問題