ひるあんどんブログ

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

The end of other

語訓練のために、私たちのロボットはサフィックス(接尾辞)について学ぼうとしています。

このタスクであなたは小文字の単語の集合(set)が与えられます。 ある単語が別の単語の末尾である(別の単語の接尾辞である)ような単語の対があるかどうか調べてください。 例えば: {"hi", "hello", "lo"} -- "lo"は"hello"の末尾です。したがって結果は真(True)です。

ヒント: このタスクのために集合(set)型で繰り返す方法と文字列データ型の関数に知っていなければいけません。 より詳しくはここの集合(set)型と ここの文字列関数を読んでください。

入力: 複数の単語、文字列の集合。

出力: TrueまたはFalse、ブール型。

例:

checkio({"hello", "lo", "he"}) == True

checkio({"hello", "la", "hellow", "cow"}) == False

checkio({"walk", "duckwalk"}) == True

checkio({"one"}) == False

checkio({"helicopter", "li", "he"}) == False


どのように使われるか: ここであなたは集合型で繰り返す方法と文字列型の関数について学ぶことができます。

事前条件: 2 ≤ len(words) < 30
all(re.match(r"\A[a-z]{1,99}\Z", w) for w in words)

def checkio(words_set):
    
    for b in words_set:
        for a in words_set:
            if a != b:
                if a.endswith(b): return True
                
    return False
    
#These "asserts" using only for self-checking and not necessary for auto-testing
if __name__ == '__main__':
    assert checkio({"hello", "lo", "he"}) == True, "helLO"
    assert checkio({"hello", "la", "hellow", "cow"}) == False, "hellow la cow"
    assert checkio({"walk", "duckwalk"}) == True, "duck to walk"
    assert checkio({"one"}) == False, "Only One"
    assert checkio({"helicopter", "li", "he"}) == False, "Only end"


接尾語にかんしてはendswithで調べられる。

str.endswith(suffix[, start[, end]])

    文字列が指定された suffix で終わるなら True を、そうでなければ False を返します。 suffix は見つけたい複数の接尾語のタプルでも構いません。オプションの start があれば、その位置から判定を始めます。オプションの end があれば、その位置で比較を止めます。

集合型の中のすべての文字の組み合わせについて調べる必要があるので、ループ2つでまわした。もちろん、自分を自分自身と比較しないようにした。


ただ、ループ2つって読みにくいのであんまり良い解答ではなさそう。

Clear


def checkio(words):

    """

    You can iterate throught set.

    """

    for w1 in words:

        for w2 in words:

            if w1 != w2 and (w1.endswith(w2) or w2.endswith(w1)):

                return True

    return False

一位の人もループ2つ使っているなぁ。ただ、組み合わせを同時に2つ調べて効率を良くしている。