내 Scopa 핸드의 점수는 얼마입니까?


14

나는 카드 게임 도전을 좋아해서 이탈리아 카드 게임 Scopa를 위해 이것을 만들었다. 우리 가족은 옛날부터이 게임을 해왔습니다. 골프에 재미있을 매우 흥미로운 점수 시스템이 있습니다. 나는 재미를 시작하기 위해 R에 답변을 게시하여 사람들이 향상시킬 것이라고 확신합니다.

도전 과제 : 라운드에서 플레이어가 캡처 한 카드를 입력으로 받아 Scopa 라운드에서 득점 한 점수를 계산하십시오.

Scopa 덱에는 40 장의 카드가 있습니다. 국제 데크를 사용하는 경우 8, 9, 10을 제거하고 각 소송마다 A, 2,3,4,5,6,7, Q, J, K를 남겨 둡니다. 1 두 명의 플레이어 또는 파트너쉽이 있으며 매 라운드마다 모든 카드가 두 플레이어 중 하나 또는 다른 하나에 의해 점령됩니다. 점수는 다음과 같이 계산됩니다 (자세한 내용은 여기 참조 ).

  • 가장 많은 카드를 가진 플레이어는 1 점을 얻습니다.
  • 다이아몬드 가 가장 많은 플레이어 (또는 이탈리아 데크를 사용하는 경우 동전)는 1 점을 얻습니다.
  • sette bello 또는 beautiful seven 로 알려진 7 개의 다이아몬드 (또는 동전)를 가진 플레이어는 1 점을 얻습니다.
  • 프리미어 가 가장 높은 플레이어는 1 점을 얻습니다. 플레이어의 주요 점수는 플레이어가 각 소송에서 캡처 한 최고 가치 카드의 점수의 합계입니다 (아래 표 참조). 한 벌에 한 장 이상의 카드가 없다면, 점수가 상대방의 점수를 초과하더라도 기본적으로 패배합니다. 매우 드물게 모든 플레이어가 한 벌에 하나 이상의 카드를 가지고 있지 않은 경우, 프리미어 총점 이 높은 플레이어가 점수를 얻습니다. 2

프리미 에라 점수 표

| Rank  | Value |
| ----- | ----- |
| 7     | 21    |
| 6     | 18    |
| A     | 16    |
| 5     | 15    |
| 4     | 14    |
| 3     | 13    |
| 2     | 12    |
| Q,J,K | 10    |

따라서 플레이어는 한 라운드에서 최대 4 점을 득점 할 수 있습니다. 3 카드, 다이아몬드 또는 primiera에 대해 가능한 동점이 있으면 아무도 점수를 얻지 못합니다 .

각 카드는 두 명의 플레이어 중 한 명이 캡처해야하기 때문에 한 명의 플레이어가 어떤 카드를 가지고 있는지 알고 있더라도 다른 플레이어가 어떤 카드를 가져 갔는지 추측 할 수 있습니다. primiera 를 정확하게 점수를 매기 려면 이 작업을 수행해야합니다 .

도전 규칙

입력

코드는 한 라운드의 Scopa 동안 한 명의 플레이어가 캡처 한 카드를 입력으로 가져와야합니다.

입력은 문자열 형식이어야합니다. 여기서 한 문자는 각 카드의 순위를 나타내고 한 문자는 해당 문자를 나타냅니다. 이는 프리미어 점수를 입력으로 직접전달하는 잠재적 허점을 제거합니다. 프로그램에서카드 순위를 프리미어 점수로변환해야합니다. 그러나 공백이나 쉼표로 구분 된 단일 문자열, 문자열 배열 또는 기타 형식을 사용하도록 선택할 수 있습니다. 예를 들어또는같은 입력을 사용할 수있는76A5432QJK대로순위를 인코딩하고 적합한경우를 선택합니다.DCHS['7D', '6H', 'QD', 'JS']'7D,6H,QD,JS'

산출

플레이어의 점수를 나타내는 0에서 4까지의 정수입니다.

승리

바이트 단위의 최단 답변이 승리합니다!

테스트 사례

["7D", "6D", "AD", "5D", "4D", "3D", "2D", "QD", "7C", "6C", "4C", "3C", "2C", "7H", "4H", "2H", "5S", "3S", "QS", "JS", "KS"]

