면책 조항 : ModTen 은이 도전의 목적을 위해 만들어진 가상의 카드 게임입니다.
ModTen의 규칙
ModTen 은 표준 52 카드 데크와 함께 재생됩니다. 완전한 규칙이 아직 발명되지 않았기 때문에 우리는 독점적으로 핸드 순위에 중점을 둘 것입니다.
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 일 수 있습니다 . 답변에 사용 된 출력 형식을 지정하십시오.
- 이것은 code-golf 입니다.
테스트 사례
플레이어 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"]
답변
파이썬 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 바이트가 절약됩니다.
cmp
Python 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”와 같은 단일 문자열로 인코딩됩니다.
답변
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 을 다운로드하여 테스트 하십시오 .
답변
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
.
답변
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
답변
젤리 , 46 바이트
“T0J3Q8K8A9”yⱮZV€P$Eƭ€)%⁵UḌị“©N¿!Æßvṅ?żṀ’b18¤I
전체 프로그램은 예를 들어 인수로 간주하고 ["7h","Ks"],["4s","Ts"]
두 선수가 모두 추첨하면 0을 인쇄하고, 1 번 선수가 이기면 긍정적이고 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 승리 또는 무승부임을 나타냅니다.
답변
펄 (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
]
}
}