Celui sur un échiquier

WBOY
Libérer: 2024-08-12 18:32:32
original
676 Les gens l'ont consulté

Défi hebdomadaire 281

Désolé d'être 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 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 : 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
Copier après la connexion

Exemples

$ ./ch-1.py d3
true

$ ./ch-1.py g5
false

$ ./ch-1.py e6
true
Copier après la connexion

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 lignes ou colonnes plus une colonne ou une ligne plus loin. Ainsi, dans le schéma ci-dessous, s'il commence par un S, il peut se déplacer vers n'importe laquelle des cases marquées 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 par les variables suivantes :

  • deltas est un tuple de listes (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 = []
Copier après la connexion

J'ai alors une double boucle de la liste des coordonnées actuelles 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 < new_pos[0] < 9 or not 0 < new_pos[1] < 9 or new_pos in seen:
                    continue

                if new_pos == target:
                    return moves

                new_coords.append(new_pos)
                seen.append(new_pos)

        coords = new_coords
        moves += 1
Copier après la connexion

Exemples

$ ./ch-2.py g2 a8
4

$ ./ch-2.py g2 h2
3
Copier après la connexion

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!

source:dev.to
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!