酒と泪とRubyとRailsと

Ruby on Rails と Objective-C は酒の肴です!

アルゴリズムの勉強: カードゲームの判定[AOJ 0060][Ruby/Python/c++]

引き続きプログラミングの基礎体力づくりと、Python/c++の勉強を兼ねてアルゴリズムを勉強中です。今回は『カードゲームの判定』について勉強しました。AIZU Online Judgeで対応している問題は、『Card Game』です。c++は最近購入したアルゴリズム本の解説ソースがc++なのでついでに勉強中ですが、やっぱり処理速度が全然違いますね〜


サンプル問題(AOJ)

The Balance of the World
Aizu Online Judge。与えられる文字列は,丸括弧(“( )”)と角括弧(“[ ]”)の二種類の括弧を含むことがある。このカッコの対応関係が正しいかをチェックする問題。

Rubyのサンプルソース

1
2
3
4
5
6
while gets do
  c1, c2, c3 = $_.chomp.split(' ').map(&:to_i)
  rem = (1..10).to_a - [c1, c2, c3]
  per = rem.map{ |i| c1 + c2 + i <= 20 ? 1 : 0 }.inject(:+)/7.0
  puts per >= 0.5 ? 'YES' : 'NO'
end

Pythonのサンプルソース

1
2
3
4
5
6
7
8
9
10
11
12
13
14
while True:
  try:
    count = 0
    c1, c2, c3 = map(int, raw_input().split())
    for i in range(1, 11):
      if i in [c1, c2, c3]: continue
      if c1 + c2 + i <= 20: count += 1

    if count/7.0 >= 0.5:
      print 'YES'
    else:
      print 'NO'
  except:
    break

c++のサンプルソース

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>

using namespace std;

int main() {
    int i;
    int c1, c2, c3;
    int count;
    int sum = 0;

    while (cin >> c1 >> c2 >> c3) {
        count = 0;
        for(i = 1; i < 11; i++) {
            if (c1 == i || c2 == i) {
                continue;
            } else if (c1 + c2 + i <= 20) {
                count++;
            }
        }

        if ((double)count/7.0 >= 0.5) {
            cout<<"YES"<<endl;
        } else {
            cout<<"NO"<<endl;
        }
    }
    return(0);
}

Aizu Online Judgeのサンプルソース

当面はAOJを解きながら、アルゴリズムの再勉強をしていくつもりです。Ruby/PythonでのAOJの回答は下のリポジトリに保存しておきます。もしツッコミとかあれば是非^^

morizyun/aoj-ruby-python - GitHub

最近解いたAOJの問題

AOJタグのついた最近解いた問題一覧

おすすめの書籍