Maison  >  Article  >  développement back-end  >  Boomerang similaire

Boomerang similaire

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-04 05:03:02642parcourir

Similar boomerang

Défi hebdomadaire 293

Chaque semaine, Mohammad S. Anwar envoie The Weekly Challenge, une chance pour nous tous de trouver des solutions à deux tâches hebdomadaires. Mes solutions sont d'abord écrites en Python, puis converties en Perl. C'est une excellente façon pour nous tous de pratiquer le codage.

Défi, Mes solutions

Tâche 1 : Dominos similaires

Tâche

On vous donne une liste de dominos, @dominos.

Écrivez un script pour renvoyer le nombre de dominos similaires à n'importe quel autre domino.

$dominos[i] = [a, b] et $dominos[j] = [c, d] sont identiques si (a = c et b = d) ou (a = d et b = c).

Ma solution

Je ne sais pas si c'est un truc d'anglais britannique/américain ou autre chose, mais j'utilise Dominoes comme pluriel de Domino. Dominos, qu'est-ce que vous obtenez quand vous avez faim.

Pour cette tâche, je prends des entiers de la ligne de commande et les convertis en une liste de listes (tableaux de tableaux en Perl). S'il s'agissait d'un projet réel, j'utiliserais probablement une Dataclass et j'aurais un opérateur d'égalité.

J'ai une double boucle. La boucle extérieure - appelée i - est inférieure de 0 à un au nombre de dominos. La boucle interne – appelée j – est également la même. Je saute le cas où i et j sont identiques. Si les dominos en position i et j sont identiques (soit le même nombre, soit des nombres opposés), j'en ajoute un pour compter et je sors de la boucle interne.

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

Exemples

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

Tâche 2 : Boomerang

Tâche

Vous recevez un tableau de points, (x, y).

Écrivez un script pour savoir si les points donnés sont un boomerang.

Un boomerang est un ensemble de trois points tous distincts et non alignés.

Ma solution

Comme pour la dernière tâche, je prends des entiers de la ligne de commande et les convertis en une liste de listes (tableaux de tableaux en Perl).

Je me souviens suffisamment des mathématiques du lycée pour savoir que nous pouvons obtenir la pente (dégradé) de deux points avec la formule (x2 - x1) ÷ (y2 - y1). Cependant si y1 et y2 sont identiques, nous obtenons une erreur de division par zéro.

J'utilise donc les contrôles suivants :

  1. Si toutes les valeurs y (deuxième élément de chaque liste) sont identiques, renvoyez False car les points forment une ligne plate.
  2. Si des valeurs y sont identiques à la première valeur y, renvoyez True (car nous savons qu'au moins une valeur y est différente).
  3. Calculez la pente absolue entre le premier point et les autres points en utilisant la formule ci-dessus. Conservez-le sous forme d’ensemble. Les ensembles ne stockent pas de valeurs en double.
  4. Si l'ensemble n'a qu'une seule valeur, c'est une ligne droite et renvoie False. S’il y a plus d’une valeur, c’est un boomerang. Je ne suis pas là pour déterminer si c'est un bon boomerang :)
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

Exemples

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn