Désolé d'avoir été MIA ces dernières semaines. J'ai déménagé et j'ai trouvé un nouvel emploi, je n'ai donc pas eu l'occasion de relever les défis de cette période.
Chaque semaine, Mohammad S. Anwar envoie The Weekly Challenge, une opportunité 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 un excellent moyen pour nous tous de pratiquer le codage.
Défi, Mes solutions
Vous recevez des coordonnées, une chaîne qui représente les coordonnées d'un carré de l'échiquier comme indiqué ci-dessous :
Écrivez un script pour renvoyer vrai si le carré est clair et faux si le carré est sombre.
C'est relativement simple. La première chose que je fais est de vérifier que la position fournie est valide (le premier caractère est a-h et le deuxième caractère est compris entre 1 et 8).
Je vérifie ensuite si la première lettre est a, c, e ou g et le nombre est pair, ou si la première lettre est b, d, f ou h et le nombre est impair, renvoie vrai. Sinon, retournez false.
def check_color(coords: str) -> bool: if not re.search('^[a-h][1-8]$', coords): raise ValueError('Not a valid chess coordinate!') if coords[0] in ('a', 'c', 'e', 'g') and int(coords[1]) % 2 == 0: return True if coords[0] in ('b', 'd', 'f', 'h') and int(coords[1]) % 2 == 1: return True return False
$ ./ch-1.py d3 true $ ./ch-1.py g5 false $ ./ch-1.py e6 true
Un chevalier aux échecs peut se déplacer de sa position actuelle vers n'importe quel carré à deux rangées ou colonnes plus une colonne ou rangée. Ainsi, dans le diagramme ci-dessous, s'il commence par un S, il peut se déplacer vers n'importe quelle case marquée E.
Écrivez un script qui prend une position de départ et une position de fin et calcule le moins de mouvements requis.
Celui-ci est plus détaillé. Je commence avec les variables suivantes :
def knights_move(start_coord: str, end_coord: str) -> int: for coord in (start_coord, end_coord): if not re.search('^[a-h][1-8]$', coord): raise ValueError( f'The position {coord} is not a valid chess coordinate!') deltas = ([2, 1], [2, -1], [-2, 1], [-2, -1], [1, 2], [1, -2], [-1, 2], [-1, -2]) coords = [convert_coord_to_list(start_coord)] target = convert_coord_to_list(end_coord) moves = 1 seen = []
J'ai alors une double boucle de la liste de coordonnées actuelle et de la liste des deltas. A définir une variable new_pos qui représente les nouvelles coordonnées du chevalier. Si cela conduit à une position en dehors du tableau ou à une coordonnée à laquelle nous sommes déjà allés, je l'ignore. S'il atterrit sur la cible, je renvoie la valeur des mouvements.
Après la boucle, je réinitialise la liste des coordonnées aux coordonnées collectées au fil des itérations et j'incrémente la valeur des mouvements de un. Cela continue jusqu'à ce que nous atteignions les coordonnées cibles.
while True: new_coords = [] for coord in coords: for delta in deltas: new_pos = (coord[0] delta[0], coord[1] delta[1]) if not 0Exemples
$ ./ch-2.py g2 a8 4 $ ./ch-2.py g2 h2 3
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3