Aizu Online Judge(AOJ)が提供している「プログラミング入門」(ITP1)の9_D問題をC++とPython で解いてみました。
ITP1 のトピック9では、文字列について学びます。「文字列処理の基礎を学習します。」とあります。この学習コースを通じて、Python に慣れていきたいと考えています。
問題(9_D: Transformation)
問題はリンク先をご覧ください。
与えられた命令に従い、文字列の一部を逆にしたり、置き換えていきます。
解答案
C++ プログラム例(ITP1 9_D)
問題文に記載されている命令は、インデックス(場所)で記載されています。一方、文字列を切り出す substr 関数の第2引数は、切り出す長さを指定します。このため、0 文字目からカウントして、a 文字目から b 文字目を切り出すには、以下となります。
str.substr(a, b – a + 1)
a 文字目から b 文字目の長さは、b – a ではなく、b – a + 1 文字あることに注意が必要です。
それぞれの命令で行うことをまとめておきます。
- print: a 文字目から b 文字目を切り出して、出力する。
- reverse: a 文字目から b 文字目を切り出して逆順にして、元の文字列と連結する。
- replace: 文字列 p を読み込み、元の文字列と連結する。
解答案の C++ プログラムは以下となります。
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
string str;
cin >> str;
int q;
cin >> q;
for (int i = 0; i < q; ++i) {
string op;
cin >> op;
int a, b;
cin >> a >> b;
if (op == "print") {
cout << str.substr(a, b - a + 1) << endl;
} else if (op == "reverse") {
string t = str.substr(a, b - a + 1);
reverse(t.begin(), t.end());
str = str.substr(0, a) + t + str.substr(b + 1);
} else if (op == "replace") {
string p;
cin >> p;
str = str.substr(0, a) + p + str.substr(b + 1);
} else {
// Not reached
}
}
return 0;
}
Python プログラム例(ITP1 9_D)
Python では、substr の代わりにスライス記法を使います。文字列を逆順にするために、reversed する必要があります。これは、Python の文字列は、書き換えができないため、reverse が用意されていないためです。この結果を join しています。
変数名は、str が予約されているため、単純に s としました。
以下が、Python 版となります。
s = input()
q = int(input())
for i in range(q):
query = input().split()
op = query[0]
a = int(query[1])
b = int(query[2])
if op == "print":
print(s[a:b + 1])
elif op == "reverse":
t = "".join(list(reversed(s[a:b + 1])))
s = s[0:a] + t + s[b+1:]
elif op == "replace":
p = query[3]
s = s[0:a] + p + s[b+1:]
上記プログラムは、すべて AOJ で「AC(Accepted=正解)」と判定されます。
最後に
トピック9では、文字列について学びました。わたしが一番慣れているのは、C ですが、C++ と Python のどちらも文字列をサポートする機能が多いことを再認識しました。
引き続き、ITP1 の問題を紹介していきます。