Maison > Article > développement back-end > Boomerang similaire
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
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).
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
$ ./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
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.
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 :
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
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!