ひるあんどんブログ

色々なことに手を出してみるブログ

Monkey Typing

... もし私の指をぼんやりとタイプライターのキーにさまよわせてみたら、私の長たらしい話がわかりやすい文章を作るかもしれない。 もし猿の大群がタイプライターを叩き続けたら彼らはイギリスの博物館にあるすべての本を書くかもしれない。 分子が器の半分帰っていく機会よりも明らかに、彼らがそれをする見込みがある。

アーサー・エディントン. The Nature of the Physical World: ギフォード講義, 1927.

「フォード!」彼は言った、「外にはハムレットの台本を訓練して私たちに話したがっている無限の数の猿がいるよ。」

ダグラス・アダムス銀河ヒッチハイク・ガイド

無限の猿定理 は無限の時間でランダムにタイプライターのキーを叩く猿はほとんど確実に、 ジョン・ウォリス の完成作やそれどころかダン・ブラウン の小説といった文章をタイプすることを述べています。

私達の猿がタイピングし続けることを考えてみましょう、彼らはいろいろな短いテキストの断片を生み出します。ではそれらに意味のある単語が含まれているか調べてみましょう。

あなたは意味のある単語が含まれているかもしれないテキストが与えられます。あなたはいくつの単語が与えられたテキストに含まれているか調べなくてはいけません。 単語は全体が含まれている必要があり、他の単語の部分かもしれません。テキストの大文字小文字は区別しません。単語は小文字で与えられ繰り返すことはありません。もし単語がテキストに複数回出現したら、1回だけ数えるべきです。

例えば、 テキスト - "How aresjfhdskfhskd you?", 単語 - ("how", "are", "you", "hello"). 結果は3になります。

入力 2つの引数。 文字列(py2ではunicode)のテキストと、単語の文字列(py2ではunicode)の集合(set)です。

出力 テキスト中の単語の数を表す整数

count_words("How aresjfhdskfhskd you?", {"how", "are", "you", "hello"}) == 3

count_words("Bananas, give me bananas!!!", {"banana", "bananas"}) == 2

count_words("Lorem ipsum dolor sit amet, consectetuer adipiscing elit.",

{"sum", "hamlet", "infinity", "anything"}) == 1



どうやって使われるか Pythonはテキスト処理に有用でパワフルな言語です。 このミッションはあなたの作れるある種のテキスト検索ツールの簡単な例です。

事前条件
0 < len(text) ≤ 256
all(3 ≤ len(w) and w.islower() and w.isalpha for w in words)

def count_words(text, words):
    count = 0
    text = text.lower()
    for w in words:
            if text.count(w) >= 1: count += 1
            
    return count


if __name__ == '__main__':
    #These "asserts" using only for self-checking and not necessary for auto-testing
    assert count_words("How aresjfhdskfhskd you?", {"how", "are", "you", "hello"}) == 3, "Example"
    assert count_words("Bananas, give me bananas!!!", {"banana", "bananas"}) == 2, "BANANAS!"
    assert count_words("Lorem ipsum dolor sit amet, consectetuer adipiscing elit.",
                       {"sum", "hamlet", "infinity", "anything"}) == 1, "Weird text"

つまずいたところは、文字列の大小をなくすためにlower()を使ったんだけど、これが非破壊的なメソッドなので新しい変数に代入しなくちゃならないのを忘れてた。

あと文字列もシークエンス型なのでcountが普通に使えるというのを忘れていた。なんか正規表現とか小難しいの使うのかと思ったけど、そんなことはなかった。