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
Se te dan coordenadas, una cadena que representa las coordenadas de un cuadrado del tablero de ajedrez como se muestra a continuación:
Escribe un script que devuelva verdadero si el cuadrado es claro y falso si el cuadrado es oscuro.
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
$ ./ch-1.py d3 true $ ./ch-1.py g5 false $ ./ch-1.py e6 true
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.
Escribe un guión que tome una posición inicial y una posición final y calcule el menor número de movimientos necesarios.
Este es más detallado. Empiezo con las siguientes variables:
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 0Ejemplos
$ ./ch-2.py g2 a8 4 $ ./ch-2.py g2 h2 3
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