ModTen의 좋은 게임과 같은 것은 없습니다.


27

면책 조항 : ModTen 은이 도전의 목적을 위해 만들어진 가상의 카드 게임입니다.

ModTen의 규칙

ModTen 은 표준 52 카드 데크와 함께 재생됩니다. 완전한 규칙이 아직 발명되지 않았기 때문에 우리는 독점적으로 핸드 순위에 중점을 둘 것입니다.

Jack & Three, 적합

ModTen에서 우승. Wikipedia의 그래픽 .

카드 가치

카드의 값은 다음과 같습니다.

  • 2 ~ 9 : 액면가 가치
  • : 0 점
  • : 3 점
  • 또는 : 8 점
  • 에이스 : 9 점

손 가치

  • ModTen의 손으로 만든 두 카드 . 핸드의 기본 값은 두 카드의 값을 곱하고 마지막 숫자 만 유지함으로써 (즉, 모듈로 10을 적용하여) 얻습니다.

    예를 들어 ( 7 × 8 ) mod 10 = 6 이므로 7-Q ♣ 값 은 " 6 " 입니다.(7×8)모드10=6

  • ModTen의 다른 규칙은 적합하지 않은 카드 보다 적합한 카드 가 가치 가 있다는 것입니다. 일반적으로, 두 카드가 모두 같은 수의 경우 값에 "s" 를 추가합니다 .

    예를 들어, 9-5 ♠ 의 값은 ( 9 × 5 ) mod 10 = 5 이고 카드가 적합 하기 때문에 " 5에스 " 로 표시됩니다 .(9×5)모드10=5

핸드 랭킹 및 우승자

위의 규칙은 18 개의 고유 핸드 랭크를 나타내며, 다음 표에 요약되어 있습니다. 확률은 정보 용으로 만 제공됩니다.

두 손이 주어지면 가장 낮은 순위의 손이 이깁니다. 양손의 순위가 같으면 무승부입니다 (타이 브레이커 없음).

 hand rank | hand value(s) | deal probability
-----------+---------------+------------------
     1     | 9s            | 0.30%
     2     | 3s            | 0.60%
     3     | 1s            | 0.90%
     4     | 7s            | 1.21%
     5     | 5s            | 1.51%
     6     | 3             | 1.81%
     7     | 9             | 2.26%
     8     | 8s            | 2.71%
     9     | 6s            | 3.02%
    10     | 1 or 7        | 3.62% each
    11     | 2s or 4s      | 3.92% each
    12     | 5             | 4.98%
    13     | 0s            | 5.43%
    14     | 8             | 8.14%
    15     | 6             | 9.95%
    16     | 2             | 11.76%
    17     | 4             | 13.57%
    18     | 0             | 16.74%

도전

두 개의 ModTen 손이 주어지면 다음 세 가지를 선택하기 위해 선택한 세 가지 일관된 값 중 하나를 출력 하십시오.

  • 첫 번째 플레이어가 승리
  • 두 번째 플레이어가 승리
  • 그것은 무승부입니다

다음 규칙이 적용됩니다.

  • 카드가 상부 케이스에서의 순위에 의해 기술되어야한다 ( 2, 3, ..., 9, T, J, Q, K또는 A) 낮은 경우에 그 정장 하였다 ( c, d, h또는s , 클럽, 다이아몬드, 하트와 스페이드의 경우).
  • "10"대신 사용할 수 "T"있지만 다른 대체는 금지됩니다.
  • 위의 규칙을 준수하는 한 합리적이고 모호하지 않은 형식으로 손을 잡을 수 있습니다. 순위와 수트를 단일 문자열이 아닌 두 개의 다른 문자로 사용할 수 있습니다.

    유효한 입력 형식은 다음과 같습니다.

    • "7c Qh 8s Ks"
    • [["7c","Qh"], ["8s","Ks"]]
    • [[['7','c'], ['Q','h']], [['8','s'], ['K','s']]]
    • 기타
  • 3 개의 일관된 고유 값을 사용하는 대신 출력이 음수 , 양수 또는 0 일 수 있습니다 . 답변에 사용 된 출력 형식을 지정하십시오.

  • 이것은 입니다.

테스트 사례

플레이어 1 승리

["Js","3s"], ["Ks","Kh"]
["7h","9h"], ["9s","7c"]
["Ah","5s"], ["Ts","8s"]
["Ts","8s"], ["Jh","2s"]
["4h","8s"], ["Qh","Ks"]

플레이어 2 승리

["Th","8d"], ["6s","Kd"]
["Jc","5c"], ["3s","9s"]
["Jc","Jd"], ["9h","Ah"]
["2d","4d"], ["3h","3s"]
["5c","4c"], ["3c","2c"]

무승부

["Js","3s"], ["3d","Jd"]
["Ah","Ac"], ["3d","9s"]
["Qc","Kc"], ["6d","4d"]
["2d","3d"], ["3s","2s"]
["Ts","9c"], ["4h","5d"]

열거 형을 입력으로 사용하는 것은 어떻습니까? Haskell은 매우 강력한 타입 시스템을 가지고 있습니다 . 나는 이것과 같은 것을 직접 만들 수 있다고 확신합니다.
wizzwizz4

하스켈은 아니지만 {{J, s}, {3, s}}괜찮을까요?
wizzwizz4

1
@ wizzwizz4 그렇습니다.
Arnauld

2
이것은 "적합한 카드"대신 "적합한 수트를 가진 카드의 수"로 더 명확 할 수 있습니다.
chrylis

답변:


13

파이썬 3 , 114110 바이트

lambda m,n:p(*n)-p(*m)
R=b"T 2J45UNK9RL<3SLM;QAK:O>=/678"
v=R.find
p=lambda i,s,j,t:R[s==t::2][v(j)*v(i)%10+3]

온라인으로 사용해보십시오!

@Arnauld는 카드 값과 순위 테이블 문자열을 병합하는 아이디어를 제안했습니다. 몇 번의 시도 끝에 나는 R="T 2J45UNK9RL<3SLM;QAK:O>=/678"원래 카드 값 문자열과 길이가 같은 병합 된 문자열 을 만들었습니다. 문자열은 R[6:25]="UNK9RL<3SLM;QAK:O>=/"랭크 테이블뿐만 아니라 용 카드 값 룩업 테이블로서 기능 3, 9, A, K, 및 Q. 새 순위 테이블의 ASCII 값 디코딩은 이전 순위 테이블과 동일한 순위 효과를 갖습니다.

바이트 문자열을 입력으로 사용하면 4 바이트가 절약됩니다.

cmpPython 2에서 사용하면 @ xnor 's solution 과 같이 솔루션을 102 바이트로 줄일 수 있습니다 .


파이썬 (3) , 165 (142) 130 (129) 바이트

lambda m,n:p(*n)-p(*m)
v="T 23456789   J    QA        K".find
p=lambda i,s,j,t:ord("HC92FA51GAB4E893D760"[s==t::2][v(j)*v(i)%10])

온라인으로 사용해보십시오!

@Jonathan Allan 덕분에 -23 바이트

@ovs 덕분에 -2 바이트

@mypetlion 덕분에 -1 바이트

언 골프 드 :

f = lambda hand1, hand2: get_rank(*hand2) - get_rank(*hand1)
def get_rank(v1, suit1, v2, suit2):
    get_card_value = "T 23456789   J    QA        K".find
    # rank_table = [[17,9,15,5,16,11,14,9,13,6],[12,2,10,1,10,4,8,3,7,0]]
    # rank_table = ("H9F5GBE9D6","C2A1A48370") # Base-18 encoding of ranks
    rank_table = "HC92FA51GAB4E893D760" # Interleaved base-18 encoding

    # ASCII-value decoding has the same ranking effect as base-18 decoding
    return ord(rank_table[suit1 == suit2::2][get_card_value(v2) * get_card_value(v1) % 10])

이 함수 f는 플레이어 1과 플레이어 2의 손을 나타내는 두 개의 인수를 취합니다. 이는 플레이어 1 승리, 플레이어 2 승리 또는 무승부의 경우 양수, 음수 또는 0 값을 반환합니다. 각 핸드는 "7cQh"와 같은 단일 문자열로 인코딩됩니다.


3
Joel, CGCC에 오신 것을 환영합니다! 핸드 랭크 배열을 2로 나누는 매우 영리한 아이디어! 계속 오세요!
640KB

1
@Jonathan Allan 감사합니다. 약간 다른 접근법을 사용하여 아이디어를 통합했습니다.
Joel

1
순위 테이블을 단일 문자열에 저장하여 2 바이트를 절약 할 수 있습니다."HC92FA51GAB4E893D760"[s==t::2]
ovs

