치트에서 부정 행위를 도와주세요


13

치트는 당신이 당신의 손을 제거하려고하는 카드 게임입니다. 턴은 대략 다음과 같이 보입니다 :

  1. 그 턴에 어떤 카드 등급을 사용해야하는지 결정하십시오. 대부분의 변형에서 이것은 이전 턴보다 한 등급 높습니다.
  2. 1-4 장의 카드를 뒤집어 놓습니다. 이들은 유효한 순위와 일치하지 않아도됩니다. 그렇지 않으면 치트로 간주됩니다 . 이 시점에서 모든 플레이어가 당신 에게 도전 할 수 있습니다.
    • 아무도 당신에게 도전하지 않으면, 다음 플레이어에게 계속 플레이합니다.
    • 누군가 당신에게 도전하고 속이지 않았다면, 그들은 모든 카드를 가져 가야합니다.
    • 누군가 당신에게 도전하고 속임수를 쓴다면, 당신은 모든 카드를 가져 가야합니다.

이 전략은 주로 블러핑과 카드 카운팅의 혼합입니다. 나는 수학에 나쁘다. 그래서 나는 치트에서 바람을 피우고 봇을 가져갈 것이다.

입력

입력은 원하는 순서 또는 형식으로 수행됩니다.

  1. 플레이어의 손. 카드가 있어야한다는 것을 알고있는 경우 (예 : 카드를 픽업 한 것을 본 경우) 오름차순으로 나열됩니다. 알 수없는 항목은 이후에로 표시됩니다 ?. 예를 들어, 6 장의 카드가 있고 2가 1이고 1이 4 인 경우 손의 유효한 표현은입니다 114???. ?는 항상 알려진 카드 뒤에 표시됩니다. 141???그리고 11???4모두 유효하지 않은 입력하고 코드가 그들을 처리 할 필요가 없습니다.
  2. 내가 아는 카드는 그들의 손의 일부가 아닙니다. 목록은 순위가 오름차순으로 표시됩니다. 목록이 비어있을 수 있습니다.
  3. 플레이어가 주장한 카드. 그들이 3 7을 연주한다고 주장한다면, 가능한 입력은 다음과 같습니다 777. 카드는 항상 같은 순위입니다.

카드의 수는 항상 1-4이고 순위는 항상 0-9입니다. 순위는 손이 아닌 손에 4 번 이상 나타나지 않습니다.

다음은 유효한 입력 예입니다.

33577??
01555688
55

다음은 유효하지 않은 입력 예입니다.

35377?? # Out of order
7779    # Five 7's in total
23      # Two separate ranks played

산출

우리가 반드시 도전 해야한다면 진실한 가치 . 우리가 도전하고 싶지 않을 경우 거짓 값.

그들이 속이는 것을 알고 있으면 항상 도전합니다. 우리는 그들이 가질 수 없었던 카드를 썼을 때 속이는 것을 알고 있습니다 :

12

3  # They don't have any 3's or ?'s    
-------------
12?

33 # Fewer ?'s than played cards
-------------
123?
333
33 # Since we have three 3's they can't have two

우리가 도전하는 다른 시간은 마지막 카드를 사용하는 것입니다. 놀이가 합법적이라해도 게임을 끝내면 우리는 도전 할 수 있습니다.

1

1 # They'd win, so challenge anyway

더 많은 테스트 사례

Truthy (도전해야 함)

11445678?

22
-------------
????????
4
4444
-------------
12345678

9

팔시 (챌린지해서는 안 됨)

1?
222
2
-------------
12?
22
22
-------------
?????

1111

채점

가장 짧은 코드가 승리합니다.


7
이것은
bullsh

몇 명이나 놀고 있습니까?
jacksonecac

@jacksonecac 한 번의 플레이 만보고 있으므로 플레이어가 몇 명인지 걱정할 필요가 없습니다.
Hovercouch

1
이것은 언덕의 왕실이어야합니다
Vlo

2
두 번째 잘못된 경우에 도전해서는 안됩니까?
StephenTG

답변:



1

자바 스크립트 (ES6), 93 바이트

(h,s,c,g=(a,z=c[0])=>a.split(z).length-1)=>h.length==g(c)|g(h,'?')+g(h)<g(c)|g(h)+g(s)+g(c)>4

세 줄의 카드를 허용합니다 (문자 0- 9또는 ?). 그렇지 않으면 1도전을 위해 돌아옵니다 0. 설명:

(h,s,c,                 Input parameters
 g=(a,z=c[0])=>         Helper function defaults to claimed card
  a.split(z).length-1   Count cards matching (g(c) == c.length)
)=>h.length==g(c)       Does hand length equal claim length
  |g(h,'?')+g(h)<g(c)   Could hand not contain claimed cards
  |g(h)+g(s)+g(c)>4     Are there too many claimed cards

1

C # 6, 134 바이트

using System.Linq;
bool f(string a,string b,string c)=>a.Length==1|a.Count(x=>x==c[0]|x=='?')<c.Length|b.Count(x=>x==c[0])+c.Length>4;

(참고 : OP의 예에 따라 상대가 두 장 이상의 카드를 가지고 있고 자신의 모든 카드를 사용하는 경우에도이 답변은 false를 반환합니다. 전략 측면에서 이것은 true를 반환해야합니다.)

설명:

a: 플레이어의 손
b: 내가 아는
c카드 ... : 카드가 있다고 주장함

언 골프 드 :

bool f(string a, string b, string c) => 
    a.Length == 1                               // Last card played
    | a.Count(x => x == c[0] | x == '?' )       // Count no. of cards that surely/may match claimed cards
                                                // Assuming all claimed cards are the same, just compare with c[0]
        < c.Length                              // I'm sure you don't have that many cards...
    | b.Count(x => x == c[0]) + c.Length > 4;   // ... Or that there can't be that many cards in play

a.Length==1a.Length==c.Length. 당신은 당신의 노트에서 그런 것을 암시하는 것처럼 보이지만, 나는 당신이 언급 한 OP의 예가 상대방이 자신의 손에있는 카드의 수보다 많은 카드가 재생 될 수 있는지 알지 못합니다.
케빈 크루이 ssen

1

자바 8, 169135 바이트

(a,b,c)->{int C=c.length();char x=c.charAt(0);return a.length()==C|(a+0).split(x+"|\\?",-1).length<=C|5-(b+0).split(""+x,-1).length<C;}

설명:

여기에서 시도하십시오.

(a,b,c)->{            // Method with three String parameters and boolean return-type
  int C=c.length();   //  The amount of cards played by your opponent this turn
  char x=c.charAt(0); //  The card played by your opponent this turn
  return a.length()==C//  Return true if your opponent played his entire hand (final round)
    |(a+0).split(x+"|\\?",-1).length
                      //   Or the amount of the played card and '?' in your opponent's hand
      <=C             //   is smaller than the amount of cards played
    |5-(b+0).split(""+x,-1).length
                      //   Or if 4 minus the amount of the played card are part of the
                      //   cards you definitely know, 
     <C;              //   is smaller than the amount of cards played
}                     // End of method

참고 : 문자열 (s+0).split("c",-1).length-1에서 문자 c가 나타나는 횟수를 제공합니다 s. 따라서 위 설명의 주석은 정확하지만 코드 때문에 다르게 보일 수 있습니다. 는 (a+0).split(x+"|\\?",-1).length-1<C에 golfed되는 (a+0).split(x+"|\\?",-1).length<=C4-(b+0).split(""+x,-1).length-1<C에 golfed됩니다 5-(b+0).split(""+x,-1).length<C.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.