"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 체스판에 관한 것

체스판에 관한 것

2024-08-27에 게시됨
검색:431

주간 챌린지 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 



$ ./ch-2.py g2 a8
4

$ ./ch-2.py g2 h2
3
릴리스 선언문 이 글은 https://dev.to/simongreennet/the-one-about-a-chess-board-57mh?1에서 복제됩니다.1 침해 내용이 있는 경우, [email protected]으로 연락하여 삭제하시기 바랍니다.
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3