言葉に関するもの

DDD
リリース: 2024-12-30 19:07:10
オリジナル
736 人が閲覧しました

The one about words

ウィークリーチャレンジ 299

Mohammad S. Anwar は毎週、毎週 2 つのタスクに対する解決策を全員が考え出すチャンスであるウィークリー チャレンジを送信します。私のソリューションは最初に Python で書かれ、次に Perl に変換されます。これは、私たち全員がコーディングを練習するのに最適な方法です。

挑戦、私の解決策

タスク 1: 単語を置き換える

タスク

単語の配列と文が与えられます。

指定された配列内のいずれかの単語で始まる、指定された文内のすべての単語を置き換えるスクリプトを作成します。

私の解決策

このタスクでは、正規表現を使用して変換を行います。完全なコードは
です。

def replace_words(words: list[str], sentence: str) -> str:
    regexp = r"(?<![a-z])(" + "|".join(map(re.escape, words)) + r")([a-z]*(?:'[a-z]+)?)"
    return re.sub(regexp, r'', sentence)
ログイン後にコピー
ログイン後にコピー

最初の括弧 (?

コマンドラインからの入力の場合、最後の値を文として受け取り、それ以外はすべて単語として受け取ります。

$ ./ch-1.py cat bat rat "the cattle was rattle by the battery"
the cat was rat by the bat

$ ./ch-1.py a b c "aab aac and cac bab"
a a a c b

$ ./ch-1.py man bike "the manager was hit by a biker"
the man was hit by a bike

$ ./ch-1.py can "they can't swim"
they can swim

$ ./ch-1.py row "the quick brown fox"
the quick brown fox
ログイン後にコピー
ログイン後にコピー

タスク 2: 単語検索

タスク

文字のグリッドと文字列が与えられます。

指定された文字列が指定された文字のグリッド内で見つかるかどうかを判断するスクリプトを作成します。どこから開始しても直交するパスを選択できますが、グリッド セルを再利用することはできません。

私の解決策

このタスクでは、すべての行の列数が同じであることを確認することから始めます。次に、各セルを調べます。そのセル内の文字が単語の最初の文字である場合、find_match 関数を呼び出します。それが true を返した場合、この関数は true を返します。そうでない場合は、開始文字を含む次のセルに進みます。存在しない場合は false を返します。

def word_search(matrix: list[list[str]], word: str) -> bool:
    rows = len(matrix)
    cols = len(matrix[0])

    for row in range(rows):
        if len(matrix[row]) != cols:
            raise ValueError("Row %s has the wrong number of columns", row)

    for row in range(rows):
        for col in range(cols):
            if matrix[row][col] == word[0]:
                if find_match(matrix, word[1:], [[row, col]]):
                    return True

    return False
ログイン後にコピー

find_match 関数は再帰関数です。 3 つのパラメータを受け取ります

  1. マトリックス
  2. 単語の残りの文字 (一致しなかったもの)
  3. 訪問したセルの [row,col] ペアのリスト (Perl では arrayref)。

最後の位置から、4 つの方向 (上下左右) のいずれかに移動できます。この方向に移動しても範囲外にならないこと、またはすでに使用したセルであることを確認します。一致せず、このセル内の文字が探している文字と一致する場合は、関数を再度呼び出して、word 変数から最初の文字を取り除き、新しい位置を追加します。文字がなくなるところまで到達すると、単語が見つかり、True が返されます。

def replace_words(words: list[str], sentence: str) -> str:
    regexp = r"(?<![a-z])(" + "|".join(map(re.escape, words)) + r")([a-z]*(?:'[a-z]+)?)"
    return re.sub(regexp, r'', sentence)
ログイン後にコピー
ログイン後にコピー

$ ./ch-1.py cat bat rat "the cattle was rattle by the battery"
the cat was rat by the bat

$ ./ch-1.py a b c "aab aac and cac bab"
a a a c b

$ ./ch-1.py man bike "the manager was hit by a biker"
the man was hit by a bike

$ ./ch-1.py can "they can't swim"
they can swim

$ ./ch-1.py row "the quick brown fox"
the quick brown fox
ログイン後にコピー
ログイン後にコピー

以上が言葉に関するものの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート