Punktacja ręki brydża

13

Jedną z rzeczy, która sprawia, że ​​most kontraktowy jest bardzo interesujący, jest jego bardzo skomplikowana „sztuczna” meta gra. Ten system punktacji rąk jest jego niewielką częścią.

Bridge to gra karciana polegająca na podejmowaniu lew. Każdy gracz otrzymuje 13 kart, a gra rozpoczyna się od licytacji . Licytacja decyduje o tym, w jaki sposób gra reszta gry, i dlatego jest bardzo ważna. Aby upewnić się, że Ty i Twój partner nie licytujesz zbyt wysoko (lub zbyt nisko), ten sztuczny system punktacji został opracowany, aby powiedzieć Ci, jak dobra jest Twoja ręka.

Punktacja

Oto przykładowa ręka:

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

S, H, D, C reprezentują kolory (pik, kier, karo i trefl), a reszta to karty w tych kolorach. Więc ta ręka ma królową pik (Q), króla pik (K), dziesięć pik (T), pięć pik, walet kier, siedem kier itp.

System punktacji działa w następujący sposób:

  • Otrzymujesz 4 punkty za każdego asa (A), 3 punkty za każdego króla (K), 2 punkty za każdą królową (Q) i 1 punkt za każdego waleta (J). Żadne inne karty nie dają punktów.
  • Każda karta po czwartej w kolorze daje 1 punkt. Więc jeśli masz sześć serc, dostaniesz 2 punkty.
  • Kolor, w którym masz tylko 2 karty, daje 1 punkt (jest to dublet). Kolor, w którym masz tylko 1 kartę, daje 2 punkty (jest to singleton). Jeśli nie masz kart w danym kolorze, dostajesz 3 punkty (jest to nieważne). (Zwykle są one liczone tylko wtedy, gdy uzgodnisz pozew ze swoim partnerem, ale dołączam ich, aby wyzwanie było bardziej interesujące).

Tak więc powyższa ręka ma 13 punktów.

Wyzwanie

Biorąc pod uwagę układ brydża w powyższym formacie, obliczyć, ile punktów ma układ. Kolory zawsze będą wymienione w kolejności pik, kier, karo i trefl, a karty zawsze będą sortowane w kolejności A, K, Q, J, T, 9 - 2.

Przykładowe wejścia i wyjścia

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

To jest , więc wygrywa najkrótszy kod w bajtach.

spaghetto
źródło

Odpowiedzi:

4

Galaretka, 27 25 21 bajtów

Dzięki @Dennis za -3 bajty!

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

Pobiera to dane wejściowe jako listę linii. Aby wziąć dane wejściowe jako ciąg wielowierszowy, należy wstępnie wstawić a ṣ⁷µ.

Sporządzanie tabeli punktów częstotliwości:

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

widzimy, że są równe abs(c-3.5)-.5, gdzie c jest liczbą kart. Ponieważ każda linia zawiera dwa dodatkowe znaki, a liczba punktów jest zawsze liczbą całkowitą, floor(abs(l-5.5))tutaj l jest długością linii.

Zauważ, że indeksy Jelly są oparte na 1, a także zachowanie wektoryzowanych funkcji w niedopasowanych wymiarach: nie ma to wpływu na dodatkowe elementy dłuższej listy. Tak [1] + [3,2,0,0]daje [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

Wypróbuj tutaj .

lirtosiast
źródło
3

ES6, 107 99 89 bajtów

s=>(t=0,[...s].map(c=>t+="JQKA".search(c)+1),s.split`
`.map(l=>t+=(l=l.length-6)^l>>4),t)
Neil
źródło
2

Pyth, 27 25 24 bajtów

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

Wartości obliczamy osobno dla każdego koloru, a następnie dodajemy.

  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

Zestaw testowy .

lirtosiast
źródło
1

Retina, 77 59 bajtów

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

1

Objaśnienie według linii / par linii:

  • W pierwszym wierszu konwertować znaki AKQJT987655432do 5432111111111. Oznacza to, że dla każdego koloru mamy sumę. Jeśli mamy 0 1 2 3 4 5 6 7 ...karty w tym kolorze, suma jest mniejsza +3 +1 -1 -3 -4 -4 -4 -4 ...od prawidłowego wyniku.
  • W wierszach 2 i 3, aby to poprawić, dodajemy 3 do każdej linii i przed spacją dodajemy wartości, które odejmiemy. Ta odejmowana wartość jest dwa razy większa niż długość karty, maksymalnie 3, i 1 więcej, jeśli są co najmniej 4 karty.
  • W wierszach 4 i 5 konwertujemy cyfry na jednoargumentowe upuszczając wszystko inne oprócz spacji separatora.
  • W wierszach 6 i 7 wykonujemy jednoargumentowe odejmowanie.
  • W linii 8 zliczamy te 1, które dają wynik.

Wypróbuj online tutaj.

randomra
źródło
1

Stax , 18 bajtów

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

Najkrótsza jak do tej pory odpowiedź, pokonała Jelly (choć spodziewam się, że wkrótce zostanie pokonana ...)

Uruchom i debuguj online!

Wyjaśnienie

Używa rozpakowanej wersji do wyjaśnienia.

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

Osiąga się to poprzez tłumaczenie

  • Każda karta po czwartej w kolorze daje 1 punkt. Więc jeśli masz sześć serc, dostaniesz 2 punkty.
  • Kolor, w którym masz tylko 2 karty, daje 1 punkt (jest to dublet). Kolor, w którym masz tylko 1 kartę, daje 2 punkty (jest to singleton). Jeśli nie masz kart w danym kolorze, dostajesz 3 punkty (jest to nieważne).

Do

  • Zdobądź 3 dodatkowe punkty za każdy kolor
  • Każda karta przed czwartym w kolorze daje -1 punkt, każda karta po czwartym daje 1 punkt, czwarta karta 0.

Następnie możemy skorzystać z właściwości funkcji signum.

W ten sposób możemy uniknąć jawnej obsługi liczby kart, oszczędzając kilka bajtów.

Weijun Zhou
źródło