"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > El de un tablero de ajedrez.

El de un tablero de ajedrez.

Publicado el 2024-08-27
Navegar:139

Desafío Semanal 281

Perdón por haber estado desaparecido durante las últimas semanas. Me mudé de casa y tuve un nuevo trabajo, por lo que no he tenido la oportunidad de participar en los desafíos durante este tiempo.

Cada semana, Mohammad S. Anwar envía The Weekly Challenge, una oportunidad para que todos encontremos soluciones a dos tareas semanales. Mis soluciones están escritas primero en Python y luego convertidas a Perl. Es una excelente manera para que todos practiquemos algo de codificación.

Desafío, Mis soluciones

Tarea 1: comprobar el color

Tarea

Se te dan coordenadas, una cadena que representa las coordenadas de un cuadrado del tablero de ajedrez como se muestra a continuación:

The one about a chess board

Escribe un script que devuelva verdadero si el cuadrado es claro y falso si el cuadrado es oscuro.

mi solución

Esto es relativamente sencillo. Lo primero que hago es verificar que la posición proporcionada sea válida (el primer carácter es a-h y el segundo carácter está entre 1 y 8).

Luego verifico si la primera letra es a, c, e o g y el número es par, o si la primera letra es b, d, f o h y el número es impar, devuelve verdadero. De lo contrario, devuelve falso.

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

Ejemplos

$ ./ch-1.py d3
true

$ ./ch-1.py g5
false

$ ./ch-1.py e6
true

Tarea 2: movimiento del caballo

Tarea

Un caballo en ajedrez puede moverse desde su posición actual a cualquier cuadrado a dos filas o columnas más una columna o fila de distancia. Entonces, en el siguiente diagrama, si comienza con una S, puede moverse a cualquiera de los cuadrados marcados con E.

The one about a chess board

Escribe un guión que tome una posición inicial y una posición final y calcule el menor número de movimientos necesarios.

mi solución

Este es más detallado. Empiezo con las siguientes variables:

  • deltas es una tupla de listas (matriz de matrices en Perl) con ocho formas en que el caballero puede moverse desde su posición actual.
  • El objetivo es la celda a la que queremos llegar. Para esto convierto la primera letra en un número del uno al 8. Se almacena como una tupla, el primer valor es la columna y el segundo valor es la fila.
  • movimientos es el número de movimientos realizados y comienza en uno.
  • Lo que se ve es una lista de celdas que ya hemos visitado.
  • coords es una lista de las posiciones actuales de un caballero. Comienza con la coordenada inicial.
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 = []

Luego tengo un bucle doble de la lista de coordenadas actuales y la lista deltas. Se establece una variable new_pos que representa las nuevas coordenadas del caballero. Si esto lleva a una posición fuera del tablero o a una coordenada en la que ya hemos estado, lo salto. Si cae en el objetivo, devuelvo el valor del movimiento.

Después del ciclo, restablezco la lista de coordenadas a las coordenadas recopiladas a través de las iteraciones e incremento el valor de los movimientos en uno. Esto continúa hasta que alcanzamos la coordenada objetivo.

    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 



Ejemplos

$ ./ch-2.py g2 a8
4

$ ./ch-2.py g2 h2
3
Declaración de liberación Este artículo se reproduce en: https://dev.to/simongreennet/the-one-about-a-chess-board-57mh?1 Si hay alguna infracción, comuníquese con [email protected] para eliminarla.
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3