Mohammad S. Anwar は毎週、毎週 2 つのタスクに対する解決策を全員が考え出すチャンスであるウィークリー チャレンジを送信します。私のソリューションは最初に Python で書かれ、次に Perl に変換されます。これは、私たち全員がコーディングを練習するのに最適な方法です。
挑戦、私の解決策
ドミノのリスト、@dominos が与えられます。
他のドミノと同様のドミノの数を返すスクリプトを作成します。
$dominos[i] = [a, b] と $dominos[j] = [c, d] は、(a = c および b = d) または (a = d および b = c) の場合は同じです。
イギリス/アメリカ英語なのか他のものなのかはわかりませんが、Domino の複数形として Dominoes を使用しています。お腹が空いたときに手に入るドミノピザ。
このタスクでは、コマンドラインから整数を取得し、それらをリストのリスト (Perl では配列の配列) に変換します。これが現実世界のプロジェクトであれば、おそらくデータクラスを使用し、等価演算子を使用するでしょう。
二重ループがあります。外側のループ (i と呼ばれる) は、0 からドミノの数より 1 つ少ない数までです。 j と呼ばれる内側のループも同じです。 i と j が同じ場合は省略します。位置 i と j のドミノが同じ (同じ番号または反対の番号) の場合、1 を追加してカウントし、内側のループを終了します。
def similar_dominoes(dominoes: list) -> int: count = 0 for i in range(len(dominoes)): for j in range(len(dominoes)): if i == j: continue if (dominoes[i][0] == dominoes[j][0] and dominoes[i][1] == dominoes[j][1]) \ or (dominoes[i][0] == dominoes[j][1] and dominoes[i][1] == dominoes[j][0]): count += 1 break return count
$ ./ch-1.py 1 3 3 1 2 4 6 8 2 $ ./ch-1.py 1 2 2 1 1 1 1 2 2 2 3
点の配列 (x, y) が与えられます。
指定されたポイントがブーメランであるかどうかを確認するスクリプトを作成します。
ブーメランは、すべてが異なり、直線上にない 3 つの点のセットです。
最後のタスクと同様に、コマンドラインから整数を取得し、それらをリストのリスト (Perl では配列の配列) に変換します。
私は高校数学で、(x2 - x1) ÷ (y2 - y1) という式で 2 つの点の傾き (勾配) を求めることができることを十分に覚えています。ただし、y1 と y2 が同じ場合、ゼロ除算エラーが発生します。
したがって、次のチェックを使用します:
def is_boomerang(points: list) -> bool: if all(points[0][1] == points[i][1] for i in range(1, len(points))): return False if any(points[0][1] == points[i][1] for i in range(1, len(points))): return True degrees = set(abs((points[0][0] - points[i][0]) / (points[0][1] - points[i][1])) for i in range(1, len(points))) return False if len(degrees) == 1 else True
$ ./ch-2.py 1 1 2 3 3 2 true $ ./ch-2.py 1 1 2 2 3 3 false $ ./ch-2.py 1 1 1 2 2 3 true $ ./ch-2.py 1 1 1 2 1 3 false $ ./ch-2.py 1 1 2 1 3 1 false $ ./ch-2.py 0 0 2 3 4 5 true
以上が似たようなブーメランの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。