Мост Ручной скоринг


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 очко (это дублет). Костюм, в котором у вас всего одна карта, дает вам 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, где с является количеством карт. Поскольку каждая строка содержит два дополнительных символа, а количество точек всегда является целым числом, 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

Retina, 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что дает результат.

Попробуйте это онлайн здесь.



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 очко. Так что если у вас шесть сердец, вы получите 2 очка.
  • Костюм, в котором у вас только 2 карты, дает вам 1 очко (это дублет). Костюм, в котором у вас всего одна карта, дает вам 2 очка (это синглтон). Если у вас нет карт определенной масти, вы получаете 3 очка (это пустота).

к

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

Тогда мы можем использовать свойство функции signum.

Делая это, мы можем избежать явной обработки количества карточек, экономя несколько байтов.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.