Die über ein Schachbrett

WBOY
Freigeben: 2024-08-12 18:32:32
Original
676 Leute haben es durchsucht

Wöchentliche Herausforderung 281

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

Aufgabe 1: Farbe prüfen

Aufgabe

Sie erhalten Koordinaten, eine Zeichenfolge, die die Koordinaten eines Quadrats des Schachbretts darstellt, wie unten gezeigt:

The one about a chess board

Schreiben Sie ein Skript, das true zurückgibt, wenn das Quadrat hell ist, und false, wenn das Quadrat dunkel ist.

Meine Lösung

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
Nach dem Login kopieren

Beispiele

$ ./ch-1.py d3
true

$ ./ch-1.py g5
false

$ ./ch-1.py e6
true
Nach dem Login kopieren

Aufgabe 2: Ritterzug

Aufgabe

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.

The one about a chess board

Schreiben Sie ein Skript, das eine Startposition und eine Endposition annimmt und die geringste Anzahl erforderlicher Züge berechnet.

Meine Lösung

Dieser ist detaillierter. Ich beginne mit den folgenden Variablen:

  • Deltas ist ein Tupel von Listen (Array von Arrays in Perl) mit den acht Möglichkeiten, wie sich der Springer von seiner aktuellen Position bewegen kann.
  • Ziel ist die Zelle, die wir erreichen wollen. Dazu wandle ich den ersten Buchstaben in eine Zahl von eins bis 8 um. Es wird als Tupel gespeichert, der erste Wert ist die Spalte und der zweite Wert ist die Zeile.
  • Züge ist die Anzahl der durchgeführten Züge und beginnt bei eins.
  • Gesehen ist eine Liste der Zellen, die wir bereits besucht haben.
  • Koordinaten ist eine Liste der aktuellen Positionen eines Ritters. Es beginnt mit der Startkoordinate.
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 = []
Nach dem Login kopieren

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
Nach dem Login kopieren

Beispiele

$ ./ch-2.py g2 a8
4

$ ./ch-2.py g2 h2
3
Nach dem Login kopieren

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!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!