디락 주사위

코드 출현 2021 21일차



1부에서 X가 같음을 나타내는 X를 구합니다.


  • 두 숫자의 곱: 패배한 플레이어의 점수와 게임 중 주사위를 던진 횟수

  • 의미 X는 다음과 같아야 합니다.


  • 양의 정수

  • 그것이 우리의 결과물입니다. 우리의 입력은 무엇입니까?


  • 여러 줄 문자열입니다. 정확히는 두 줄.
  • 각 행은 다음 패턴을 따릅니다. Player X starting position: N

  • 우리의 입력은 무엇을 나타냅니까?


  • 두 선수 각각의 시작 위치

  • 선수들 말입니까? 게임은 어떻게 진행되나요?


  • 각 플레이어는 주사위를 세 번 굴립니다
  • .
  • 롤을 예측할 수 있습니다. 1에서 시작하여 100을 초과하지 않는 세 개의 연속 숫자
  • 세 롤의 합계를 기준으로 플레이어는 10개 위치가 있는 원형 게임 보드 주위에서 여러 번 반복되는 자신의 폰을 움직입니다.
  • 각 턴이 끝날 때 플레이어의 점수는 이전 점수와 폰이 착륙하는 위치의 합과 같습니다
  • .
  • 1000승을 달성하거나 초과한 첫 번째 플레이어

  • 파트 1을 해결하기 위한 나의 작업 알고리즘




    Use String mutation methods to extract each player's starting position
    Initialize both player's scores to 0
    Create an array of three values to keep a running tracker of the next three die rolls
    Create a tracker for the number of rolls
    Declare a win condition at 1000
    
    While both players' scores are less than 1000
      If the rolls tracker is odd
        Then update player 1's position
          Calculate the sum of: the current position and the sum of each value in tracker of upcoming die rolls...
          Calculate the remainder of that sum when divided by 10
          Update player 1's score to the sum of the current score and the new position
      Else do the same but for player 2
      Increment the number of rolls by 3
      Increment each value in the die roll tracker by 3
    
    Return the product of the lesser of both scores and the rolls tracker value minus 1 (it was initialized to 1 only to make the odd-even condition work correctly above)
    


    이것은 정답을 생성했습니다.
    그러나 그것은 어떤 면에서 웅변적이거나 효율적이지 않습니다.

    다음은 Python 솔버 Topaz의 훌륭한 프로그래밍 기술을 가르쳐준 두 부분에 대한 웅변적인 솔루션입니다.



    솔루션의 파트 1은 아래에 설명되어 있습니다. 놀랍도록 이해하기 쉽고 효율적인 10줄의 코드에 해당합니다.

    Setup four variables:
    1. Array: Forego parsing the input, just store both positions - minus 1 each to account for zero-based positioning - as two values in an array
    2. Array: Store both players' initial scores as two values in an array
    3. Integer: Track the number of rolls, starting from 1
    4. Integer: Track the currently moving player as a number that will toggle between 0 and 1. It should start at 1 so that the first moving player is player 1, represented as 0.
    
    While the score of the player who moved last is less than 1000
      Switch players by updating the current player tracker to equal the difference of 1 and its current value, effectively toggling between 0 and 1
      Update the current player's position by calculating the sum of their current position, and the outcome of this equation: multiply the rolls tracker's current value by 3, and add 3; lastly, calculate the remainder after dividing the sum by 10
      Update the current player's score by adding to it their new position, plus 1 (accounting for minus 1 done to account for zero-indexed positioning)
      Increment the rolls tracker by 3
    
    Return the product of the lesser of both values in the scores array and the value in the rolls tracker, minus 1 (representing the prior roll)
    


    토파즈의 유창한 코드에서 배운 것


  • 트릭 n*x+x : 1 + 2 + 3 == 1 * 3 + 34 + 5 + 6 == 4 * 3 + 3
  • p = 1; p = 1 - p의 트릭 : p is 1, 0, 1, 0...
  • 플레이어의 위치와 점수를 4개의 개별 변수 대신 2값 배열로 저장함

  • Topaz의 코드를 이해하고 JavaScript 코드로 번역하고 실행하여 내 열등한 코드에서 생성한 것과 동일한 정답을 공개하는 것은 보람 있는 일이었습니다.

    파트 1의 솔루션 시각화



    게임을 플레이하고 파트 1의 알고리즘을 더 잘 이해할 수 있는 웹사이트를 만들었습니다.

    Visit this repl.it to try the demo and explore the website's code



    파트 2는 완전히 다른 볼 게임이었습니다.



    X가 같은 곳에서 X를 구합니다...


  • 가장 많은 승리를 거둔 플레이어가 승리한 전체 우주

  • 와. 우주에 대해 이것은 무엇입니까?


  • 게임이 크게 변경되었습니다
  • 동일: 각 플레이어는 학기당 3개의 주사위를 얻습니다
  • .
  • 다름: 우승 점수는 21입니다
  • 다름: 주사위에는 1, 2, 3의 세 가지 값만 있습니다.
  • 어려움: 세 개의 롤 각각이 1, 2, 3에 면이 닿는 우주를 만듭니다.

  • 프로그래머의 딜레마


  • 각 롤의 분기 결과를 완전히 탐색합니다
  • .
  • 생성된 모든 우주에서 각 게임에서 어떤 플레이어가 승리하는지 결정합니다
  • .
  • 각 승리를 집계하십시오: 14개의 0이 있는 1 정도의 숫자

  • 어디서부터 시작해야 할지 감이 잡히지 않았습니다. 하지만 파트 2에는 토파즈 알고리즘이 있었습니다.


  • 다행히 8줄의 코드입니다.
  • 자세히 연구하고 분석하고 시뮬레이션하는 시간
  • 다른 날을 위해 저장하겠습니다 - 아마도 내일, 아마도 지금부터 잠시
  • 좋은 웹페이지 즐겨찾기