Мостові підрахунки рук


13

Однією з речей, яка робить контрактний міст дуже цікавим, є його дуже складна "штучна" мета-гра. Ця система забиття рук - це невелика її частина.

Брідж - карткова гра. Кожен гравець отримує руку з 13 карт, і гра починається з торгів . У торгах визначається, як грає решта гри, і тому її важлива частина. Для того, щоб ви та ваш партнер не зробили ставку занадто високою (або занадто низькою), ця система штучного балу була розроблена, щоб сказати вам, наскільки хороша ваша рука.

Оцінка балів

Ось зразок руки:

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

S, H, D, C представляють костюми (лопатки, сердечки, алмази і клуби), а решта - картки в цих костюмах. Отже, ця рука має пікову королеву (Q), пікову королю (K), десять піків (T), п’ять лопат, домкрат сердець, сім сердець тощо.

Система балів працює наступним чином:

  • Ви отримуєте 4 бали за кожний туз (A), 3 бали за кожного короля (K), 2 бали за кожну королеву (Q) та 1 бал за кожен джек (J). Жодна інша картка не дає балів.
  • Кожна картка після четвертої у костюмі дає вам 1 бал. Тож якщо у вас шість сердець, ви отримаєте 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 байт

Дякую @Dennis за -3 байти!

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

Пояснення лініями / парами рядків:

  • У першому рядку ми перетворюємо символи AKQJT987655432в 5432111111111. Це означає, що за кожний костюм у нас є сума. Якщо у нас є 0 1 2 3 4 5 6 7 ...картки в цьому костюмі, сума знімається +3 +1 -1 -3 -4 -4 -4 -4 ...з правильної оцінки.
  • У рядках 2 і 3 для виправлення цього додаємо 3 до кожного рядка, а перед пробілом додаємо значення, які ми віднімемо. Це віднімане значення вдвічі перевищує довжину карт з максимумом 3 та ще 1, якщо є щонайменше 4 картки.
  • У рядках 4 і 5 ми перетворюємо цифри в одинарне випадання всього іншого, крім місця розділення.
  • У рядках 6 та 7 ми робимо одинарне віднімання.
  • У рядку 8 ми підраховуємо 1«s», що дає результат.

Спробуйте його онлайн тут.



1

Стакс , 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 бал. Тож якщо у вас шість сердець, ви отримаєте 2 бали.
  • Костюм, де у вас є лише 2 картки, дає вам 1 бал (це дубльтон). Костюм, у якого у вас всього 1 картка, дає 2 бали (це сингл). Якщо у вас немає карт у певному костюмі, ви отримуєте 3 бали (це порожнеча).

До

  • Наберіть 3 додаткові бали за кожен костюм
  • Кожна карта перед четвертою в костюмі дає вам -1 бал, кожна картка після четвертої дає вам 1 бал, четверта карта отримує 0 балів.

Тоді ми можемо скористатися властивістю функції signum.

Цим ми можемо уникнути явного поводження з кількістю карт, економлячи кілька байт.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.