1
그리고 또 다른 4 짧은 바이트 파이썬 2로 전환하고자하는 (경우 cmp파이썬 3에서 사용할 수 없습니다)
OVS

1
1 바이트를 저장 하는 str.find대신 사용할 수 있습니다 str.index. 두 메소드의 유일한 동작 차이 index는 요소를 찾을 수 없을 때 오류가 발생하고을 find반환 한다는 것 -1입니다. 따라서 코드에는 문제가되지 않습니다.
mypetlion

11

x86-16 어셈블리, 87 83 바이트

이진 :

00000000: e807 0050 e803 005a 3ac2 ad2c 3092 ad2c  ...P...Z:..,0..,
00000010: 30bb 3501 3af4 7503 bb3f 01e8 0a00 92e8  0.5.:.u..?......
00000020: 0600 f6e2 d40a d7c3 b106 bf49 01f2 aee3  ...........I....
00000030: 038a 4504 c312 0a10 0611 0c0f 0a0e 070d  ..E.............
00000040: 030b 020b 0509 0408 0124 1a21 1b11 0003  .........$.!....
00000050: 0808 09                                  ...

미 조립 :

E8 010A         CALL GET_HAND           ; score first hand, ranked score into AL 
50              PUSH AX                 ; save score
E8 010A         CALL GET_HAND           ; score second hand 
5A              POP  DX                 ; restore first hand into DL 
3A C2           CMP  AL, DL             ; compare scores - result in CF, OF and ZF

            GET_HAND PROC               ; 4 char string to ranked score ("9s7c" -> 6)
AD              LODSW                   ; load first card string 
2C 30           SUB  AL, '0'            ; ASCII convert 
92              XCHG DX, AX             ; store in DX 
AD              LODSW                   ; load second card string 
2C 30           SUB  AL, '0'            ; ASCII convert 
BB 0139         MOV  BX, OFFSET R       ; first, point to non-suited table 
3A F4           CMP  DH, AH             ; is it suited?
75 03           JNZ  NO_SUIT 
BB 0143         MOV  BX, OFFSET RS      ; point to suited table 
            NO_SUIT: 
E8 012C         CALL GET_VALUE          ; get face card value in AL 
92              XCHG DX, AX             ; swap first and second cards 
E8 012C         CALL GET_VALUE          ; get face card value in AL 
F6 E2           MUL  DL                 ; multiply values of two cards 
D4 A0           AAM                     ; AL = AL mod 10
D7              XLAT                    ; lookup value in rank score table 
C3              RET 
            GET_HAND ENDP

            GET_VALUE PROC              ; get value of a card (2 -> 2, J -> 3, A -> 9)
B1 06           MOV  CL, 6              ; loop counter for scan
BF 014D         MOV  DI, OFFSET V       ; load lookup table 
F2/ AE          REPNZ SCASB             ; scan until match is found 
E3 03           JCXZ NOT_FOUND          ; if not found, keep original numeric value
8A 45 04        MOV  AL, BYTE PTR[DI+4] ; if found, get corresponding value 
            NOT_FOUND:
C3              RET                     ; return to program 
            GET_VALUE ENDP

R   DB 18, 10, 16, 6, 17, 12, 15, 10, 14, 7     ; unsuited score table
RS  DB 13, 3, 11, 2, 11, 5, 9, 4, 8, 1          ; suited score table
V   DB 'J'-'0','Q'-'0','K'-'0','A'-'0','T'-'0'  ; face card score table
    DB 3, 8, 8, 9, 0

입력은의 Js3sKsKh포인터에서 와 같은 문자열 입니다 SI. 출력된다 ZF = 0 and SF = OF(테스트와 JG플레이어 (1) 이기면) SF ≠ OF(시험과 JL플레이어 2 승 경우) ZF(함께 시험 JE)을 그리면.

DOS 테스트 프로그램을 사용한 출력 :

여기에 이미지 설명을 입력하십시오

DOS 용 MODTEN.COM 을 다운로드하여 테스트 하십시오 .


7

05AB1E , 41 37 바이트

