応用プログラミング及び実習 2019年度 第5回 実習課題B

以下の課題を全てやりなさい.

課題B-1

数あてゲームを作ろう.以下が正しく動作するよう修正しよう.

random.randint() についてはこちら: https://docs.python.jp/3/library/random.html#random.randint

また,動作がおかしくなったり(セルの左の '[1]' が '[*]' になったままになる,とか)実行を中断したくなったら,JupyterLab の■ボタンを押せばよいです.

In [ ]:
import random   # random モジュールの読み込み

nmax = 255
n = random.randint(1, nmax)  
print("1以上{:d}以下の数を選んだよ.当ててみ.".format(nmax))

cnt = 0  # 数を入力した回数をカウント

while True:
    x = int(input("数を入力してね:"))
    if n > x:
        print("もっと大きいで")
    elif n < x:
        print("もっと小さいで")
        
print(cnt, "回で当たり〜")

課題B-2

pp.167-171 を読んで理解しながら,以下を実行してみよう.

In [ ]:
orig_str = "いっぱい"
orig_str.replace("い", "お")

(よだんだよん) https://docs.python.jp/3/library/stdtypes.html#str.replace によると,キーワード引数使って置換回数を指定できます....

In [ ]:
str_num = "1,000,000"
num = int(str_num.replace(",", ""))
num
In [ ]:
%matplotlib inline
import matplotlib.pyplot as plt

str_speeds = "38 42 20 40 39"       # 戦車のスピード(km/h)
str_armor = "80 50 17 50 51"        # 戦車の装甲厚(mm)
speeds = str_speeds.split(" ")      # 速度をスペースで分割
armors = str_armor.split(" ")       # 装甲厚をスペースで分割
markers = ["o", "v", "^", "<", ">"]

for idx in range(len(speeds)):      # リストの長さ分ループ
    x = int(speeds[idx])            # 文字列を数値に変換
    y = int(armors[idx])
    plt.scatter(x, y, marker=markers[idx])    # 散布図を描く


#IV号戦車(o) LT-38(v) 八九式中戦車(^) III号突撃砲(<) M3中戦車(>)
In [ ]:
str_speeds = "38 42 20 40 39"  # 空白で区切られた数値
speeds = str_speeds.split()    
csep_speeds = ",".join(speeds)
print(csep_speeds)
In [ ]:
str_speeds2 = " 38  42 20      40 39  "    # 余分な空白が入った文字列
print(str_speeds2.replace(" ", ","))
In [ ]:
speeds2 = str_speeds2.split()     # split メソッドは何をする?
csep_speeds2 = ",".join(speeds2)
print(csep_speeds2)

課題B-3

pp.174-176を参考にしながら,いろいろやってみよう.

In [ ]:
S = "げほげほ...GEHOGOHOGEFU...GEHOGEFUN"

この文字列の先頭から "HOGE" という文字列を探し,最初に見つけたものの位置を返すコードを書きなさい.

In [ ]:
# このセルにコードを書く

同じ文字列の先頭から "HOGE" という文字列を探し,2番目に見つけたものの位置を返すコードを書きなさい(ヒント: ここでは単純に,開始インデックスを上記の戻り値より大きい数にすればよい).

In [ ]:
# このセルにコードを書く

上記の検索対象文字列を "hoge" および "ほげ" にして,どんな値が返ってくるか確認しなさい.

以下の文字列 S は,"\n"(改行文字)や"\t"(タブ)を含んでいます(pp.172,173).

In [ ]:
S = "Hoge   hoge \n ほげ\tHOGE\n"
print("#####")
print(S)
print("#####")

このような文字列に対して split メソッドを引数なしで適用すると,スペースだけでなく改行文字やタブも区切りとして文字列を分割します.

In [ ]:
T = S.split()
T
In [ ]:
for i in range(len(T)):
    print(i, T[i])

(よだんだよん) 正規表現というものを利用する re モジュールを利用すると,文字列メソッドだけではできないようなもっと複雑な検索や置換等の処理ができます.

文字列に対して次のように [ ] を使うと,指定の位置の文字を取り出すことができます.

In [ ]:
S = "abcdefghijklmnopqrstuvwxyz"
S[10]

スライスで部分列を指定することもできます.

In [ ]:
S[10:15]

スライスのステップ数を指定することもできます(詳しくはp.186).

In [ ]:
S[10:15:2]

だからこうすると逆順の文字列が得られます.

In [ ]:
S[::-1]

だからこうすると回文かどうか判定できます.

In [ ]:
bun = "tomato"
#bun = "トマト"
#bun = "きつめのあなたににたなあのめつき"    # http://d.hatena.ne.jp/Quaibun/ より
#bun = "ねつきわるいのいるわきつね"  # takataka作
if bun == bun[::-1]:
    print("回文です")
else:
    print("回文ではありません")    

これだと,bun とその逆順文字列の各文字を全部比較することになります. 本当はそれぞれの半分だけを比較すればok...

以下の文字列から "ほげ" (この2文字の連なり)を削除したものを作ってください.

In [ ]:
S = "ほほげげほげだらほげけでたほげいへんほげだほげったほげのよ,あほげりほげがほげとうほげ."
T = S   #  この行を修正
print(T)

(よだんだよん)「ほげ」とか hoge とか気になるひとはこちらへどうぞ.