PaizaのDランクの演習問題とスキルチェック問題について、現在出ている分が全て片付きました。そして、今度はCランクのスキルチェック通過を目指して、少し前ぐらいからCランクの演習問題を少しづつ解き始めています。
いくつかCランクの演習問題を解いた感じですが、現時点のスキルではなかなか難しい。いくつかの処理を組み合わせるなど、多少手の込んだアルゴリズムも要求されるように感じました。解答に必要なコードも、Dランクに比べたらそこそこ長くなってくる。
Cランクでは、文字列に含まれる特定の文字や単語の数を数える処理を解答する問題が登場してきます。「スキルチェック入門編」(Cランク)でも、文字列中の単語の数を数える問題について解説されています。
「スキルチェック入門編」(Cランク)の方は、Pythonを使った場合の解答になってました。私はRubyを使っているので、「スキルチェック入門編」(Cランク)の解説とは異なる、次の方法で解答しました。
1.まず、文字列を単語別、文字別の配列に変換する。
2.変換した配列について、.uniqメソッドで重複を取り除いた(各要素が1個づつ含まれる)チェック用の配列を新たに作ります。
3.チェック用の配列の各要素について、元の配列にそれぞれ含まれている数をカウントし、それぞれの要素の数をカウント結果格納用の配列に入れていきます。
4.カウント結果を格納している配列の要素を取り出して表示することで、元の文字列に文字別、単語別で含まれている数を出力できます。
これによって、問題文で指定された単語の数を出力できました。なお、今回は「出現順」とあったので、重複を取り除いた配列を作るところで並べ替えを行ってません。もし「昇順/降順に出力せよ」が問題文にあった場合は、重複を除いた配列を作ったところで、昇順なら.sort、降順なら.sort.reverseメソッドで要素の並び替えを行うようにします。
ここでふと思いましたが、配列に含まれる文字や単語のカウントを応用することで、ポーカーの役判定ができるのでは?
手札中の同じ数字のカードの枚数を数えた結果をカウント用配列に入れ、それを並び替える。そして、カウント用配列の要素の内容から役を判定します。例えば、カウント用配列の内容を降順に並び替えて[4,1]なら4カード、[2,2,1]なら2ペアといった具合で。[1,1,1,1,1](同じ数字のカードが無い)の場合は、カードが5連番になっているか、カードのスートが一致しているかにより、ストレートか、フラッシュか、ノーペア(役無し)の判定をします。
余裕があるときにでもポーカーの役判定プログラムを書いてみようかな?