Heim  >  Artikel  >  Backend-Entwicklung  >  Ähnlicher Bumerang

Ähnlicher Bumerang

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-04 05:03:02642Durchsuche

Similar boomerang

Wöchentliche Herausforderung 293

Jede Woche verschickt Mohammad S. Anwar die Weekly Challenge, eine Chance für uns alle, Lösungen für zwei wöchentliche Aufgaben zu finden. Meine Lösungen werden zunächst in Python geschrieben und dann in Perl konvertiert. Es ist eine großartige Möglichkeit für uns alle, etwas Codierung zu üben.

Herausforderung, meine Lösungen

Aufgabe 1: Ähnliche Dominos

Aufgabe

Sie erhalten eine Liste mit Dominos, @dominos.

Schreiben Sie ein Skript, um die Anzahl der Dominosteine ​​zurückzugeben, die jedem anderen Domino ähnlich sind.

$dominos[i] = [a, b] und $dominos[j] = [c, d] sind gleich, wenn entweder (a = c und b = d) oder (a = d und b = c).

Meine Lösung

Ich bin mir nicht sicher, ob es sich um ein britisches/amerikanisches Englisch handelt oder um etwas anderes, aber ich verwende Dominoes als Plural von Domino. Dominos, was man bekommt, wenn man Hunger hat.

Für diese Aufgabe nehme ich Ganzzahlen aus der Befehlszeile und konvertiere sie in eine Liste von Listen (Arrays von Arrays in Perl). Wenn dies ein reales Projekt wäre, würde ich wahrscheinlich eine Datenklasse verwenden und einen Gleichheitsoperator haben.

Ich habe eine Doppelschleife. Die äußere Schleife – i genannt – ist 0 bis eins kleiner als die Anzahl der Dominosteine. Die innere Schleife – j genannt – ist ebenfalls gleich. Ich überspringe den Fall, wenn i und j gleich sind. Wenn die Dominosteine ​​an Position i und j gleich sind (entweder die gleiche Zahl oder entgegengesetzte Zahlen), füge ich zum Zählen eins hinzu und verlasse die innere Schleife.

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

Beispiele

$ ./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

Aufgabe 2: Bumerang

Aufgabe

Sie erhalten eine Reihe von Punkten (x, y).

Schreiben Sie ein Skript, um herauszufinden, ob die angegebenen Punkte ein Bumerang sind.

Ein Bumerang ist eine Ansammlung von drei Punkten, die alle unterschiedlich sind und nicht in einer geraden Linie liegen.

Meine Lösung

Wie bei der letzten Aufgabe nehme ich Ganzzahlen von der Befehlszeile und konvertiere sie in eine Liste von Listen (Arrays von Arrays in Perl).

Ich erinnere mich an genug Mathematik aus der Oberschule, um zu wissen, dass wir die Steigung (Gradient) zweier Punkte mit der Formel (x2 – x1) ÷ (y2 – y1) ermitteln können. Wenn jedoch y1 und y2 gleich sind, erhalten wir einen Fehler bei der Division durch Null.

Daher verwende ich folgende Prüfungen:

  1. Wenn alle y-Werte (zweites Element in jeder Liste) gleich sind, geben Sie „Falsch“ zurück, da die Punkte eine flache Linie bilden.
  2. Wenn irgendwelche y-Werte mit dem ersten y-Wert identisch sind, geben Sie „True“ zurück (da wir wissen, dass mindestens ein y-Wert unterschiedlich ist).
  3. Berechnen Sie die absolute Neigung zwischen dem ersten Punkt und den anderen Punkten mithilfe der obigen Formel. Bewahren Sie dies als Set auf. Sets speichern keine doppelten Werte.
  4. Wenn die Menge nur einen Wert hat, ist sie eine gerade Linie und gibt „Falsch“ zurück. Gibt es mehr als einen Wert, handelt es sich um einen Bumerang. Ich bin nicht hier, um herauszufinden, ob es ein guter Bumerang ist :)
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

Beispiele

$ ./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

Das obige ist der detaillierte Inhalt vonÄhnlicher Bumerang. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn