車輪の再開発

勉強メモ

言語処理100本ノック 2020 (Rev 1)を解いてみる(00~04)

github.com

完走できるかは怪しい。
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(" "))]))

英語圏の人はこうやって覚えるのだろうか?
煩雑じゃないですか…