Mohammad S. Anwar は毎週、毎週 2 つのタスクに対する解決策を全員が考え出すチャンスであるウィークリー チャレンジを送信します。私のソリューションは最初に Python で書かれ、次に Perl に変換されます。これは、私たち全員がコーディングを練習するのに最適な方法です。
挑戦、私の解決策
文字列 $str と単語のリスト @words が与えられます。
指定された文字列を、指定されたリストの 1 つ以上の単語のスペースで区切られたシーケンスに分割できるかどうか、true または false を返すスクリプトを作成します。
TWC があると、月曜日の通勤中にどうやって解決するかを考えることが多くなります。 winwine の文字列と win と wine という単語、そして winewin の文字列の例を考えました。どの単語を最初に一致させる必要があるかを確認する決定的な方法はないようです。
数日後、私は実際には間違った問題を解決しているのではないかという天才的なアイデアを思いつきました。はるかに簡単な解決策は、正規表現を使用して、1 つ以上の単語が文字列 s に一致するかどうかを確認することでした。
そしてそれが私が書いたことです。 Python では re.escape を使用し、Perl では quotemeta を使用して、単語リスト内の特殊なメタ文字をエスケープします。
def word_break(s: str, words: list) -> bool: pattern = '^(' + '|'.join(map(re.escape, words)) + ')+$' return True if re.search(pattern, s) else False
$ ./ch-1.py weeklychallenge challenge weekly true $ ./ch-1.py perlrakuperl raku perl true $ ./ch-1.py sonsanddaughters sons sand daughters false
整数の配列 @ints が与えられます。
最後の要素に到達するための最小ジャンプ数を見つけるスクリプトを作成します。 $ints[$i] は、インデックス $i からの前方ジャンプの最大長を表します。最後の要素に到達できない場合は、-1 を返します。
これらのタスクを完了するとき、私は日常の仕事では行わない TDD も使用します。テストが失敗した場合は、通常、明らかなエラーか、もう少し厄介なエラーが発生しています。このタスクは後のタスクの 1 つです。多くのデバッグが続きました。
Python と Perl の両方に優れたデバッグ ツールが組み込まれていることは知っていますが、私は依然として大量の print ステートメントを使用する派です。
このタスクには、jump_game という再帰関数を使用します。これは 2 つのパラメータを取ります: ints は整数のリスト (完全なリストから始まります) と 1 から始まる move です。
最初の整数が 0 の場合、それ以上の移動は不可能であるため、None (Python では undef) を返します。次に、変数 i を使用して int[0] の値から 1 までを繰り返します。この値がリストの長さより 1 つ小さいかそれより大きい場合、解が得られ、手を返します。他の値については、最初の i 個の値を削除して関数を再度呼び出し、1 ずつ増やします。
すべての反復で最小移動数を確実に返すための min_moves 変数があります。
def word_break(s: str, words: list) -> bool: pattern = '^(' + '|'.join(map(re.escape, words)) + ')+$' return True if re.search(pattern, s) else False
私のバグは何だったのでしょうか? i >= len(ints)-1 ではなく i >= len(ints) をチェックしていました。
$ ./ch-1.py weeklychallenge challenge weekly true $ ./ch-1.py perlrakuperl raku perl true $ ./ch-1.py sonsanddaughters sons sand daughters false
以上がブレイクゲームの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。