Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Yang berkenaan papan catur

Yang berkenaan papan catur

WBOY
WBOYasal
2024-08-12 18:32:32689semak imbas

Cabaran Mingguan 281

Maaf kerana menjadi MIA sejak beberapa minggu lalu. Saya telah berpindah rumah dan pekerjaan baharu, jadi saya tidak mempunyai peluang untuk mengambil bahagian dalam cabaran selama ini.

Setiap minggu Mohammad S. Anwar menghantar Cabaran Mingguan, peluang untuk kita semua mencari penyelesaian kepada dua tugas mingguan. Penyelesaian saya ditulis dalam Python terlebih dahulu, dan kemudian ditukar kepada Perl. Ini cara yang bagus untuk kita semua mempraktikkan beberapa pengekodan.

Cabaran, Penyelesaian saya

Tugasan 1: Semak Warna

Tugasan

Anda diberi koordinat, rentetan yang mewakili koordinat segi empat sama papan catur seperti yang ditunjukkan di bawah:

The one about a chess board

Tulis skrip untuk mengembalikan benar jika segi empat sama terang, dan palsu jika segi empat sama gelap.

penyelesaian saya

Ini agak lurus ke hadapan. Perkara pertama yang saya lakukan ialah menyemak sama ada kedudukan yang disediakan adalah sah (aksara pertama ialah a-h dan aksara kedua antara 1 dan 8).

Saya kemudian menyemak sama ada huruf pertama ialah a, c, e atau g dan nombor itu genap, atau huruf pertama ialah b, d, f atau h dan nombor itu ganjil, kembalikan benar. Jika tidak, pulangkan palsu.

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

Contoh

$ ./ch-1.py d3
true

$ ./ch-1.py g5
false

$ ./ch-1.py e6
true

Tugasan 2: Pergerakan Knight

Tugasan

Seorang Knight dalam catur boleh beralih dari kedudukan semasanya ke mana-mana petak dua baris atau lajur ditambah satu lajur atau baris jauhnya. Jadi dalam rajah di bawah, jika ia bermula S, ia boleh bergerak ke mana-mana petak bertanda E.

The one about a chess board

Tulis skrip yang mengambil kedudukan permulaan dan kedudukan penamat serta mengira bilangan pergerakan yang paling sedikit diperlukan.

penyelesaian saya

Yang ini lebih terperinci. Saya mulakan dengan pembolehubah berikut:

  • deltas ialah tuple senarai (susunan tatasusunan dalam Perl) dengan lapan cara ksatria boleh bergerak dari kedudukan semasanya.
  • sasaran ialah sel yang ingin kita capai. Untuk ini saya menukar huruf pertama kepada nombor daripada satu kepada 8. Ia disimpan sebagai tupel, nilai pertama ialah lajur dan nilai kedua ialah baris.
  • bergerak ialah bilangan pergerakan yang dibuat dan bermula pada satu.
  • seen ialah senarai sel yang telah kami lawati.
  • coords ialah senarai kedudukan semasa seorang kesatria. Ia bermula dengan koordinat permulaan.
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 = []

Saya kemudian mempunyai gelung berganda senarai koordinat semasa dan senarai delta. Satu set pembolehubah new_pos yang mewakili koordinat baharu untuk kesatria. Jika ini membawa kepada kedudukan di luar lembaga atau koordinat yang telah kita lalui, saya melangkaunya. Jika ia mendarat pada sasaran, saya mengembalikan nilai pergerakan.

Selepas gelung, saya menetapkan semula senarai kord kepada koordinat yang dikumpul melalui lelaran dan menambah nilai pergerakan sebanyak satu. Ini berterusan sehingga kita mencapai koordinat sasaran.

    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

Contoh

$ ./ch-2.py g2 a8
4

$ ./ch-2.py g2 h2
3

Atas ialah kandungan terperinci Yang berkenaan papan catur. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel sebelumnya:Gelung Python 2Artikel seterusnya:Gelung Python 2