酒と泪とRubyとRailsと

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

アルゴリズムの勉強: 文章中に隠れた数字の合算[AOJ 0064][Ruby/Python/c++]

引き続きプログラミングの基礎体力づくりと、Python/c++の勉強を兼ねてアルゴリズムを勉強中です。今回は『文章中に隠れた数字の合算』について勉強しました。AIZU Online Judgeで対応している問題は、『Secret Number』です。ライト言語であれば便利な標準ライブラリでワンライナーでも書けちゃうような問題ですが、c++だと、可読性を上げつつ、グローバル変数使わないように。。。とかで結構悩みました。でもプログラムを普段よりも幅広い側面で考えられるので、結構楽しいです^^


サンプル問題(AOJ)

Secret Number
Aizu Online Judge。メモされた文章を読み込んで、その中にある数字を合算した結果の「暗証番号」

Rubyのサンプルソース

1
2
3
4
5
arr = []
while gets
  arr += $_.chomp.scan(/[0-9]+/)
end
puts arr.map(&:to_i).inject(:+)

Pythonのサンプルソース

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import re

sum = 0
while True:
  try:
    str = raw_input()
    r = re.compile(r'[0-9]+')
    arr = r.findall(str)
    for a in arr:
      sum += int(a)
  except:
    break

print sum

Pythonの正規表現、早く覚えないと。。

[python]正規表現 - コンパイル、マッチング、マッチした部分の取り出し

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
#include <iostream>
using namespace std;

int addCharNum(string s, int *i){
  int n = 0;
  int j;
  for (j = *i; '0' <= s[j] && s[j] <= '9' && j < s.size(); j++){
    n *= 10;
    n += s[j] - '0';
  }
  *i = j;
  return n;
}

int main() {
  int sum = 0;
  int i;
  string s;
  while(cin>>s) {
    for(i = 0; i < s.size() ; i++) {
      if('0' <= s[i] && s[i] <= '9') {
        sum += addCharNum(s, &i);
      }
    }
  }
  cout << sum << endl;
}

いろいろ書いていて悩んでいたusing namespace stdの意味。

c++では、iostream.hはiostreamになって、古いヘッダファイルをインクルードしている既存のプログラムをエラーにせず、 新しいヘッダをインクルードすることで名前空間に包んだ安全な関数を呼び出せるようにするために書く。

using namespace std;の是非

Aizu Online Judgeのサンプルソース

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

morizyun/aoj-ruby-python - GitHub

最近解いたAOJの問題

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

おすすめの書籍