mu chance or much chance ?

日々の戯れ言

言語処理100本ノック 2015 08

  • 問題

08. 暗号文
与えられた文字列の各文字を,以下の仕様で変換する関数cipherを実装せよ.
英小文字ならば(219 - 文字コード)の文字に置換
その他の文字はそのまま出力
この関数を用い,英語のメッセージを暗号化・復号化せよ.

  • 解答例
def cipher(str):
    decode = ""
    for i in range(len(str)):
        decode += chr(219 - ord(str[i])) if str[i].islower() else str[i]
    return decode

print(cipher("irk low hob hold holy horn glow grog all"))
print(cipher(cipher("irk low hob hold holy horn glow grog all")))
  • コメント

「chr」と「ord」の使い方を学びました.

言語処理100本ノック 2015 07

  • 問題

07. テンプレートによる文生成
引数x, y, zを受け取り「x時のyはz」という文字列を返す関数を実装せよ.さらに,x=12, y="気温", z=22.4として,実行結果を確認せよ.

  • 解答例
def template(a, b ,c):
    return str(a) + "時の" + str(b) + "は" + str(c)

x = 12
y = "気温"
z = 22.4

print(template(x, y ,z))
  • コメント

一番簡単だった気がします.
ただメソッド引数に型名を書く必要が無いので,
他人にプログラムを共有するときは,
きちんとコメントを書く必要があります.

言語処理100本ノック 2015 06

  • 問題

06. 集合
"paraparaparadise"と"paragraph"に含まれる文字bi-gramの集合を,それぞれ, XとYとして求め,XとYの和集合,積集合,差集合を求めよ.さらに,'se'というbi-gramがXおよびYに含まれるかどうかを調べよ.

  • 解答例
def ngram(n, sentence):
    gram = []
    for i in range(len(sentence) - n + 1):
        gram.append(''.join(sentence[i:i + n]))
    return gram

str1 = "paraparaparadise"
str2 = "paragraph"

setX = set(ngram(2, str1))
setY = set(ngram(2, str2))

# 集合X・Y
print(setX)
print(setY)

# 和集合 積集合 差集合
print(setX.union(setY))
print(setX.intersection(setY))
print(setX.difference(setY))

# 集合に含まれているかどうか
print("se" in setX)
print("se" in setY)
  • コメント

問題05で作成したメソッドを利用しています.
リストから集合に変換することで,
重複している中身を消すことができるので便利です.

言語処理100本ノック 2015 05

  • 問題

05. n-gram
与えられたシーケンス(文字列やリストなど)からn-gramを作る関数を作成せよ.この関数を用い,"I am an NLPer"という文から単語bi-gram,文字bi-gramを得よ.

  • 解答例
def ngram(n, sentence):
    gram = []
    for i in range(len(sentence) - n + 1):
        gram.append(''.join(sentence[i:i + n]))
    return gram

str = "I am an NLPer"
ans1 = ngram(2, str.split())
ans2 = ngram(2, str)
print(ans1)
print(ans2)
  • コメント

splitで単語分割した配列データとして扱えるころができるので,
単語bi-gram,文字bi-gramも同じ関数で扱えるので楽で良いですね.

言語処理100本ノック 2015 04

  • 問題

04. 元素記号
"Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."という文を単語に分解し,1, 5, 6, 7, 8, 9, 15, 16, 19番目の単語は先頭の1文字,それ以外の単語は先頭に2文字を取り出し,取り出した文字列から単語の位置(先頭から何番目の単語か)への連想配列(辞書型もしくはマップ型)を作成せよ.

  • 解答例
strs = "Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."
words = strs.split(" ")
singleNum = [1, 5, 6, 7, 8, 9, 15, 16, 19]
dicts = {}

for i in range(len(words)):
    len = 1 if i + 1 in singleNum else 2
    dicts[words[i][:len]] = i + 1

for k, v in sorted(dicts.items(), key = lambda x : x[1]):
    print(k, v)
  • コメント

「辞書」,「辞書のvalueでソートしたい場合」について学びました.

言語処理100本ノック 2015 03

  • 問題

03. 円周率
"Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."という文を単語に分解し,各単語の(アルファベットの)文字数を先頭から出現順に並べたリストを作成せよ.

  • 解答例
strs = "Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."
strs = strs.replace(",", "")
strs = strs.replace(".", "")
strs = strs.split()

count = [len(str) for str in strs]
print(count)
  • コメント

「replace」,「split」,「内包表記」について学びました.

言語処理100本ノック 2015 02

  • 問題

02. 「パトカー」+「タクシー」=「パタトクカシーー」
「パトカー」+「タクシー」の文字を先頭から交互に連結して文字列「パタトクカシーー」を得よ.

  • 解答例
str1 = 'パトカー'
str2 = 'タクシー'
ans =[]
for (i, j) in zip(str1, str2):
    ans += (i + j)

print(''.join(ans))
  • コメント

「zip」,「リストに追加」,「join」の使い方を学びました.
zipを使うことで,複数のリストを一気に操作が可能になります.

  • zipの例
list1 = ['a', 'b', 'c']
list2 = ['e', 'd', 'f']
for i, j in zip(list1, list2):
    print(i, j)
  • 出力結果
a e
b d
c f
  • リストに追加(+を使用)の例
list1 = ["a", "b", "c"]
list2 = []
for i in list1:
    list2 += i

print(list2)
  • 出力結果
['a', 'b', 'c']
  • joinの例
list1 = ['a', 'b', 'c']
list2 = ['e', 'd', 'f']
print(''.join(list1))
print('*'.join(list2))
  • 出力結果
abc
e*d*f