言語処理100本ノック 2020 (Rev 1)を解いてみる(00~04)
完走できるかは怪しい。
WIndows+python 3.8でちょろちょろ解いていく。
00. 文字列の逆順
文字列”stressed”の文字を逆に(末尾から先頭に向かって)並べた文字列を得よ.
pythonで配列を逆順に見るときにはスライシングにおいてステップを-1にすればよい。
print("stressed"[::-1])
01. 「パタトクカシーー」
「パタトクカシーー」という文字列の1,3,5,7文字目を取り出して連結した文字列を得よ.
二つおきに見るときはスライシングでステップを2にすればよい。
pythonは0-indexedなので注意。
print("パタトクカシー"[::2])
02. 「パトカー」+「タクシー」=「パタトクカシーー」
「パトカー」+「タクシー」の文字を先頭から交互に連結して文字列「パタトクカシーー」を得よ.
pythonだと以下のone-linerでよい(読みやすいかは別として)。
内包表記やzipなどpythonでよく使うがほかの言語ではあまりなさそうな機能を使うので、pythonの練習問題として秀逸。
print("".join(["".join(chs) for chs in zip("パトカー", "タクシー")]))
03. 円周率
“Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics.”という文を単語に分解し,各単語の(アルファベットの)文字数を先頭から出現順に並べたリストを作成せよ.
以下のone-linerで書けるが、
- 単語への分割はsplit
- 文字数を数えるのはlen
- アルファベットを抜き出すのは正規表現
と考えることは多い。慣れればこのくらいは脊髄反射でできるのだろう、きっと。
import re s = "Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics." print([len(re.findall("[A-Za-z]", word)) for word in s.split(" ")])
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文字を取り出し,取り出した文字列から単語の位置(先頭から何番目の単語か)への連想配列(辞書型もしくはマップ型)を作成せよ.
特定のインデックスの時だけ処理を分けるのはsetを使えばよい。
s = "Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can." c1 = set([1, 5, 6, 7, 8, 9, 15, 16, 19]) print(dict([(w[:1], i+1) if i+1 in c1 else (w[:2], i+1) for i, w in enumerate(s.split(" "))]))
英語圏の人はこうやって覚えるのだろうか?
煩雑じゃないですか…