Each week Mohammad S. Anwar sends out The Weekly Challenge, a chance for all of us to come up with solutions to two weekly tasks. My solutions are written in Python first, and then converted to Perl. It's a great way for us all to practice some coding.
Challenge, My solutions
You are given a list of dominos, @dominos.
Write a script to return the number of dominoes that are similar to any other domino.
$dominos[i] = [a, b] and $dominos[j] = [c, d] are same if either (a = c and b = d) or (a = d and b = c).
I'm not sure if it's a British/US English thing or something else, but I'm using Dominoes as the plural of Domino. Dominos what what you get when you are hungry.
For this task, I take integers from the command line and convert them to a list of lists (arrays of arrays in Perl). If this was an actual real-world project, I'd probably use a Dataclass, and have an equality operator.
I have a double loop. The outer loop - called i - is from 0 to one less than the number of dominoes. The inner loop - called j - is also the same. I skip the case when i and j are the same. If the dominoes at position i and j are the same (either same number or opposite numbers), I add one to count and exit the inner loop.
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
You are given an array of points, (x, y).
Write a script to find out if the given points are a boomerang.
A boomerang is a set of three points that are all distinct and not in a straight line.
Like with the last task, I take integers from the command line and convert them to a list of lists (arrays of arrays in Perl).
I remember enough from high school math to know we can get the slope (gradient) of two points with the formula (x2 - x1) ÷ (y2 - y1). However if y1 and y2 are the same, we get a division by zero error.
Therefore I use the following checks:
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
The above is the detailed content of Similar boomerang. For more information, please follow other related articles on the PHP Chinese website!