言語処理100本ノック 2015年版 (00~09)
Pythonの勉強をしようと思っていたらちょうどいい問題が見つかったのでトライ。www.cl.ecei.tohoku.ac.jp
やっぱりプログラミングは楽しい。
出来上がった分からアップしていく。
00
#!/usr/bin/env python x="stressed" print(x[::-1])
01
#!/usr/bin/env python x="パタトクカシーー" print(x[::2])
00と01はPython独特のスライスに慣れてほしい、という問題。
02
#!/usr/bin/env python x="パトカー" y="タクシー" z="" for i in range(4): z=z+x[i]+y[i] print(z)
range(4)で決め打ちしたけどもう少し汎用性を上げるべきか。Pythonでのfor文を学ばせる問題のような気がしたが、別の解法があるのか。
03
#!/usr/bin/env python x= "Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics." y = x.split() z=[] for i in range(0,len(y)): z.append(len(y[i].strip(".").strip(","))) print(z)
「リストにしろ」と言われていたのに文字列で返していたので修正。split()とstrip()の使い方を学ばせる問題か。
04
#!/usr/bin/env python x= "Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can." y = x.strip(".").split() dict={} for i in range(0,len(y)): if i+1 in [1,5,6,7,8,9,15,16,19]: dict[i+1]=y[i][0] else: dict[i+1]=y[i][0:2] print(dict)
Pythonでのif文の使い方を学ばせる問題。
05
#!/usr/bin/env python def ngramlit(text,n): for i in range(0,len(text)-1): print(text[i:i+n]) def ngramlist(text,n): y = text.strip(".").split() for i in range(0,len(y)-1): print(y[i:i+n]) if __name__ == "__main__": text= "I am an NLPer" ngramlist(text,2) ngramlit(text,2)
文字bi-gramに空白を入れるべきなのかどうかが分からなかった。空白を抜くとなるといろいろやっかい。プログラミングよりも単語bi-gramとは何か、文字bi-gramとは何かを学ばせる問題のような気がする。
06
#!/usr/bin/env python def ngramlit(text,n): X=[] for i in range(0,len(text)-(n-1)): X.append(text[i:i+n]) return X if __name__ == "__main__": text1="paraparaparadise" text2="paragraph" print(text1) print("") print(text2) print("") X=ngramlit(text1,2) print("X") print(X) print("") Y=ngramlit(text2,2) print("Y") print(Y) print("") X = set(X) Y = set(Y) print("") print("setX") print(X) print("") print("setY") print(Y) print("") print("X union Y") print(X.union(Y)) print("") print("X intersection Y") print(X.intersection(Y)) print("") print("X difference Y") print(X.difference(Y)) print("") print("se in X") print("se" in X) print("") print("se in Y") print("se" in Y)
出力に拘ったのでわりと見にくい。というかくどい。やっていること自体は単純。
setのメソッドを使わせる問題。
07
#!/usr/bin/env python def xyz(x,y,z): print("{0}時の{1}は{2}".format(x,y,z)) if __name__ == "__main__": x=12 y="気温" z=22.4 xyz(x,y,z)
Pythonでの関数を作らせる簡単な問題。
08
#!/usr/bin/env python def cipher(string): x=list(string) y=list() for i in x: if i.islower(): j=219-ord(i) y.append(chr(j)) else: y.append(i) text = "".join(y) print(text) if __name__ == "__main__": string="Hello, world!" cipher(string) string="Hvool, dliow!" cipher(string)
Pythonでの文字コードの取り扱いについて学ばせる問題。同時に暗号化とは、復号化とはを学ばせる。
09
#!/usr/bin/env python import random def randamize(word): z=list() z.append(word[0]) x = word[1:-1] y = "".join(random.sample(x,len(x))) z.append(y) z.append(word[-1]) rword = "".join(z) return rword def typoglycemia(string): print(string) x=string.split(" ") y=list() for i in x: if len(i) < 5: y.append(i) else: y.append(randamize(i)) text = " ".join(y) print(text) if __name__ == "__main__": string="I couldn't believe that I could actually understand what I was reading : the phenomenal power of the human mind ." typoglycemia(string)
randomのメソッドを学ばせる問題。
しかし、この問題本当によくできている。何を学ばせたいのかがひしひしと伝わってくる。