Scoring Tangan Jembatan

13

Salah satu hal yang membuat jembatan kontrak menjadi sangat menarik adalah permainan meta "buatan" yang sangat rumit. Sistem penilaian tangan ini adalah bagian kecil darinya.

Bridge adalah permainan kartu pengambilan trik. Setiap pemain mendapatkan 13 kartu, dan permainan dimulai dengan penawaran . Penawaran menentukan bagaimana sisa permainan dimainkan, dan juga merupakan bagian penting dari itu. Untuk memastikan bahwa Anda dan pasangan Anda tidak menawar terlalu tinggi (atau terlalu rendah), sistem penilaian buatan ini dikembangkan untuk memberi tahu Anda sebaik apa tangan Anda.

Mencetak gol

Inilah contoh tangan:

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

S, H, D, C mewakili jas (sekop, hati, berlian, dan pentung) dan sisanya adalah kartu dalam jas itu. Jadi tangan ini memiliki ratu sekop (Q), raja sekop (K), sepuluh sekop (T), lima sekop, jack hati, tujuh hati, dll.

Sistem penilaian bekerja sebagai berikut:

  • Anda mendapatkan 4 poin untuk setiap kartu as (A) yang Anda miliki, 3 poin untuk setiap raja (K), 2 poin untuk setiap ratu (Q) dan 1 poin untuk setiap jack (J). Tidak ada kartu lain yang memberikan poin.
  • Setiap kartu setelah kartu keempat dalam setelan memberi Anda 1 poin. Jadi, jika Anda memiliki enam hati, Anda akan mendapatkan 2 poin.
  • Setelan yang hanya berisi 2 kartu memberi Anda 1 poin (ini adalah doubleton). Setelan yang hanya memiliki 1 kartu memberi Anda 2 poin (ini singleton). Jika Anda tidak memiliki kartu dalam setelan tertentu, Anda mendapatkan 3 poin (ini batal). (Biasanya ini hanya dihitung setelah Anda menyetujui gugatan dengan pasangan Anda, tapi saya termasuk mereka untuk membuat tantangan lebih menarik.)

Jadi, kartu di atas memiliki 13 poin.

Tantangan

Diberi pegangan tangan dalam format yang ditunjukkan di atas, hitung berapa banyak titik yang dimiliki tangan itu. Jas akan selalu terdaftar dalam urutan sekop, hati, berlian dan klub, dan kartu akan selalu diurutkan dalam urutan A, K, Q, J, T, 9 - 2.

Input dan Output Sampel

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

Ini adalah , jadi kode terpendek dalam byte menang.

sebuah spaghetto
sumber

Jawaban:

4

Jelly, 27 25 21 byte

Terima kasih @Dennis untuk -3 byte!

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

Ini mengambil input sebagai daftar baris. Untuk mengambil input sebagai string multiline, awali a ṣ⁷µ.

Membuat tabel poin frekuensi:

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

kita dapat melihat bahwa mereka sama dengan abs(c-3.5)-.5, di mana c adalah jumlah kartu. Karena setiap baris berisi dua karakter tambahan, dan jumlah poin selalu berupa bilangan bulat, ini adalah di floor(abs(l-5.5))mana l adalah panjang garis.

Perhatikan bahwa indeks Jelly berbasis 1, dan juga perilaku fungsi vektor pada dimensi yang tidak cocok: elemen tambahan dari daftar yang lebih panjang tidak terpengaruh. Jadi [1] + [3,2,0,0]memberi [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

Coba di sini .

lirtosiast
sumber
3

ES6, 107 99 89 byte

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

Pyth, 27 25 24 byte

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

Kami menghitung nilai secara terpisah untuk setiap setelan, lalu menambahkannya.

  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

Suite uji .

lirtosiast
sumber
1

Retina, 77 59 byte

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

1

Penjelasan oleh garis / pasangan garis:

  • Di baris pertama kami mengonversi karakter AKQJT987655432ke 5432111111111. Ini berarti untuk setiap setelan kami memiliki jumlah. Jika kami memiliki 0 1 2 3 4 5 6 7 ...kartu dalam gugatan ini, jumlah dimatikan +3 +1 -1 -3 -4 -4 -4 -4 ...dari skor yang benar.
  • Pada baris 2 dan 3 untuk memperbaikinya, kami menambahkan 3 untuk setiap baris dan sebelum spasi kami menambahkan nilai yang akan kami kurangi. Nilai yang dikurangi ini adalah dua kali panjang kartu dengan maksimal 3, dan 1 lagi jika setidaknya ada 4 kartu.
  • Pada baris 4 dan 5 kita mengonversi digit menjadi unary menjatuhkan yang lainnya kecuali ruang pemisah.
  • Di baris 6 dan 7 kita melakukan pengurangan unary.
  • Pada baris 8 kita menghitung 1's yang memberikan hasilnya.

Cobalah online di sini.

randomra
sumber
1

Stax , 18 byte

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

Jawaban terpendek sejauh ini, mengalahkan Jelly (meskipun saya berharap akan segera dikalahkan ...)

Jalankan dan debug online!

Penjelasan

Gunakan versi yang belum dibongkar untuk menjelaskan.

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

Ini dicapai dengan menerjemahkan

  • Setiap kartu setelah kartu keempat dalam setelan memberi Anda 1 poin. Jadi, jika Anda memiliki enam hati, Anda akan mendapatkan 2 poin.
  • Setelan yang hanya berisi 2 kartu memberi Anda 1 poin (ini adalah doubleton). Setelan yang hanya memiliki 1 kartu memberi Anda 2 poin (ini singleton). Jika Anda tidak memiliki kartu dalam setelan tertentu, Anda mendapatkan 3 poin (ini batal).

Untuk

  • Skor 3 poin ekstra untuk setiap suit
  • Setiap kartu sebelum kartu keempat memberi Anda -1 poin, setiap kartu setelah kartu keempat memberi Anda 1 poin, kartu keempat mendapat skor 0.

Kemudian kita dapat menggunakan properti dari fungsi signum.

Dengan melakukan ini kita dapat menghindari penanganan eksplisit jumlah kartu yang menyimpan beberapa byte.

Weijun Zhou
sumber