POJ 1566 - Haiku Review

http://poj.org/problem?id=1566

概要

3行の俳句が与えられる. 各行はそれぞれ 5, 7, 5 の音節を持たなければならない.

音節の数が間違っている最初の行を答える. すべて正しい場合は Y と答える.

1音節は単語中の連続する母音からなり,母音は 'a', 'e', 'i', 'o', 'u', 'y' である.

制約

解法

やるだけ.

 1 #include <iostream>
 2 #include <sstream>
 3 #include <vector>
 4 using namespace std;
 5 
 6 bool vowel(char c)
 7 {
 8   return c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u' || c == 'y';
 9 }
10 
11 int syllables(const string& word)
12 {
13   int c = 0;
14   for (string::const_iterator it = word.begin(); it != word.end();) {
15     if (vowel(*it)) {
16       ++c;
17       while (it != word.end() && vowel(*it)) {
18         ++it;
19       }
20     } else {
21       ++it;
22     }
23   }
24   return c;
25 }
26 
27 int main()
28 {
29   string inp;
30   while (getline(cin, inp) && inp != "e/o/i") {
31     vector<int> cs;
32     istringstream iss(inp);
33     string line;
34     while (getline(iss, line, '/')) {
35       int c = 0;
36       istringstream ss(line);
37       string word;
38       while (ss >> word) {
39         c += syllables(word);
40       }
41       cs.push_back(c);
42     }
43     if (cs[0] == 5 && cs[1] == 7 && cs[2] == 5) {
44       cout << "Y" << endl;
45     } else {
46       for (int i = 0; i < 3; i++) {
47         static int tbl[] = {5, 7, 5};
48         if (cs[i] != tbl[i]) {
49           cout << i+1 << endl;
50           break;
51         }
52       }
53     }
54   }
55   return 0;
56 }
poj/1566.cc