wvogel日記

自分用の技術備忘録が多めです.

冬期休暇

昨日から2週間弱の短い冬期休暇に入りました


明日から北海道に旅行です。
準備も先ほど終わり、明日を待つのみ。


出かける前に何か軽いコーディングをしようと思い、TopCoderに慣れてみることにした。
練習場のような場所があり、ある程度の難易度の問題が出題される場所があった。
そこに、
「英字の総数」を「英字のみで構成された単語数」で割った値
の場合分けで値を出力するクラスを作成せよ、
という問いがあったので解いてみた。


少し長いので一番最後に掲載する。
簡単な内容なのだけれど、正答までにあちこちボロが出て、
もっと正確なコードを早く書けるようになりたいと感じた。

i,jの書き間違いとか、
avg = n / l;
の間違いに気がつかないとか。

TopCoderの良いところは、クラスの作成を要求されるから、
問いに集中できるところかな。


ちなみに、Haskellでも書いてみた、毎度のことながら。

list = ['a' .. 'z'] ++ ['A' .. 'Z']
 
main = getLine >>= print.f.answer
  where
   f m | m <= 3 = 250
       | m == 4 || m == 5 = 500
       | otherwise = 1000
 
answer :: String -> Int
answer str = length (map f str) `div`
                length ( filter (all f) $ words str)
  where
    f c = any (==c) list
#include<string>

using namespace std;

class HowEasy{
  public:
    int pointVal(string str){
      //n::単語数 length::英字数 avg::Int; avg = div l n;
      int n,length,i,avg;
      bool flag;
      string temp = "";
      n = length = i = 0;
      
      while(i < str.length()){
      
        if(str[i] != ' ')
          temp += str[i];
          
        if(str[i] == ' ' || i+1 == str.length()){
          int j = 0;
          flag = true;
          while( j < temp.length()){
            if(    ('a' > temp[j] && temp[j] > 'z')
                || ('A' > temp[j] && temp[j] > 'Z'))
              flag = false;
            else
              length++;
            j++;
          }
          if(flag)
            n++;
            
          temp = "";
        }
      i++;
      }
      
      avg = length /  n;
      
      if(avg <= 3)
         return 250;
      if(avg == 4 || avg == 5)
         return 500;
      else
         return 1000;
    }
};