ひるあんどんブログ

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

Pangram

パングラム (ギリシャ語:παν γράμμα, pan gramma, 「すべての文字」) とはアルファベットのすべての文字が少なくとも一回使われている文です。ひょっとしたらあなたはよく知られているパングラム "The quick brown fox jumps over the lazy dog" をご存知かもしれません。

このミッションでは、私達はラテンアルファベット(A-Z)を使います。 あなたはラテン文字と句読点によるテキストが与えられます。 あなたはその文がパングラムかそうでないかをチェックする必要があります。大文字小文字は関係ありません。

入力 テキストが文字列として与えれられます

出力 文章がパングラムかどうかをブール値で返します

check_pangram("The quick brown fox jumps over the lazy dog.") == True

check_pangram("ABCDEF.") == False



どうやって使われるか パングラムは書体の表示、装置のテスト、手書きや書道やキーボードのタイピング技術を練習するものとして長年使われてきました。

事前条件

all(ch in (string.punctuation + string.ascii_letters + " ") for ch in text)

0 < len(text)

import string

def check_pangram(text):
    text = text.lower()
    alpha = string.ascii_lowercase
    alpha_list = list(alpha)
    
    for x in alpha_list:
        if text.count(x) < 1: return False
        
    
    return True

if __name__ == '__main__':
    # These "asserts" using only for self-checking and not necessary for auto-testing
    assert check_pangram("The quick brown fox jumps over the lazy dog."), "brown fox"
    assert not check_pangram("ABCDEF"), "ABC"
    assert check_pangram("Bored? Craving a pub quiz fix? Why, just come to the Royal Oak!"), "Bored?"

stringライブラリにascii_lowercaseっていう、出題そのまんまの関数があったのでこれをサクッと利用。

ASCII文字の小文字のリストを作って、それをループでまわしてcountで計測。
1個もない文字があった時点で、パングラムではないので、Falseを返す。


Clear 1位

from string import ascii_lowercase

<200b>def check_pangram(text):

    return set(ascii_lowercase).issubset(set(text.lower()))


ライブラリの読み込み方

from string import ascii_lowercase

はstringオブジェクトのascii_lowercaseをローカルなシンボルテーブルに追加しますよって宣言

なので、直接 ascii_lowercaseを呼び出せるようになっている。

setは集合を扱う組み込み関数。
8.7. sets — ユニークな要素の順序なしコレクション — Python 2.7ja1 documentation



s.issubset(t) s <= t s のすべての要素が t に帰属していれば真を返す

とのこと。

スマートだなぁ。


speedly

from string import ascii_lowercase

<200b>def check_pangram(text):

    return all(letter in text.lower() for letter in ascii_lowercase)


そうだ。どっかで、allって関数をみたけど、使い道までは知らなかった。確かに題意まんまの関数だ。返り値もブールだし。

all(iterable)

    iterable の全ての要素が真ならば (もしくは iterable が空ならば) True を返します。以下のコードと等価です:

    def all(iterable):
        for element in iterable:
            if not element:
                return False
        return True

any(iterable)

    iterable のいずれかの要素が真ならば True を返します。iterable が空なら False を返します。以下のコードと等価です:

    def any(iterable):
        for element in iterable:
            if element:
                return True
        return False