Es tut mir leid, dass ich in den letzten Wochen vermisst wurde. Ich bin umgezogen und habe einen neuen Job, daher hatte ich in dieser Zeit keine Gelegenheit, an den Herausforderungen teilzunehmen.
Jede Woche verschickt Mohammad S. Anwar die Weekly Challenge, eine Chance für uns alle, Lösungen für zwei wöchentliche Aufgaben zu finden. Meine Lösungen werden zunächst in Python geschrieben und dann in Perl konvertiert. Es ist eine großartige Möglichkeit für uns alle, etwas Programmieren zu üben.
Herausforderung, meine Lösungen
Sie erhalten Koordinaten, eine Zeichenfolge, die die Koordinaten eines Quadrats des Schachbretts darstellt, wie unten gezeigt:
Schreiben Sie ein Skript, das true zurückgibt, wenn das Quadrat hell ist, und false, wenn das Quadrat dunkel ist.
Das ist relativ einfach. Als Erstes überprüfe ich, ob die angegebene Position gültig ist (das erste Zeichen ist a-h und das zweite Zeichen liegt zwischen 1 und 8).
Ich überprüfe dann, ob der erste Buchstabe a, c, e oder g ist und die Zahl gerade ist, oder ob der erste Buchstabe b, d, f oder h ist und die Zahl ungerade ist, und gebe „true“ zurück. Andernfalls wird false zurückgegeben.
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
Ein Springer im Schach kann sich von seiner aktuellen Position auf ein beliebiges Feld bewegen, das zwei Reihen oder Spalten plus eine Spalte oder Reihe entfernt liegt. Wenn es also im Diagramm unten mit einem S beginnt, kann es sich zu jedem der mit E gekennzeichneten Felder bewegen.
Schreiben Sie ein Skript, das eine Startposition und eine Endposition annimmt und die geringste Anzahl erforderlicher Züge berechnet.
Dieser ist detaillierter. Ich beginne mit den folgenden Variablen:
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 = []
Ich habe dann eine Doppelschleife der aktuellen Koordinatenliste und der Deltaliste. Legen Sie eine Variable new_pos fest, die die neuen Koordinaten für den Ritter darstellt. Wenn dies zu einer Position außerhalb der Tafel oder einer Koordinate führt, an der wir bereits waren, überspringe ich es. Wenn es auf dem Ziel landet, gebe ich den Bewegungswert zurück.
Nach der Schleife setze ich die Koordinatenliste auf die durch die Iterationen gesammelten Koordinaten zurück und erhöhe den Bewegungswert um eins. Dies geht so lange weiter, bis wir die Zielkoordinate erreichen.
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
Das obige ist der detaillierte Inhalt vonDie über ein Schachbrett. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!