Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python에서 노 젓는 게임의 승자를 찾는 프로그램

<시간/>

배열 높이가 있다고 가정합니다. 높이가 다른 n개의 다른 타워가 있습니다. 아말과 비말이 게임을 하고 있습니다. 게임 규칙은 다음과 같습니다.

  • Amal은 항상 먼저 플레이합니다.

  • 각 이동 중에 현재 플레이어는 높이가 X인 타워를 선택하고 각각 높이가 Z인 Y개의 다른 타워로 분해합니다. [Y*Z =X; X 및 Y> 1]

  • 움직임이 없는 사람은 게임에서 집니다.

승자의 이름을 찾아야 합니다.

따라서 입력이 height =[3,1,2]와 같으면 초기 높이가 {3,1,2}이므로 출력은 Bimal이 됩니다. Amal이 타워 2의 높이를 높이 1의 타워 두 개로 나누면 새 높이 배열은 {3,1,1,1}이 되고 Bimal은 높이가 3인 타워를 깨고 높이가 1인 타워 세 개를 만들 수 있으므로 Amal은 이동하여 Bimal이 이깁니다.

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • util() 함수를 정의합니다. 제한이 걸리며 초기 제한 값은 10^3+5
  • 입니다.
  • result :=크기 제한 및 0으로 채워진 배열
  • 범위 2에 있는 i의 경우 - 1을 제한하려면 다음을 수행합니다.
    • s :=새로운 세트
    • i의 제곱근의 바닥까지 범위 1의 j에 대해 다음을 수행합니다.
      • d :=i/j의 몫, r :=i/j의 나머지
      • r이 0과 같으면
        • j가 홀수이면
          • 결과[d])를 s에 삽입
        • d가 홀수이면
          • 결과[j]를 s에 삽입
    • j :=0
    • j가 s에 있는 동안 do
      • j :=j + 1
      • 결과[i] :=j
  • 반환 결과
  • g :=util()
  • 메인 방법에서 다음을 수행하십시오. -
  • r :=0
  • 높이 i에 대해 다음을 수행합니다.
    • r :=r XOR g[i]
  • r이 0이 아니면
    • "아말" 반환
  • 그렇지 않으면
    • "비말" 반환

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

def util(limit=10**3+5):
   result = [0] * limit

   for i in range(2, limit):
      s = set()
      for j in range(1, int(i**0.5)+1):
         d, r = divmod(i, j)

         if r == 0:
            if j & 1:
               s.add(result[d])
            if d & 1:
               s.add(result[j])

      j = 0
      while j in s: j += 1
      result[i] = j

   return result

g = util()

def solve(height):
   r = 0

   for i in height:
      r ^= g[i]

   if r:
      return "Amal"
   else:
      return "Bimal"

height = [3,1,2]
print(solve(height))

입력

[3,1,2]

출력

Bimal