冬期休暇
昨日から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; } };