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
Anda diberi koordinat, rentetan yang mewakili koordinat segi empat sama papan catur seperti yang ditunjukkan di bawah:
Tulis skrip untuk mengembalikan benar jika segi empat sama terang, dan palsu jika segi empat sama gelap.
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
$ ./ch-1.py d3 true $ ./ch-1.py g5 false $ ./ch-1.py e6 true
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.
Tulis skrip yang mengambil kedudukan permulaan dan kedudukan penamat serta mengira bilangan pergerakan yang paling sedikit diperlukan.
Yang ini lebih terperinci. Saya mulakan dengan pembolehubah berikut:
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
$ ./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!