돌, 보, 가위, 도마뱀, 스포크

소개


작년에 우리는 "수학"방법으로 돌, 보, 가위 놀이를 해결했는데 이 항목은 개방적인 문제로 끝났다.

Can you find a similar, mathematical approach for Rock, Paper, Scissors, Lizard, Spock?


며칠 전, @jotagarciaz 나에게 같은 질문을 하고 호기심을 불러일으켰을 때, 나는 비로소 이 변체에 대해 생각할 시간을 썼다.

게임 분석: "도마뱀, 스포크" 아니면 "스포크, 도마뱀?"


바위, 보, 가위, 도마뱀, 스포크는 확장된 바위, 보, 가위가 창조한 것이다Sam Kass and Karen Bryla.
그것은 텔레비전 연속극에 보급되었다.
우리는 최초의 게임부터 시작합시다.
  • Scissors cuts Paper
  • Paper covers Rock
  • (and as it always has) Rock crushes Scissors


전통적인 돌, 보, 가위 규칙은 여전히 적용되지만, 게임에는 도마뱀과 스포크 두 가지 새로운 옵션이 추가되었다.
이 새로운 옵션과 관련된 가장 간단한 규칙을 소개합니다.
  • Rock crushes Lizard
  • Lizard poisons Spock
  • Spock smashes Scissors


현재 큰 의외는 없다.다음 규칙을 추가합니다.
  • Lizard eats Paper


우리는 화살표 그림에서 다음 모드를 추가할 때 확인할 수 있는 가능한 패턴을 상상할 수 있다.
  • Spock vaporizes Rock


  • Scissors decapitates Lizard


  • Paper disproves Spock


모든 새로운 규칙을 하나하나 검사한 후에 우리는 틀림없이 하나의 모델이 존재한다는 결론을 얻을 수 있다.
우리도 복식 입력표에 이러한 규칙을 반영하여 이런 모델을 관찰할 수 있다. 전제는 우리가 돌, 보, 가위, 스포크, 도마뱀 순서(즉, 게임 이름에서 도마뱀과 스포크의 위치를 교환하는 것)를 사용하는 것이다.

충격적이지, 그렇지?이 게임의 가장 유행하는 이름은 돌, 보, 가위, 도마뱀, 스포크이다. 왜냐하면 대폭발 이론에서 이렇게 나타났기 때문이다.그러나 Sam's page에서 사용된 알파벳 줄임말에 따르면 그들의 창조자는 처음에 이를'right'(돌, 보, 가위, 스바크, 도마뱀)로 명명했다.
쉘든 리쿠퍼 선생님이 이걸 어떻게 놓쳤는지 알고 싶어요!

게임 해결


일단 모든 규칙을 적용하면 우리는 최종적으로 이 그림을 얻을 수 있다.

