読者です 読者をやめる 読者になる 読者になる

ひるあんどんブログ

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

Three words

ワードと数を識別することをロボットに教えましょう。

空白(1つのスペース)で区切られたワードと数をもつ文字列が与えられます。 ワードは文字だけを含んでいます。 あなたは文字列が連続した三つのワードを含んでいるかどうかをチェックしなければいけません。 例えば、文字列"start 5 one two three 7 end"は連続した三つのワードを含んでいます。

ヒント: 以下の役に立つ関数を使ってこのタスクを簡単に解くことができます: str.split, str.isalpha, str.isdigit。

入力: ワードをもつ文字列

出力: 答え、ブール型

例:

checkio("Hello World hello") == True

checkio("He is 123 man") == False

checkio("1 2 3 4") == False

checkio("bla bla bla bla") == True

checkio("Hi") == False



どのように使われるか: このミッションであなたは文字列の使い方を学び、いくつかの役に立つ関数について知ることになります。

事前条件: 入力はワードと数の両方、またはワードのみ、または数のみを含みます。 (文字と数字の両方を含む)混在したワードは存在しません。
0 < len(words) < 100

def checkio(words):
    count = 0
    for x in words.split():
        if x.isalpha(): count += 1
        if count >= 3: 
            return True
            break
        if x.isdigit(): count = 0
        
    return False
            
        

#These "asserts" using only for self-checking and not necessary for auto-testing
if __name__ == '__main__':
    assert checkio("Hello World hello") == True, "Hello"
    assert checkio("He is 123 man") == False, "123 man"
    assert checkio("1 2 3 4") == False, "Digits"
    assert checkio("bla bla bla bla") == True, "Bla Bla"
    assert checkio("Hi") == False, "Hi"

3つのワードを含んでいます。っていう日本語が謎だったけど、要は単語が連続で3つ並んでたらTrueを返してね。って問題だった。
ヒントに書いてあるやつでisdigit,isalphaは前にも使った。splitは知らないので調べた。

str.split(sep=None, maxsplit=-1)

    文字列を sep をデリミタ文字列として区切った単語のリストを返します。maxsplit が与えられていれば、最大で maxsplit 回分割されます (つまり、リストは最大 maxsplit+1 要素になります)。 maxsplit が与えられないか -1 なら、分割の回数に制限はありません (可能なだけ分割されます)。

    sep が与えられた場合、連続した区切り文字はまとめられず、空の文字列を区切っていると判断されます(例えば '1,,2'.split(',') は ['1', '', '2'] を返します)。引数 sep は複数の文字にもできます (例えば '1<>2<>3'.split('<>') は ['1', '2', '3'] を返します)。区切り文字を指定して空の文字列を分割すると、 [''] を返します。

    例えば:

    >>> '1,2,3'.split(',')
    ['1', '2', '3']
    >>> '1,2,3'.split(',', maxsplit=1)
    ['1', '2,3']
    >>> '1,2,,3,'.split(',')
    ['1', '2', '', '3', '']

    sep が指定されていないか None であれば、異なる分割アルゴリズムが適用されます。 : 連続する空白文字はひとつのデリミタとみなされます。また、文字列の先頭や末尾に空白があっても、結果の最初や最後に空文字列は含まれません。よって、空文字列や空白だけの文字列を None デリミタで分割すると [] が返されます。

    例えば:

    >>> '1 2 3'.split()
    ['1', '2', '3']
    >>> '1 2 3'.split(maxsplit=1)
    ['1', '2 3']
    >>> '   1   2   3   '.split()
    ['1', '2', '3']

ようするに文字列を空白で切ってリストにして返すのか。これで単語単位に分割できるので、あとは文字列か数字なのかを調べればいいのだなぁ。


Clearの一位


def checkio(words):

    succ = 0

    for word in words.split():

        succ = (succ + 1)*word.isalpha()

        if succ == 3: return True

    else: return False

なにやってんのか、解読できなかった。なんだこれ…?

Speedlyの一位

import re


def checkio(words):

    return True if re.search('\D+\s\D+\s\D+', words) else False


これは、正規表現のreをインポートしてから正規表現でマッチしているのか…。
\Dが数字なのはいいけど、\sと\Sの違いがわからんかったので、ググった。


\d 数字 [0-9]
\D 非数字 [^0-9]
\s 空白文字 [\n\t\r\f\v]
\S 非空白文字 [^\n\t\r\f\v]

大文字と小文字で意味が逆になるのか…。


Cleativeの一位は


checkio=lambda x:"www" in "".join('w' if w.isalpha() else 'd' for w in x.split())

変態だな。