>  기사  >  백엔드 개발  >  체스판에 관한 것

체스판에 관한 것

WBOY
WBOY원래의
2024-08-12 18:32:32684검색

주간 챌린지 281

지난 몇 주 동안 MIA 상태가 되어 죄송합니다. 이사도 하고 직장도 옮기면서 그동안 챌린지에 참여할 기회가 없었어요.

매주 Mohammad S. Anwar는 우리 모두가 두 가지 주간 작업에 대한 해결책을 생각해 낼 수 있는 주간 챌린지를 보냅니다. 내 솔루션은 먼저 Python으로 작성된 다음 Perl로 변환됩니다. 이는 우리 모두가 코딩을 연습할 수 있는 좋은 방법입니다.

도전, 나의 솔루션

작업 1: 색상 확인

아래와 같이 체스판 사각형의 좌표를 나타내는 문자열인 좌표가 제공됩니다.

The one about a chess board

사각형이 밝으면 true를 반환하고, 사각형이 어두우면 false를 반환하는 스크립트를 작성하세요.

내 솔루션

이것은 비교적 간단합니다. 가장 먼저 하는 일은 제공된 위치가 유효한지 확인하는 것입니다(첫 번째 문자는 a-h이고 두 번째 문자는 1에서 8 사이입니다).

그런 다음 첫 번째 문자가 a, c, e 또는 g이고 숫자가 짝수인지 또는 첫 번째 문자가 b, d, f 또는 h이고 숫자가 홀수인지 확인하고 true를 반환합니다. 그렇지 않으면 false를 반환합니다.

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

작업 2: 기사의 움직임

체스의 기사는 현재 위치에서 두 행 또는 열과 한 열 또는 행 떨어진 정사각형으로 이동할 수 있습니다. 따라서 아래 다이어그램에서 S로 시작하면 E로 표시된 사각형 중 하나로 이동할 수 있습니다.

The one about a chess board

시작 위치와 끝 위치를 가져와 필요한 최소 이동 횟수를 계산하는 스크립트를 작성하세요.

내 솔루션

이것이 더 자세히 설명되어 있습니다. 다음 변수로 시작합니다.

  • deltas는 기사가 현재 위치에서 이동할 수 있는 8가지 방법을 포함하는 목록의 튜플(Perl의 배열 배열)입니다.
  • target은 우리가 도달하려는 셀입니다. 이를 위해 첫 번째 문자를 1부터 8까지의 숫자로 변환합니다. 튜플로 저장되며 첫 번째 값은 열이고 두 번째 값은 행입니다.
  • 움직임은 이동 횟수이며 1부터 시작됩니다.
  • see는 우리가 이미 방문한 셀의 목록입니다.
  • coords는 기사의 현재 위치 목록입니다. 시작 좌표부터 시작됩니다.
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 = []

그런 다음 현재 좌표 목록과 델타 목록의 이중 루프를 만듭니다. 기사의 새 좌표를 나타내는 변수 new_pos를 설정합니다. 이것이 보드 밖의 위치나 우리가 이미 가본 좌표로 연결된다면 건너뜁니다. 목표물에 떨어지면 이동값을 반환합니다.

루프 후에는 반복을 통해 수집된 좌표로 좌표 목록을 재설정하고 이동 값을 1씩 증가시킵니다. 이는 목표 좌표에 도달할 때까지 계속됩니다.

    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

위 내용은 체스판에 관한 것의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:파이썬 루프 2다음 기사:파이썬 루프 2