•V›{₆Ÿ&∊WÍj¸•19вyεø`Ës‘ߌQ‘ŽćS‡Pθ«}èÆ

@Grimy 덕분에 -4 바이트 .

챌린지 설명의 세 번째 입력 형식과 같이 문자 목록 목록으로 입력하십시오. 즉 P1 7c Qh& P2 8s Ks는로 입력됩니다 [[["7","c"],["Q","h"]],[["8","s"],["K","s"]]]. (그리고에 사용 "10"합니다 10.)

플레이어 1이 이기면 음의 정수를 출력합니다. 플레이어 2가 이기면 양의 정수; 드로우 인 경우 0

온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 .

설명:

V›{₆Ÿ&∊WÍj¸•  # Push compressed integer 36742512464916394906012008
 19в           # Convert it to base-19 as list:
               #   [18,10,16,6,17,12,15,10,14,7,13,3,11,2,11,5,9,4,8,1]
Iε             # Push the input, and map each of its hands to:
  ø            #  Zip/transpose the hand; swapping rows/columns
               #   i.e. [["8","s"],["K","s"]] → [[["8","K"],["s","s"]]
   `           #  Push them separated to the stack
    Ë          #  Check if the two suits in the top list are equal (1/0 for truthy/falsey)
    s          #  Swap to get the list with the two values
     ‘ߌQ     #  Push dictionary string "JAKEQ"
     ŽćS       #  Push compressed integer 39808
              #  Transliterate these characters to these digits
      P        #  Now take the product of the two values in the list
       θ       #  Only leave the last digit (basically modulo-10)
    «          #  And merge it to the 1/0
               #  (now we have the hand values of both players,
               #   where instead of a trailing "s" we have a leading 1)
             # After the map: index each value into the earlier created integer-list
               # (now we have the hand rank of both players)
   Æ           # And then reduce the resulting integers by subtracting
               # (after which the result is output implicitly)

내이 05AB1E 팁을 참조하십시오 (섹션에서는 어떻게 사전? 사용하는 방법 큰 정수를 압축하는 방법?압축 정수 목록에 어떻게? ) 이유를 이해 할 수 •V›{₆Ÿ&∊WÍj¸•있다 36742512464916394906012008, •V›{₆Ÿ&∊WÍj¸•19в있다 [18,10,16,6,17,12,15,10,14,7,13,3,11,2,11,5,9,4,8,1], ‘ߌQ‘있다 "JAKEQ", 그리고 ŽćS이다 39808.


이 질문은 명시 적으로 입력 T을 허용 10하므로 Tfrom을 드롭 할 수 있습니다 JTQKA(30889 대신 압축 정수 3889 사용). 또한 일 T* ... +수 있습니다 ... «.
그리미

1
@Grimy Ah, 나는 실제로 10대신에 T허용되는 것을 알았지 만 생각하지 않았다.10모드10=0! 그리고 T*...+존재는 ...«지금은 그것을 볼 것은 분명하다 ..>.> 감사합니다!
Kevin Cruijssen

1
37 (현재 실제로 작동합니다!)
Grimmy

@ 그림 아, 그런 사전의 좋은 사용!
Kevin Cruijssen

3

PHP ,212 185 178 149 바이트

while($p=$argv[++$x])$$x=ord(rjpfqlojngmckbkeidha[(($v=[J=>3,Q=>8,K=>8,A=>9])[$p[0]]?:$p[0])*($v[$p[2]]?:$p[2])%10+($p[1]==$p[3])*10]);echo${1}-${2};

온라인으로 사용해보십시오!

  • @ Night2 덕분에 -7 바이트!
  • 배열 대신 테이블을 ASCII 인코딩하여 -29 바이트

입력은 명령 행을 통해 이루어집니다. 플레이어 1이 이기면 출력 STDOUT음수 이고, 플레이어 2가 이기면 양수0 입니다. 예:

$ php modten.php Js3s KsKh
-1

1
@ Night2 우주선 연산자를 기꺼이 우리에게 주려고한다면 (얼마나 자주 사용합니까?), -2 바이트를 사용할 수 -1있고- 1또는 대신에 음수, 양수 또는 0을 반환 할 수 0있습니다.
640KB

이전 답변에서 우주선 운영자를 보는 것이 (좋은 방법으로) 놀랐습니다.
밤 2

2

젤리 , 46 바이트

“T0J3Q8K8A9”yⱮZV€P$Eƭ€)%⁵UḌị“©N¿!Æßvṅ?żṀ’b18¤I

온라인으로 사용해보십시오!

전체 프로그램은 예를 들어 인수로 간주하고 ["7h","Ks"],["4s","Ts"]두 선수가 모두 추첨하면 0을 인쇄하고, 1 번 선수가 이기면 긍정적이고 2 번 선수가 이기면 부정입니다.


2

C (GCC) , 172 (167) 165 164 바이트

p(l,v)char*l,*v;{v="T 23456789   J    QA        K";return"A<92?:51@:;4>893=760"[(l[1]==l[3])+(index(v,l[2])-v)*(index(v,*l)-v)%10*2];}f(char*s){return p(s+5)-p(s);}

온라인으로 사용해보십시오!

@ceilingcat 덕분에 2 바이트가 줄었습니다!

기본적으로 @Joel의 Python3 솔루션 포트이지만 base18 인코딩은 없습니다. 두 플레이어의 패를 구분하는 공백이있는 하나의 문자열로 입력을 예상하고 양수, 음수 또는 0 인 정수를 출력하여 플레이어 1 승리, 플레이어 2 승리 또는 무승부임을 나타냅니다.


2

펄 (6) , 101 (100) 94 88 바이트

Jo King 덕분에 -1 바이트

{[-] .map:{'HC92FA51GAB4E893D76'.ords[[*](.[*;0]>>.&{TR/JQKA/3889/})%10*2+[eq] .[*;1]]}}

온라인으로 사용해보십시오!

10 을 f(((<J ♠>, <3 ♠>), (<10 ♠>, <K ♥>)))사용하여 입력을 10받습니다. 플레이어 1이 이기면 <0, 플레이어 2가 이기면> 0, 무승부이면 0을 반환합니다.

설명

{
  [-]  # subtract values
  .map:{  # map both hands
    'HC92FA51GAB4E893D76'.ords[  # lookup rank in code point array
      [*](  # multiply
        .[*;0]  # card ranks
        >>.&{TR/JQKA/3889/}  # translate J,Q,K,A to 3,8,8,9
      )
      %10*2  # mod 10 times 2
      +[eq] .[*;1]  # plus 1 if suited
    ]
  }
}

1

, 97 바이트

≔”)¶&sNψU↓”ζF¹³F¹³F⁻⁴⁼ικ⊞υ⁺÷λ³⊗﹪Π⁺§ζι§ζκχ≔”A↘τ[⁵PkxτG”ε≔⁰δF⟦θη⟧≦⁻№υ⁺⁼§ι¹§ι³⊗﹪Π⁺§ζ⌕ε§ι⁰§ζ⌕ε§ι²χδIδ

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 입력을 4 문자의 두 문자열로 취하고 QcKc 6d4d부호있는 정수를 출력합니다. 설명:

≔”)¶&sNψU↓”ζ

압축 문자열 2345678903889은 카드 값을 나타냅니다.

F¹³F¹³

가능한 각 값 쌍을 반복합니다.

F⁻⁴⁼ικ

가능한 두 번째 카드 한 벌을 반복하십시오. 일반성을 잃지 않으면 서 첫 번째 카드의 수트가 3이라고 가정 할 수 있으므로 두 번째 카드 수트의 값이 동일하지 않으면 0에서 3까지의 범위를 가질 수 있습니다.

⊞υ⁺÷λ³⊗﹪Π⁺§ζι§ζκχ

손의 수정 된 점수 (손의 값이 두 배가 됨)를 계산하고, 수트가 동일하면 1을 더합니다 (예 : 두 번째 카드에 수트 3이 있음).

≔”A↘τ[⁵PkxτG”ε

압축 문자열 23456789TJQKA은 카드 문자를 나타냅니다. 입력 카드는이 문자열에서 조회 된 다음 위치가 카드의 값을 얻기 위해 첫 번째 문자열을 색인하는 데 사용됩니다.

≔⁰δ

결과를 0으로 초기화하십시오.

F⟦θη⟧

두 손을 반복합니다.

≦⁻№υ⁺⁼§ι¹§ι³⊗﹪Π⁺§ζ⌕ε§ι⁰§ζ⌕ε§ι²χδ

손의 수정 된 점수와 그 빈도를 계산하고 결과를 뺍니다.

Iδ

주파수 차이를 출력합니다.



0

펄 5 -p , 107 바이트

$a=A;y/ATJQK/90388/;${$a++}=substr"IAG6HCFAE7D3B2B59481",($1eq$3).$&*$2%10,1while/.(.) (.)(.)/g;$_=$A cmp$B

온라인으로 사용해보십시오!

입력:

As 4d,Th 8c

(실제로 쉼표는 모든 문자가 될 수 있습니다.)

산출:

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