Maison > Article > développement back-end > Celui sur un échiquier
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
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 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.
É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 par 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 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
$ ./ch-2.py g2 a8 4 $ ./ch-2.py g2 h2 3
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!