schedule2018-07-17

03. 円周率

はじめに

言語処理100本ノック 2015

Pythonを勉強するため、東京工業大学の岡崎教授が出題されている言語処理100本ノック 2015を解いていきます。

より深く理解するため、別解や利用したライブラリの解説もまとめていきます。

環境

Python3.6

OS : mac

問題

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

解答

import re
sentensce = 'Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics.'

# ,.スペースで分ける
words = re.split(r'[,.]? ?', sentensce)

# 空文字を削除
words = list(filter(lambda w: w != '', words))

print(words)
# => ['Now', 'I', 'need', 'a', 'drink', 'alcoholic', 'of', 'course', 'after', 'the', 'heavy', 'lectures', 'involving', 'quantum', 'mechanics']

# 単語の長さに変換
words_len = list(map(len, words))

print(words_len)

出力

[3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8, 9, 7, 9]

解説

str.split()で分けてから、カンマとピリオドを除いてもできます。 今回は、正規表現を使って一度に分けてみました。

import reは正規表現を使うためのライブラリです。
re.split(pattern, string)を使って文を単語に分けています。文には (半角スペース), .があり、これらを目安に単語に分けていきます。 正規表現はr'[,.]? ?'としました。?は0回以上の繰り返しです。言葉にすると、「,または.の0回以上の繰り返しと半角スペースの0回以上の繰り返し」で分けています。

末尾の"mechanics."で空文字ができるため、filter()を使って除外しました。

最後に、list(map(len, words))で、各単語の長さのリストに変換しています。

最後に

出力してから気づいたのですが、単語長の並びが円周率になっていました!
タイトルの円周率が答えあわせにもなるなんて、素敵な問題ですね。

合っているか、確認します。

import math

print(math.pi)
# => 3.141592653589793

ちなみに、円周率の記憶方法としてこの文章は有名なようだ。

英語

  • Yes, I know a number. = 3.1416
  • How I wish I could enumerate PI easily ... = 3.1415926
  • How I want a drink, alcoholic of course, after the heavy lectures involving quantum mechanics! = 3.14159265358979
    wiki

日本だと語呂合わせですが、欧米では各単語の文字数で覚えるみたいですね。

続いての記事

Python3で言語処理100本ノックまとめ

前の問題:02. 「パトカー」+「タクシー」=「パタトクカシーー」」

次の問題:04. 元素記号