AIZU ONLINE JUDGE ITP1_9_Dをpythonで解いてみた

python

本サイトAIZU ONLINE JUDGE ITP1_9_D へはこちらから

目次

問題:文字列変換

文字列 str に対して、与えられた命令の列を実行するプログラムを作成してください。命令は以下の操作のいずれかです:

  • print a b: str の a 文字目から b 文字目までを出力する。
  • reverse a b: str の a 文字目から b 文字目までを逆順にする。
  • replace a b p: str の a 文字目から b 文字目までを p に置き換える。

ここでは、文字列 str の最初の文字を 0 文字目とします。

Input

1 行目に文字列 str が与えられます。str は英小文字のみ含みます。2 行目に命令の数 q が与えられます。続く q 行に各命令が上記の形式で与えられます。

Output

各 print 命令ごとに文字列を1行に出力してください。

Constraints

  • 1≤strの長さ≤1000
  • 1≤q≤100
  • 0≤a≤b<strの長さ
  • replace 命令では b−a+1=pの長さ

Sample Input 1

abcde
3
replace 1 3 xyz
reverse 0 2
print 1 4

Sample Output 1

xaze

Sample Input 2

xyz
3
print 0 2
replace 0 2 abc
print 0 2

Sample Output 2

xyz
abc

解答例

text = input()
q = int(input())
for _ in range(q):
    order = input().split()
    a, b = map(int, order[1:3])
    if order[0] == "print":
        print(text[a:b+1])
    elif order[0] == "reverse":
        re_text = text[a:b+1]
        text = text[:a]+re_text[::-1]+text[b+1:]
    else:
        text = text[:a]+order[3]+text[b+1:]

解説

以下のように解いていきます。

  1. 1つの文字列の読み込み
  2. 1つの整数の読み込み
  3. 条件ごとに指定の文字列の表示

1つの文字列の読み込み

ここでは、input関数を使用し、任意の文字列を取得します。

# キーボードからの入力を文字列として受け取る
text = input()

※サイト内「AIZU ONLINE JUDGE ITP1_1_Bをpythonで解いてみた」の、input関数とはに使用方法が書かれておりますのでぜひご覧ください。

1つの整数の読み込み

キーボードから文字列を受け取るときに使用するinput関数をint関数で囲み、整数値として受け取ります。

# input関数をint関数で囲み、整数値として変数に代入
q = int(input())

条件ごとに指定の文字列の表示

まずは、for文のイテラブルをrange(q)とすることで、2.1つの整数の読み込みで受け取った整数分、ループ処理を行います。

# 2.1つの整数の読み込み で受け取った整数分、処理を繰り返す
for i in range(q):

続いて、for文内で命令(“print” or “reverse” or “reverse”から始まる空白区切りの一文)を受け取り、変数orderに入れます。
※このとき、値はリスト型として変数orderに入ります。

# 命令を空白区切りで受け取り リストとして変数orderに設定
order = input().split()

続いて、map関数を使い、引数のイテラブルをorder[1:3]とすることで、変数orderの数字部分を整数(int)型としてa,bに入れます。
※スライスのインデックスが0から始まる事に注意してください。インデックスのイメージは以下です。インデックスは文字と文字の間(between)を指しており、最初の文字の左端が0になっています。

# 変数orderの整数部分を変数a,bに設定
a, b = map(int, order[1:3])

続いて、if文を使用して、受け取った命令に応じて文字列を変更します。order[0]には”print”、”reverse”、”replace”のどれかが入ります。

order[0]が”print”の場合、1.1つの文字列の読み込みで受け取った文字列の[a:b+1]の範囲を表示します。

# 命令(order[0])が"print"の場合
if order[0] == "print":
    # aからbまでを表示
    print(text[a:b+1])

order[0]が”reverse”の場合、まずre_textに反転したい文字列を設定します。

続いてリスト名[::-1](今回はre_text[::-1])とすることでリストが反転します。

※サイト内の「【python】スライスの使い方」にスライスの使用方法が書かれておりますのでよかったらご覧ください。

最後に aまでの文字列 + 反転した文字列 + b以降の文字列 を連結することで、特定の範囲の文字のみ反転する事ができます。

# 命令(order[0])が"reverse"の場合
elif order[0] == "reverse":
    # aからbを変数re_textに設定
    re_text = text[a:b+1]
    # aまでの文字列 + 反転した文字列(リスト名[::-1]でリストが反転) + b以降の文字列
    text = text[:a]+re_text[::-1]+text[b+1:]

order[0]が”replace”の場合、置き換える文字列order[3]を aまでの文字列 + 置き換える文字列 + b以降の文字列 の順で連結することで、特定の文字のみ入れ替えて表示する事ができます。

# 命令(order[0])が"replace"の場合
else:
    # aまでの文字列 + 置き換える文字列 + b以降の文字列
    text = text[:a]+order[3]+text[b+1:]

一連の流れをまとめると以下になります。

# 2.1つの整数の読み込み で受け取った整数分、処理を繰り返す
for i in range(q):
    # 命令を空白区切りで受け取り リストとして変数orderに設定
    order = input().split()
    # 変数orderの整数部分を変数a,bに設定
    a, b = map(int, order[1:3])
    # 命令(order[0])が"print"の場合
    if order[0] == "print":
        # aからbまでを表示
        print(text[a:b+1])
    # 命令(order[0])が"reverse"の場合
    elif order[0] == "reverse":
        # aからbを変数re_textに設定
        re_text = text[a:b+1]
        # aまでの文字列 + 反転した文字列(リスト名[::-1]でリストが反転) + b以降の文字列
        text = text[:a]+re_text[::-1]+text[b+1:]
    # 命令(order[0])が"replace"の場合
    else:
        # aまでの文字列 + 置き換える文字列 + b以降の文字列
        text = text[:a]+order[3]+text[b+1:]

最後に、もう一度プログラムを確認してみましょう。

# キーボードからの入力を文字列として受け取る
text = input()
# input関数をint関数で囲み、整数値として変数に代入
q = int(input())
# 2で受け取った整数分、処理を繰り返す
# 2.1つの整数の読み込み で受け取った整数分、処理を繰り返す
for i in range(q):
    # 命令を空白区切りで受け取り リストとして変数orderに設定
    order = input().split()
    # 変数orderの整数部分を変数a,bに設定
    a, b = map(int, order[1:3])
    # 命令(order[0])が"print"の場合
    if order[0] == "print":
        # aからbまでを表示
        print(text[a:b+1])
    # 命令(order[0])が"reverse"の場合
    elif order[0] == "reverse":
        # aからbを変数re_textに設定
        re_text = text[a:b+1]
        # aまでの文字列 + 反転した文字列(リスト名[::-1]でリストが反転) + b以降の文字列
        text = text[:a]+re_text[::-1]+text[b+1:]
    # 命令(order[0])が"replace"の場合
    else:
        # aまでの文字列 + 置き換える文字列 + b以降の文字列
        text = text[:a]+order[3]+text[b+1:]
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

雇われのシステムエンジニアです。
普段は車載ECUのセキュリティー分野に従事しております。

■保有資格
Salesforce 認定 Platform アプリケーションビルダー
Salesforce 認定 Platform デベロッパー

コメント

コメントする

目次