Aizu Online Judge(AOJ)が提供している「プログラミング入門」(ITP1)の8_C問題をC++とPython で解いてみました。
ITP1 のトピック8では、文字について学びます。「プログラムで文字を扱う方法を学習します。」とあります。この学習コースを通じて、Python に慣れていきたいと考えています。
問題(8_C: Counting Characters)
問題はリンク先をご覧ください。
AOJ ITP1 8_C問題:Counting Characters
与えられた文字列から英字の頻度をカウントする問題です。
解答案
C++ プログラム例(ITP1 8_C)
空白を含む行を読み込むため、iostream ではなく、stdio.h を使います。英字の頻度をカウントする配列 alpha を用意して、英字であれば小文字に変換して頻度を alpha に格納しています(13、17行目)。
#include <cstdio>
#include <cctype>
using namespace std;
int main()
{
char ch;
int alpha[26] = {};
while (scanf("%c", &ch) != EOF) {
if (isalpha(ch)) {
++alpha[tolower(ch) - 'a'];
}
}
for (int i = 0; i < 26; i++) {
printf("%c : %d\n", i + 'a', alpha[i]);
}
return 0;
}
配列の代わりに map を使うと以下となります。map を使う方が、添え字がすっきりと書けています(14、18行目)。
#include <map>
#include <cstdio>
#include <cctype>
using namespace std;
int main()
{
char ch;
map<char, int> alpha;
while (scanf("%c", &ch) != EOF) {
if (isalpha(ch)) {
++alpha[tolower(ch)];
}
}
for (char ch = 'a'; ch <= 'z'; ++ch) {
printf("%c : %d\n", ch, alpha[ch]);
}
return 0;
}
Python プログラム例(ITP1 8_C)
Python では、辞書(dict)を使います。ただし、値がない場合に dict はエラーになります。この場合も考慮して、defaultdict を使いました(1、11行目)。これは、C++ の map 版と同様に、すっきりと書けています。
入力の終端(End Of File)まで読むために、try – except を使っています。
また、英字小文字だけを含んだ文字列を参照するために string.lowercase を使いました(2、16行目)。
from collections import defaultdict
import string
s = ""
while True:
try:
s += input()
except EOFError:
break
alpha = defaultdict(int)
for i, ch in enumerate(s):
if ch.isalpha():
alpha[ch.lower()] += 1
for ch in string.ascii_lowercase:
print(f"{ch} : {alpha[ch]}")
上記プログラムは、すべて AOJ で「AC(Accepted=正解)」と判定されます。
最後に
文字の頻度をカウントするために、C++ では、配列とmapを使いました。Python では、辞書(defaultdict)を使いました。
引き続き、ITP1 の問題を紹介していきます。