"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Celui sur un échiquier

Celui sur un échiquier

Publié le 2024-08-27
Parcourir:748

Défi hebdomadaire 281

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

Tâche 1 : Vérifier la couleur

Tâche

Vous recevez des coordonnées, une chaîne qui représente les coordonnées d'un carré de l'échiquier comme indiqué ci-dessous :

The one about a chess board

Écrivez un script pour renvoyer vrai si le carré est clair et faux si le carré est sombre.

Ma solution

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

Exemples

$ ./ch-1.py d3
true

$ ./ch-1.py g5
false

$ ./ch-1.py e6
true

Tâche 2 : le mouvement du chevalier

Tâche

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.

The one about a chess board

Écrivez un script qui prend une position de départ et une position de fin et calcule le moins de mouvements requis.

Ma solution

Celui-ci est plus détaillé. Je commence avec les variables suivantes :

  • deltas est un tuple de listes (un tableau de tableaux en Perl) avec les huit façons dont le chevalier peut se déplacer depuis sa position actuelle.
  • la cible est la cellule que nous voulons atteindre. Pour cela, je convertis la première lettre en un nombre de un à 8. Elle est stockée sous forme de tuple, la première valeur est la colonne et la deuxième valeur est la ligne.
  • les mouvements sont le nombre de mouvements effectués et commencent à un.
  • vu est une liste de cellules que nous avons déjà visitées.
  • les coordonnées sont une liste des positions actuelles d'un chevalier. Cela commence par la coordonnée de départ.
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 0 



Exemples

$ ./ch-2.py g2 a8
4

$ ./ch-2.py g2 h2
3
Déclaration de sortie Cet article est reproduit sur : https://dev.to/simongreennet/the-one-about-a-chess-board-57mh?1 En cas de violation, veuillez contacter [email protected] pour le supprimer.
Dernier tutoriel Plus>

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