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


AIZU Online Judgeの『文章中に隠れた数字の合算 Secret Number』をRuby/Python/c++で解いてみました。
c++だと、可読性を上げつつ、グローバル変数使わないように…とかで結構悩みました。でもプログラムを普段よりも幅広い側面で考えられるので、結構楽しいです^^

🚌 AOJ問題

Secret Number

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

🏀 Rubyコード

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

😸 Pythonコード

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++コード

#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;の是非

😎 GitHubリポジトリ

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

morizyun/aoj-ruby-python - GitHub

📚 おすすめの書籍