Aizu Online Judge(AOJ)が提供している「プログラミング入門」(ITP1)の9_B問題をC++とPython で解いてみました。
ITP1 のトピック9では、文字列について学びます。「文字列処理の基礎を学習します。」とあります。この学習コースを通じて、Python に慣れていきたいと考えています。
問題(9_B: Shuffle)
問題はリンク先をご覧ください。
部分文字列を取り出すことを学びます。
解答案
C++ プログラム例(ITP1 9_B)
C++ では、部分文字列を string クラスの substr メソッドで切り出します。以下の関数仕様については、cpprefjp を参考にしました。
string substr(size_type pos = 0, size_type n = npos)
引数
- pos : 切り出す文字列の最初のインデックス
- n : 切り出す文字の数、省略した場合は、文字列末まで切り出す
戻り値
- 切り出した文字列(string クラス)
本体部分は、n 個の数を読み込み、問題に従い文字列を操作します。C++ の解答案は以下となります。
#include <iostream>
#include <string>
using namespace std;
int main()
{
while (1) {
string s;
cin >> s;
if (s == "-") {
break;
}
int n;
cin >> n;
for (int i = 0; i < n; ++i) {
int h;
cin >> h;
string s1, s2;
s1 = s.substr(h);
s2 = s.substr(0, h);
s = s1 + s2;
}
cout << s << endl;
}
return 0;
}
Python プログラム例(ITP1 9_B)
Python は、リストに適用できるスライス記法を使います。
[lower_bound : upper_bound : stride]
- lower_bound : 切り取りたい部分の開始インデックス
- upper_bound : 切り取りたい部分の終わりを一つ越えたインデックス
- stride : 何個毎に切り出すか指定する。
2番目と3番目は、省略可能です。2番目を省略すれば、リスト末まで切り出せます。3番目を省略すると 1 が指定されます。
while True:
s = input()
if s == "-":
break
n = int(input())
for i in range(n):
h = int(input())
s = s[h:] + s[0:h]
print(s)
上記プログラムは、すべて AOJ で「AC(Accepted=正解)」と判定されます。
最後に
部分文字列を切り出す方法を整理しました。C++ は、string クラスのメソッド substr を使いました。Python は、一般的なリストに適用できるスライス記法を使いました。
引き続き、ITP1 の問題を紹介していきます。