„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Die über ein Schachbrett

Die über ein Schachbrett

Veröffentlicht am 27.08.2024
Durchsuche:418

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 Codierung 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, 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

Beispiele

$ ./ch-1.py d3
true

$ ./ch-1.py g5
false

$ ./ch-1.py e6
true

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 Ritter 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 = []

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 Verschiebungswert 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 



Beispiele

$ ./ch-2.py g2 a8
4

$ ./ch-2.py g2 h2
3
Freigabeerklärung Dieser Artikel ist abgedruckt unter: https://dev.to/simongreennet/the-one-about-a-chess-board-57mh?1 Bei Verstößen wenden Sie sich bitte an [email protected], um ihn zu löschen
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3