다리 손 득점


13

계약 브리지를 매우 흥미롭게 만드는 것 중 하나는 매우 복잡한 "인공"메타 게임입니다. 이 핸드 득점 시스템은 그 중 작은 부분입니다.

브리지는 트릭 테이킹 카드 게임입니다. 각 플레이어는 13 장의 카드를 받고 게임은 입찰로 시작합니다 . 입찰은 게임의 나머지 부분을 결정하며 결정적인 부분입니다. 귀하와 귀하의 파트너가 너무 높거나 낮게 입찰하지 않도록하기 위해이 인공 스코어링 시스템은 귀하의 손이 얼마나 좋은지를 알려주기 위해 개발되었습니다.

채점

샘플 핸드는 다음과 같습니다.

S:KQT5
H:J72
D:965
C:AK8

S, H, D, C는 슈트 (스파 드, 하트, 다이아몬드 및 클럽)를 나타내고 나머지는 해당 슈트의 카드입니다. 따라서이 손에는 스페이드의 여왕 (Q), 스페이드의 왕 (K), 스페이드의 열 (T), 5 개의 스페이드, 5 개의 하트, 7 개의 하트 등이 있습니다.

채점 시스템은 다음과 같이 작동합니다.

  • 당신은 당신이 가진 모든 에이스 (A)에 대해 4 점, 모든 왕 (K)에 대해 3 점, 모든 여왕 (Q)에 대해 2 점, 모든 잭 (J)에 대해 1 점을 얻습니다. 다른 카드는 포인트를주지 않습니다.
  • 한 벌의 네 번째 카드 이후의 모든 카드는 1 포인트를줍니다. 6 개의 하트가 있다면 2 점을 얻습니다.
  • 카드가 2 장 밖에없는 슈트는 1 포인트를줍니다 (이것은 더블 톤입니다). 1 장의 카드 만 있으면 2 점을받습니다 (이것은 싱글 톤입니다). 특정 소송에 카드가 없으면 3 점을 얻습니다 (이것은 무효입니다). 일반적으로 파트너와의 소송에 합의한 후에 만 ​​계산되지만 도전을 더 흥미롭게 만들기 위해 포함시킵니다.

따라서 위의 손에는 13 점이 있습니다.

도전

위에 표시된 형식의 브리지 핸드가 있으면 핸드의 포인트 수를 계산하십시오. 슈트는 항상 스페이드, 하트, 다이아몬드 및 클럽 순서로 나열되며 카드는 항상 A, K, Q, J, T, 9-2 순서로 정렬됩니다.

샘플 입력 및 출력

S:KQT5
H:J72
D:965
C:AK8
       \-> 13

S:AKQT6
H:54
D:J83
C:732
       \-> 12

S:
H:KQT8754
D:A86
C:432
       \-> 15

S:9876
H:843
D:652
C:432
       \-> 0

S:AKQT5
H:AQJ6
D:Q3
C:AK
       \-> 28

이것은 이므로 바이트 단위의 가장 짧은 코드가 이깁니다.

답변:


4

젤리, 27 25 21 바이트

-3 바이트에 대한 @Dennis 감사합니다!

L_5.AḞW+“JQKA”i$€Sµ€S

이것은 줄 목록으로 입력을받습니다. 여러 줄 문자열로 입력을 받으려면 a를 미리 입력하십시오 ṣ⁷µ.

주파수 포인트 테이블 만들기 :

Cards:    0  1  2  3  4  5  6 ... 4+k
Points:   3  2  1  0  0  1  2 ... k

우리는 그것들이 같다는 것을 알 수 있습니다 abs(c-3.5)-.5. 여기서 c는 카드의 수입니다. 각 줄에는 두 개의 추가 문자가 포함되며 점의 개수는 항상 정수이므로 floor(abs(l-5.5))l은 줄 길이입니다.

Jelly의 지수는 1을 기준으로하며 일치하지 않는 치수에 대한 벡터화 된 함수의 동작에 유의하십시오. 더 긴 목록의 추가 요소는 영향을받지 않습니다. 그래서 [1] + [3,2,0,0]제공합니다 [4,2,0,0].

                  µ      The program is two monadic fs applied in turn; an atop.
L_5.AW+“JQKA”i$€S       Helper function:
                 €        For €ach line:
L                         Get the line Length.
 _5.                      Subtract 5.5 (Numeric literals' decimal parts default to .5)
    A                     Apply Absolute value
     Ḟ                    Floor
      W                   Then Wrap it in an array. "S:AKQT6" gives [1].
        “JQKA”i$          Monadic function: index into the string "JQKA".
                €         Apply ^ over €ach char of the line; [3,2,0,0,0].
       +                  Add the two arrays together; [4,2,0,0,0].
                 S        Sum; 6.
                    S    Main link: Sum all results

여기서 사용해보십시오 .


3

ES6, 107 99 89 바이트

s=>(t=0,[...s].map(c=>t+="JQKA".search(c)+1),s.split`
`.map(l=>t+=(l=l.length-6)^l>>4),t)

2

Pyth, 27 25 24 바이트

sms+a5.5ldshMxL"JQKA"d.z

우리는 각 소송에 대해 개별적으로 값을 계산 한 다음 추가합니다.

  s m                 sum of map lambda d:  (d is a line of input)
      +                 add the
        s a                 floor of the absolute difference between
            5.5               5.5
            l d               and len(d)
          s hM xL           to the sum of the indices each incremented by one
                  "JQKA"      of each char in d in the string "JQKA"
                  d
      .z

테스트 스위트 .


1

망막, 77 59 바이트

T`AKQJTd`5-1
:(.){0,3}(.)?
$#1$#1$#2 3$0
\S
$0$*1
+`1 1

1

라인 / 라인 쌍으로 설명 :

  • 첫 번째 줄에서 chars AKQJT987655432를 로 변환 합니다 5432111111111. 이것은 모든 소송에 대해 합계가 있음을 의미합니다. 0 1 2 3 4 5 6 7 ...이 소송에 카드가 있다면 +3 +1 -1 -3 -4 -4 -4 -4 ..., 정확한 점수에서 합산됩니다.
  • 2 번과 3 번 줄에서이 문제를 해결하기 위해 모든 줄에 3을 더하고 공백 전에 빼는 값을 더합니다. 이 빼기 값은 최대 3의 카드 길이의 두 배이며, 최소 4 개의 카드가 있으면 1이 더 깁니다.
  • 4 행과 5 행에서 구분 기호 공간을 제외한 다른 모든 항목을 삭제하여 숫자를 단항으로 변환합니다.
  • 라인 6과 7에서 단항 뺄셈을합니다.
  • 8 행에서의 수를 세어 1결과를 제공합니다.

여기에서 온라인으로 사용해보십시오.



1

Stax , 18 바이트

½Γ}♣▓="pì∩û╨▐M↨}╚-

지금까지 가장 짧은 대답, 젤리를 물리 쳤습니다 (곧 패배 할 것으로 예상되지만 ...)

온라인으로 실행하고 디버그하십시오!

설명

압축을 푼 버전을 사용하여 설명합니다.

LZF{"JQKA"I^+i5-:++F5+
L                         Collect input in a list (if this is not needed, we can yet save another byte)
 Z                        Put a zero under the top of the stack, used as the accumulator
  F                       Loop for every suit
   {               F      Calculate the "score" for the string describing the suit
    "JQKA"I^              Find the 1-based index of current character in "JQKA", 0 for not found
            +             Add to the accumulator
             i5-:+        Subtract 5 from the current 0-based index, and take the sign
                  +       Add to the accumulator
                    5+    Add 5 extra points for each suit

이것은 번역에 의해 달성됩니다

  • 한 벌의 네 번째 카드 이후의 모든 카드는 1 포인트를줍니다. 6 개의 하트가 있다면 2 점을 얻습니다.
  • 카드가 2 장 밖에없는 슈트는 1 포인트를줍니다 (이것은 더블 톤입니다). 1 장의 카드 만 있으면 2 점을받습니다 (이것은 싱글 톤입니다). 특정 소송에 카드가 없으면 3 점을 얻습니다 (이것은 무효입니다).

  • 한 벌마다 3 점을 더받습니다
  • 한 벌의 네 번째 앞의 각 카드는 -1 점을주고, 네 번째 이후의 각 카드는 1 점을주고 네 번째 카드는 0 점을줍니다.

그런 다음 signum 함수의 속성을 사용할 수 있습니다.

이렇게하면 몇 바이트를 절약하는 카드 수를 명시 적으로 처리하지 않아도됩니다.

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