이 그림과/또는 우리가 위에서 본 표를 분석하면 우리는 우리가 확정한 모델을 쓸 수 있다.
  • 아래 (순환) 순서에 따라 평가하면 주어진 모든 옵션은 다른 옵션의 이기고 지는 것과 바뀐다. 돌, 보, 가위, 스포크, 도마뱀.
  • 이 시퀀스는 목록의 다음 옵션(또는 그림에서 시계 방향의 첫 번째 옵션)에 지거나 이전 옵션(또는 그림에서 시계 반대 방향의 첫 번째 옵션)에 이기기 시작합니다.
  • 이것은 확실히 튼튼한 시작이지만, 여전히 부족하다.우리는 약간의 수학 관계가 있어야만 그것을 코드로 바꿀 수 있다.
    기억하자:
    • If both numbers are the same, no one wins
    • If both numbers are consecutive, the bigger one wins
    • If both numbers aren’t consecutive, the smaller one wins

    우리는 우리의 모델을 위해 유사한 것을 찾아야 한다. 이것이 바로 우리가 위의 그림에 숫자를 추가한 이유이다.
    예를 들어 이러한 모든 요구 사항을 충족하는 일반적인 규칙을 요약해 보겠습니다.
  • 스포크 처치 가위→ 4박자→ > 우승 횟수
  • 스포크가 록을 격파하다→ 4박자→ > 우승 횟수
  • 종이가 스포크를 물리쳤다→ 2박자→ < 우승 횟수
  • 도마뱀이 스포크를 물리치다→ 5박자→ > 우승 횟수
  • 도마뱀 타지→ 5박자→ > 우승 횟수
  • 가위바위보s 도마뱀→ 3박자→ < 우승 횟수
  • 바위가 도마뱀 처치→ 1박자→ < 우승 횟수
  • 예를 자세히 살펴보면 다음과 같은 결론을 얻을 수 있습니다.
  • 두 숫자 사이의 차이가 홀수라면 비교적 큰 승리

  • 두 숫자 사이의 차이가 짝수인 경우
  • 두 숫자가 같으면 이길 사람이 없다
  • 두 숫자가 다르면 작은 하나가 이긴다
  • 다른 예를 마음대로 들어 진술이 충족되는지 검증해 주십시오.
    C#8을 사용하면 다음 함수를 얻을 수 있습니다.
    int CalculateWinner(int player1, int player2)
    {
        return (Math.Abs(player1 - player2) % 2)
            switch
        {
            0 => player1 == player2
                ? -1
                : new[] { player1, player2 }.Min(),
            1 => new[] { player1, player2 }.Max(),
            _ => throw new Exception(@"¯\_(ツ)_/¯")
        };
    }
    
    우리가 이를 비교할 때, 우리는 이 알고리즘이 우리가 그곳에서 사용하는 알고리즘의 보급임을 보았고, 우리가 현재 이 게임의 확장을 구하고 있는 것을 고려하면, 그것이 어떤 모습일지 알 수 있다.

    콘솔 응용 프로그램


    이것은 인터랙티브 컨트롤러 응용 프로그램의 예시로 우리와 함께 돌, 보, 가위, 스포크, 도마뱀을 놀고 이전에 정의된 알고리즘을 바탕으로 한다.
    만약 우리가 enum Item (6 줄) 에서 스포크와 도마뱀을 삭제한다면 이 코드는 돌, 보, 가위 게임에도 사용할 수 있습니다.
    using System;
    using System.Linq;
    
    public static class Program
    {
        private enum Item { Rock, Paper, Scissors, Spock, Lizard }
    
        private static readonly string[] ItemArray = Enum.GetNames(typeof(Item));
        private static readonly Random Rnd = new Random((int)DateTime.Now.Ticks & 0x0000FFFF);
    
        public static void Main()
        {
            while (true)
            {
                Console.WriteLine($"Let's play! Type '{string.Join("', '", ItemArray[..^1])}' or '{ItemArray.Last()}'");
    
                if (!Enum.TryParse(typeof(Item), Console.ReadLine().Trim('\''), ignoreCase: true, out var humanInput))
                {
                    Console.WriteLine("\tComputer says \"no\": invalid input\n");
                    continue;
                }
    
                var computerInput = Enum.Parse(typeof(Item), ItemArray[Rnd.Next(0, ItemArray.Length)]);
                Console.WriteLine($"\tYou've chosen {humanInput}\n\tComputer has chosen {computerInput}");
    
                var result = CalculateWinner((int)humanInput, (int)computerInput);
    
                PrintResultMessage((int)humanInput, result);
            }
        }
    
        private static int CalculateWinner(int player1, int player2)
        {
            return (Math.Abs(player1 - player2) % 2)
                switch
            {
                0 => player1 == player2
                    ? -1
                    : new[] { player1, player2 }.Min(),
                1 => new[] { player1, player2 }.Max(),
                _ => throw new Exception(@"¯\_(ツ)_/¯")
            };
        }
    
        private static void PrintResultMessage(int humanInput, int result)
        {
            var resultMessage = result == -1
                ? "It's a draw!"
                : (result == humanInput) ? "You win!" : "You lose!";
    
            Console.WriteLine($"\t{resultMessage}\n");
        }
    }
    
    이 코드here를 찾을 수 있습니다.
    나는 당신이 돌, 보, 가위, 스포크, 도마뱀 및/또는 당신이 제공한 해결 방안에 대해 재미있는 분석을 하기를 희망합니다!

    좋은 웹페이지 즐겨찾기