4 점수 :> 20 카드 1 점, 다이아몬드 5 점 이상> 1 다이아몬드 7 점, 프리미어 라 78 점 1 점 (7,7,7,5, 상대가 7,6,5, 64의 경우 K)

["3D", "7C", "6C", "AC", "5C", "4C", "3C", "2C", "QC", "4H", "7S"]

스코어 0 : <= 20 카드, <= 5 다이아몬드, 다이아몬드 7 개 없음, 프리미어에서 69 (7,7,4,3, 상대는 70, 7,7,6, K)

[7D", "6D", "AD", "5D", "4D", "3D", "2D", "7C", "6C", "AC", "5C", "4C", "3C", "2C", "7H", "6H", "AH", "5H", "4H", "3H", "2H"]

점수 3 :> 20 카드의 경우 1 점,> 5 다이아몬드의 경우 1 점, 다이아몬드의 7 점에 대해 1 점. primiera는 63 (7,7,7)이 될 것이며, 상대는이 손에는 삽이 없기 때문에 (51) (7, Q, Q, Q)하지만 그것은 기본적으로 포인트를 잃는 점수 수 있습니다.

["7D", "6D", "AD", "5D", "4D", "3D", "2D", "QD", "JD", "KD", "QC", "QH", "QS"]

점수 3 : <= 20 카드,> 5 다이아몬드의 경우 1 점, 다이아몬드의 7 개에서 1 점. primiera는 단지 점수 (51) (7, Q, Q, Q)와 상대가 (63) (7,7,7)을 득점 할 수 있지만 상대의 손에는 다이아몬드가 없기 때문에이 손이 승리 primiera에 기본적으로 지점을.

["7D", "6D", "AD", "5D", "4D", "3D", "2D", "QD", "JD", "KD", "7C", "7H"]

점수 3 : <= 20 카드,> 5 다이아몬드의 경우 1 점, 다이아몬드의 7 개에서 1 점. 이 핸드에는 스페이드가 없지만 상대방의 핸드에는 다이아몬드가 없기 때문에 여전히 63에서 57 (7,7,7 대 7,6,6)의 점수로 프리미 에라 에서 승리 합니다.

["7D", "6D", "AD", "5D", "4D", "3D", "2D", "QD", "JD", "KD", "QC", "QH"]

점수 2 : <= 20 카드,> 5 다이아몬드의 경우 1 점, 다이아몬드의 7 개에서 1 점. 이 손에는 스페이드가없고 상대방의 손에는 다이아몬드가 없습니다. 상대 는 63에서 41 (7,7,7 대 7, Q, Q)의 점수로 프리 메리아 를 이깁니다 .

[] (빈 배열)

0 점


1 : 적어도 우리 가족에서 Jack은 Scopa에서 Queen을 능가했지만 점수를 매기는 데는 관련이 없습니다.

2 : 저는 어릴 때부터이 게임을 해왔는데 그런 일이 없었지만 코드에서 더 잘 처리 할 수있었습니다!

3 : 라운드 중에 득점 한 "스윕"에 대한 보너스 포인트가 있습니다.이 도전의 목적으로 무시하고 있습니다.


1
각 계급이 다른 캐릭터로 표시되어야합니까?
Doorknob

@Doorknob 반드시 그런 것은 아니지만 적어도 내가 작업하고있는 솔루션에서 모든 테스트 사례를 올바르게 얻으려면 각 순위마다 고유 한 특성이 필요하다는 것을 알았습니다.
qdread

@Grimy 좋은 캐치. 감사
qdread

답변:


6

루비, 156 153 바이트

->a{b='';([a[40],a.scan(/.d/)[5],a=~/;d/,'dchs'.gsub(/./){l=a.scan /.(?=#$&)/;l.size<10&&b+=(';865432'.tr(l*'','')+?0)[0];l.max}.sum>b.sum||p]-[p]).size}

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

->a{
b='';                # stores primiera of other player
([                   # this array stores all checks
a[40],               # check if >20 cards (>40 characters)
a.scan(/.d/)[5],     # check if >5 diamonds
a=~/;d/,             # check if 7 of diamonds
'dchs'.gsub(/./){    # for each suit, build a string with...
l=a.scan /.(?=#$&)/; # find all cards with this suit
l.size<10&&          # if there are less than 10, the other person has some, so
b+=                  # append to their score string the following:
(';865432'           #   start with all the cards
.tr(l*'','')         #   remove the ones we have
+?0)                 #   add back the JQK at the end
[0];                 #   take the highest
l.max}               # return the highest card that we have
.sum                 # take the sum of the codepoints
>b.sum               # check if it's greater than the other player's sum
||p                  # if not, evaluate to nil
]-[p])               # remove all nils
.size}               # count how many are left

이것은 각각 ;865432000을 나타내는 데 사용 76A5432QJK되며 소송은 소문자입니다. (캐릭터의 선택은 각각에서 38을 빼면 더 큰 가치를 주지만, 상대적인 차이 만 중요하기 때문에 실제로 그렇게하지는 않습니다.)

우리는 불필요하기 때문에 플레이어 중 한 명이 정장을 잃어 버렸는지 여부를 확인하지 않습니다. 모든 카드에 38을 더한 실제 가치로 계산하기 때문에 누군가가 한 벌을 잃어버린 경우 얻을 수있는 최고 점수는 (21 + 38) *입니다. 3 = 177로 다른 플레이어가 얻을 수있는 가장 낮은 점수 인 (10 + 38) * 3 + 21 + 38 = 203보다 작습니다. 플레이어가 0, 1 또는 2 개의 정장 만 놓칠 수 있기 때문에 두 플레이어가 0이 아닌 다른 수의 슈트를 놓칠 수 없으며 누군가 2 개의 슈트가 없으면 다른 두 슈트의 모든 카드를 갖습니다.


4

R, 320 298 265 238 229 224 211 209 179 바이트

이것은 대부분 함수 형태의 @digEmAll로 인한 솔루션입니다.

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

function(h,S=sum,A=apply,l=99+c(11,8,5:2,6,!1:3)%o%!!1:4)S(S(p<-outer(c(7:2,'A','K','J','Q'),c('D','C','H','S'),paste0)%in%h)>20,S(p[1:10])>5,p[1],S(A(l*p,2,max)-A(l*!p,2,max))>0)

아래는 209 바이트에 대한 오래된 평범한 시도 중 가장 좋은 것입니다.

편집 : 일부 함수의 별칭을 지정하고 양복을 확인하는 대신 점수에 상수를 추가하는 Doorknob의 아이디어를 취함으로써 골프를 쳤습니다.

다음 편집 : 중복성을 제거하고 Giuseppe의 개선 사항을 통합했습니다.

다음 편집 : digEmAll 덕분에 -2 바이트

나는 이것에 끔찍하기 때문에 누군가가 시간을내어 관심이 있다면 이것을 개선 할 수 있다고 확신합니다. 나는 같은 느낌 sapplyfunction매우 길고 그들을 제거 할 수 있지만 방법을 알아낼 수 없습니다. 입력은 표준 표기법에서 두 문자 문자열입니다.

function(h,s=sum,l=c(11,8,5:2,6,!1:3)+99)s(length(h)>20,s(grepl('D',h))>5,'7D'%in%h,s(sapply(c('D','C','H','S'),function(i,r=c(7:2,'A','K','J','Q')%in%substr(h[grep(i,h)],1,1))s(l[r][1],-l[!r][1],na.rm=T)))>0)

1
당신은 R 골프 대화방 에서 도움을받을 수 있습니다 . digEmAll은 심지어 동료 이탈리아 인입니다!
주세페

1
몇 가지 조언이 있지만 세미콜론을 줄 바꿈 (R에서 1 바이트로 보임)으로 바꿀 수 있다면 대답을 더 읽기 쉽게 만드는 무료 스왑입니다. 또한 온라인 코드 러너 인 Try It Online 을 확인 하십시오 . 필요하지 않지만 다시 사용하면 좋습니다. 심지어 CGCC 게시물을 생성 할 수 있습니다
Veskah

1
253 바이트 -나는 대부분의 일반적인 골프 세트를 시도했기 때문에 이것이 효과가 있는지 확실하지 않지만 테스트하고 알려주십시오.
Giuseppe



2

자바 스크립트 (ES6),  (171)  163 바이트

표준 표현을 사용하여 카드 세트로 입력을받습니다.

c=>(c.size>20)+((g=o=>[..."CHSD"].map(s=>[..."JQK2345A67"].map((v,i)=>(S=o^c.has(v+s))?m="111345679"[++n,i]||12:0,n=m=0)|(n?0:T=1,t-=m),T=t=4)|t*T)(1)>g``)+S+(n>5)

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

댓글

c =>                                // c = set of cards
  (c.size > 20) + (                 // +1 point if we have more than 20 cards
    ( g = o =>                      // g is a function taking the flag o (for 'opponent')
      [..."CHSD"].map(s =>          // for each suit s, ending with diamonds:
        [..."JQK2345A67"]           //   for each rank v at position i, sorted from
        .map((v, i) =>              //   lowest to highest primiera score:
          (S = o ^ c.has(v + s)) ?  //     if the player owns this card, set S to 1 and:
            m = "111345679"[++n, i] //       increment n; update m to the score of this
                || 12               //       rank (we use the official score - 9)
          :                         //     else:
            0,                      //       do nothing
          n = m = 0                 //     start with n = m = 0
        ) |                         //   end of inner map()
        ( n ? 0 : T = 1,            //   if n = 0, set T to 1
          t -= m ),                 //   subtract m from t
        T = t = 4                   //   start with T = t = 4
      ) | t * T                     // end of outer map(); yield t * T
    )(1) > g``                      // +1 point if g(1) is greater than g(0)
  ) +                               // (we test this way because the scores are negative)
  S +                               // +1 point if we own the 7 of diamonds
  (n > 5)                           // +1 point if we own more than 5 diamonds

2

05AB1E , 41 바이트

39ÝsK‚εg9y@Oy0å•Dδ¿m(/d•₆вy.γT÷}è€àO)}`›O

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

슈트 DCHS는 각각로 표시됩니다 0123. 순위 7A65432KJQ는 각각으로 표시됩니다 0123456789. 이것들은 챌린지에 따라 정수가 아닌 문자열로 간주됩니다 (그러나 05AB1E는 필요할 때 정수로 변환합니다).

다른 솔루션과 마찬가지로 누락 된 수트를 확인할 필요가 없도록 각 프리미어 점수에 큰 상수 (14)를 추가합니다.

39Ý                      # range 0..39 (the list of all cards in the game)
   sK                    # remove all elements that appear in the input
      ‚                  # pair with the input: [player's hand, opponent's hand]

ε                     }  # map each hand to a list of its 4 subscores:
 g                       #  first subscore: length (number of cards)
 9y@O                    #  second subscore: count elements <= 9 (diamonds)
 y0å                     #  third subscore: is 0 (representing 7D) in the list
            y.γT÷}       #  group the hand by suit
 •Dδ¿m(/d•₆в      è      #  map each rank to its primiera score
                   ۈ    #  maximum primiera score in each suit
                     O   #  fourth subscore: the sum of those

`›                       # for each subscore: is player's > opponent's?
  O                      # sum
```

2

MS SQL Server 2017 , 525 바이트

CREATE FUNCTION f(@ NVARCHAR(MAX))RETURNS TABLE RETURN
SELECT q/21+IIF(d>6,2,IIF(d=6,1,0))+IIF(m=0,IIF(n=0 AND a>b,1,0),IIF(n=0 OR a>b,1,0))p
FROM(SELECT SUM(q)q,MAX(IIF(s='D',q,0))d,SUM(a)a,MIN(q)m,SUM(b)b,MIN(10-q)n
FROM(SELECT s,COUNT(k)q,MAX(IIF(r=k,v,0))a,MAX(IIF(r=k,0,v))b
FROM(SELECT LEFT(value,1)r,s,ASCII(RIGHT(value,1))-38 v
FROM STRING_SPLIT('7;,68,A6,5,4,3,2,Q0,J0,K0',','),(VALUES('D'),('C'),('H'),('S'))s(s))d
LEFT JOIN(SELECT LEFT(value,1)k,RIGHT(value,1)u FROM STRING_SPLIT(@,','))a
ON r+s=k+u GROUP BY s)t)t

db <> fiddle 에서 시도하십시오 .


1

레티 나 0.8.2 , 334 바이트

$
 ¶234567JQKA
r`.\G
$&C $&D $&H $&S 
+`((\w\w).*¶.*)\2 
$1
T`67AJQK`8960
%O$`(\w)(\w)
$2$1
m`^(?=(...)*)(.C )*(.D )*(.H )*(.S )*
$3;$#1 $#2 $#3 $#4 $#5;${2}${3}${4}$5
m`^(?=(9D))?...;
$#1;
(;(?!.*10).* 0.*;).*
$1
\d[C-S] 
1$&
19\w 
21$*@
\d+(\w )?
$*@
(@)?;(@*) @* (@*).*;(@*)¶@?;((?!\2))?@* @* ((?!\3))?.*;((?!\4))?.*
$#1$#5$#6$#7
1

온라인으로 사용해보십시오! 링크에는 테스트 사례가 포함됩니다. 설명:

$
 ¶234567JQKA
r`.\G
$&C $&D $&H $&S 

모든 40 장의 카드 목록을 작성하십시오.

+`((\w\w).*¶.*)\2 
$1

플레이어가 보유한 카드를 제거하십시오.

T`67AJQK`8960

각 등급을 정렬 순서로 바꾸십시오.이 순서는 7다른 카드보다 9 와 10이 적습니다.

%O$`(\w)(\w)
$2$1

양복과 순위에 따라 카드를 정렬하십시오.

m`^(?=(...)*)(.C )*(.D )*(.H )*(.S )*
$3;$#1 $#2 $#3 $#4 $#5;${2}${3}${4}$5

각 소송에서 카드 수를 세고 각 소송에서 가장 높은 순위의 카드를 캡처하여 가장 높은 다이아몬드를 두 번 캡처하십시오.

m`^(?=(9D))?...;
$#1;

가장 높은 다이아몬드가 7인지 확인하십시오.

(;(?!.*10).* 0.*;).*
$1

수트 중 하나에 카드가 없으면 가장 높은 카드를 모두 삭제하십시오.

\d[C-S] 
1$&
19\w 
21$*@
\d+(\w )?
$*@

가장 높은 카드를 단항 점수로 변환하고 합산하십시오. 또한 총 카드 수와 수트 길이를 단항으로 변환하십시오.

(@)?;(@*) @* (@*).*;(@*)¶@?;((?!\2))?@* @* ((?!\3))?.*;((?!\4))?.*
$#1$#5$#6$#7

총계, 다이아몬드 또는 프리미어가 높은 경우 점수를 얻습니다.

1

점수를 합산하십시오.



1

AWK , 235 바이트

{s[9]=35;s[8]=32;s[7]=30;s[6]=29;s[5]=28;s[4]=27;s[3]=26;s[2]=s[1]=s[0]=24;a[$1 $2]=s[$1]}END{while(i++<4){D=0;for(j=0;j<10;j++){if(a[j i]<1){B[i]=s[j];D++}if(A[i]<a[j i])A[i]=a[j i]}x+=A[i];y+=B[i]}print(20<NR)+(D<5)+(1<a[9 4])+(y<x)}

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

소송은 1234 (4는 다이아몬드)에, 값은 0123456789에 매핑됩니다.이 프로그램은 테스트 사례를 허용되는 형식으로 변환합니다.

BEGIN{RS=", ";FS="";t[7]=9;t[6]=8;t["A"]=7;t[5]=6;t[4]=5;t[3]=4;t[2]=3;t["Q"]=2;t["J"]=1;t["K"]=0;u["D"]=4;u["C"]=1;u["H"]=2;u["S"]=3}{gsub("[\\[\"\\]]","",$0);print t[$1],u[$2]}

내 목표는 최고의 Python 구현을이기는 것입니다.


1

파이썬 3 , 249245239 바이트

@ovs 덕분에 -4 바이트

@movatica 덕분에 -6 바이트

lambda C:sum([len(C)>20,'7D'in C,len([c for c in C if'E'>c[1]])>5,p(C)>p({n+s for n in'9876543210'for s in S}-C)])
p=lambda C:[not S.strip(''.join(C)),sum(max([(c[1]==s)*int('9gcdefil99'[int(c[0])],22)for c in C]+[0])for s in S)]
S='DcHS'

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


1
2 바이트 이하의 int('0734569c00'[int(x[0])],13)if x[1]<'E' 같이 쓸 수있다if'E'>x[1]
OVS

all(s in''.join(C)for s in S)에 단축 할 수 not S.strip(''.join(C))6 바이트 저장
movatica을
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.