ホームページ  >  記事  >  バックエンド開発  >  似たようなブーメラン

似たようなブーメラン

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-04 05:03:02642ブラウズ

Similar boomerang

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

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

挑戦、私の解決策

タスク 1: 類似したドミノ

タスク

ドミノのリスト、@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

タスク 2: ブーメラン

タスク

点の配列 (x, y) が与えられます。

指定されたポイントがブーメランであるかどうかを確認するスクリプトを作成します。

ブーメランは、すべてが異なり、直線上にない 3 つの点のセットです。

私の解決策

最後のタスクと同様に、コマンドラインから整数を取得し、それらをリストのリスト (Perl では配列の配列) に変換します。

私は高校数学で、(x2 - x1) ÷ (y2 - y1) という式で 2 つの点の傾き (勾配) を求めることができることを十分に覚えています。ただし、y1 と y2 が同じ場合、ゼロ除算エラーが発生します。

したがって、次のチェックを使用します:

  1. すべての y 値 (各リストの 2 番目の項目) が同じ場合、点が平坦な線を形成するため、False を返します。
  2. いずれかの y 値が最初の y 値と同じ場合は、True を返します (少なくとも 1 つの y 値が異なることがわかっているため)。
  3. 上記の式を使用して、最初の点と他の点の間の絶対的な傾きを計算します。これをセットで保管してください。セットには重複した値は保存されません。
  4. セットに値が 1 つしかない場合、それは直線となり False を返します。値が複数ある場合、それはブーメランです。私はそれが良いブーメランかどうかを判断するためにここにいるわけではありません:)
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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。