Бадуги, кто победит?

9

Вдохновленный этим вызовом и связанный с этим .

Фон

Badugi [bæduːɡiː] - вариант игры в покер с низким уровнем мяча.

Мероприятие $ 1K Pokerstars World Cup по онлайн-покеру начнется в течение 3 часов, и мне нужно знать, насколько хороши мои руки!

В игре используется стандартная колода из 52 карт четырех мастей и тринадцати рангов. Костюмы неупорядочены и должны быть маркированы cdhs; ранги - упорядоченные от высшего Kк низшему A- являются KQJT98765432A. Таким образом, полная колода может быть представлена ​​следующим образом (через пробел):

Kc Kd Kh Ks Qc Qd Qh Qs Jc Jd Jh Js Tc Td Th Ts 9c 9d 9h 9s 8c 8d 8h 8s 7c 7d 7h 7s 6c 6d 6h 6s 5c 5d 5h 5s 4c 4d 4h 4s 3c 3d 3h 3s 2c 2d 2h 2s Ac Ad Ah As 

Каждому игроку сдают по четыре карты из колоды, есть четыре раунда торговли с тремя раундами розыгрыша (у игрока всегда есть четыре карты, у них есть возможность заменять 0-4 своих карт на новые от дилера на каждом из трех раундов розыгрыша).

Если после всех этих раундов все еще активен более одного игрока, происходит вскрытие, после чего сильные руки выигрывают ставки.

В игре играют с низким шаром, поэтому выигрывает самая низкая рука, и, как уже упоминалось выше A(туз), низка. Кроме того, ранжирование рук отличается от других видов покера, и может быть несколько запутанным для начинающих.

Разыгрываемая «рука» - это комбинация с наименьшим рейтингом, составленная из наибольшего количества возможных карт как «вне масти» (все разные масти), так и из карт «вне ранга» (все разные ранги) (из четырех удерживаемых карт) ). То есть: если у вас четыре карты разных мастей и разных рангов, у каждого есть 4-карточная рука (называемая «бадуги»); если у человека нет 4-карточной руки, но есть набор или наборы из трех карт как разных мастей, так и разного ранга, то у каждого есть 3-карточная рука (одна выбирает свою лучшую); если у вас нет ни 4-карточной, ни 3-карточной руки, то, вероятно, у вас есть 2-карточная рука, но если нет, то у 1-карточной руки.

  • Таким образом, лучшая возможная рука - это рука с четырьмя картами 4-3-2-A- самые низкие карты без ранга из четырех разных мастей , которые часто называют «номер 1». Самая слабая возможная рука - это рука с 1 картой, Kи она возможна только при точном удержании Kc Kd Kh Ks.

  • Обратите внимание , что 4c 3h 2c Asэто не «Номера-1», так как 4cи 2cв той же масти, но это является самым сильным из рук 3-карты, 3-2-Aона рисует с другими 3-2-1с (как Kh 3d 2s Ah) и бьет все другие руки 3-карты , но проигрывает всем 4-карточным рукам (которые могут быть такими же слабыми, как и K-Q-J-T).

    • Другая возможная 3-карточная рука, из которой можно сделать 4c 3h 2c Asэто 4-3-A, но она слабее (выше), поэтому не выбрана.
  • Точно так же 8d 6h 3s 2h3-карточная рука разыгрывается как 8-3-2- есть две неконфессиональные комбинации нестандартного размера 3 размера, и 8-3-2она лучше (ниже), чем 8-6-3три (или «трэй») ниже, чем шесть.

Сравнение рук друг с другом следует той же логике - любые 4 карты бьют любые 3 карты, любые 3 карты бьют любые 2 карты, а любые 2 карты бьют любую 1 карту, в то время как руки с одинаковым количеством использованных карт являются по сравнению с их самым высоким рангом до самого низкого (например: 8-4-2удары, 8-5-Aно не любой из 8-4-A, 8-3-2или 7-6-5)

Соревнование:

Учитывая две неупорядоченные коллекции каждой из четырех карт, определите одну (ие), которая выиграет вскрытие Бадуги (укажите обе, если это ничья).

На входе может быть что угодно:

  • одна строка из всех восьми карт, как указано выше (с пробелами или без них), причем левая четверка - одна рука, а правая - другая (с дополнительным разделителем); или список персонажей таким же образом
  • список из двух строк - по одной на руку, или список списков символов таким же образом
  • две отдельные строки или список ввода, по одному на руку
  • карты в руках могут быть уже разделены (так что список списков списков в порядке)

Обратите внимание, однако:

  • карты не могут быть расположены в любом порядке до ввода
  • ... и масти и ранги фиксируются как обозначения символов, указанные здесь. Если ваш язык не поддерживает такие конструкции, просто предложите что-то разумное и спросите, является ли это приемлемой альтернативой, учитывая ваши языковые ограничения.

Выход должен быть

  • отформатированный так же, как ввод или напечатанное представление; или
  • быть один из трех различных и последовательных результатов (например: "left", "right", "both", или 1, 2, 3, и т.д.)

Действительно - до тех пор, пока ясно, какой из двух входов идентифицируется, все должно быть в порядке.

Контрольные примеры

input                      ->  output
                                   (notes)
----------------------------------------------------------------------------
3c 2s 4d Ah - As 3h 2d 4h  ->  3c 2s 4d Ah
                                   (4-card 4-3-2-A beats 3-card 3-2-A)

3c 2s 4d Ah - As 2c 3d 4h  ->  3c 2s 4d Ah - As 2c 3d 4h
                                   (4-card 4-3-2-A draws with 4-card 4-3-2-A)

2d Ac 4h 3c - Kh Ad 9s 2c  ->  Kh Ad 9s 2c
                                   (3-card 4-2-A loses to 4-card K-9-2-A)

Kc Tc Qc Jc - Ac Ad Ah As  ->  Ac Ad Ah As
                                   (1-card T loses to 1-card A)

9c 9h Qc Qh - Qs Kh Jh Kd  ->  Qs Kh Jh Kd
                                   (2-card Q-9 loses to 3-card K-Q-J)

2d 5h 7c 5s - 2h 3c 8d 6c  ->  2d 5h 7c 5s
                                   (3-card 7-5-2 beats 3-card 8-3-2)

3s 6c 2d Js - 6h Jd 3c 2s  ->  6h Jd 3c 2s
                                   (3-card 6-3-2 loses to 4-card J-6-3-2)

Ah 6d 4d Ac - 3h 2c 3s 2s  ->  3h 2c 3s 2s
                                   (2-card 4-A loses to 2-card 3-2)

2h 8h 6h 4h - 6d 2d 5d 8d  ->  2h 8h 6h 4h - 6d 2d 5d 8d
                                   (1-card 2 = 1-card 2)

Это Таким образом, самый короткий код в байтах выигрывает для каждого языка, а самый короткий код в целом выигрывает. Не позволяйте языкам игры в гольф отталкивать вас от представления на других языках и ... получайте удовольствие!

Джонатан Аллан
источник
Что-то вроде [['3c', '2s', '4d', 'Ah'], ['As', '3h', '2d', '4h']]разумного?
Эрик Outgolfer
@EriktheOutgolfer Да - я собирался сказать, я думаю, что вы можете просто добавить Oк фронту.
Джонатан Аллан

Ответы:

2

Perl 6 , 128 байт

{.map({.combinations(1..4).grep({!.join.comb.repeated}).map({-$_,$_».trans('ATK'=>'1BZ')».ord.sort(-*)}).min}).minpairs».key}

Попробуйте онлайн!

Принимает список рук (также более двух), которые представляют собой списки карт, которые похожи на строки Kc. Возвращает индексы рук с наименьшим счетом. Для двух рук это (0)если победит первая рука, (1)если победит вторая рука, и (0, 1)для ничьей.

Разъяснение:

{
    # Map hands to best "played hand".
    .map({
        # Generate all combinations of length 1 to 4.
        .combinations(1..4)
        # Remove hands with repeated characters.
        .grep({!.join.comb.repeated})
        # Map to a cmp-arable representation. This works because
        # lists are compared element-wise. Translate some characters
        # so that ASCII order works. Sort in reverse order so that
        # element-wise comparison will go from highest to lowest.
        .map({ -$_, $_».trans('ATK'=>'1BZ')».ord.sort(-*) })
        # Find best hand.
        .min
    })
    # Return indices of lowest scoring hands. It's a shame that
    # `minpairs` doesn't support a filter like `min`.
    .minpairs».key
}
nwellnhof
источник
Из интереса, как <...>в вашем тестовом жгуте переводится список строк? Это какой-то сахар, который говорит, что содержимое должно быть разбито на пробелы?
Джонатан Аллан
@JonathanAllan Это цитата из слов Перла . Perl 6 поддерживает <a b c>в дополнение к qw(a b c)Perl 5.
nwellnhof
Ну, это мило и игра в гольф сама по себе :)
Джонатан Аллан
2

JavaScript (ES6), 209 202 192 182 181 байт

Сохранено 7 байтов благодаря @Neil

Принимает ввод как массив массивов строк. Возвращает, trueесли выигрывает первая рука, falseесли выигрывает вторая рука, или 2в случае ничьей.

a=>([a,b]=a.map(a=>a.reduce((a,x)=>[...a,...a.map(y=>[x,...y])],[[]]).map(a=>!/(\w).*\1/.test(a)*a.length+a.map(a=>'KQJT98765432A'.search(a[0])+10).sort()).sort().pop()),a==b?2:a>b)

Контрольные примеры

Как?

a => (
  // store the best combination for both hands in a and b respectively
  [a, b] = a.map(a =>
    // compute the powerset of the hand
    a.reduce((a, x) => [...a, ...a.map(y => [x, ...y])], [[]])
    // for each entry:
    .map(a =>
      // invalidate entries that have at least 2 cards of same rank or same value
      !/(\w).*\1/.test(a) *
      // the score of valid entries is based on their length ...
      a.length +
      // ... and their card values, from highest to lowest
      // (we map 'KQJT98765432A' to [10 - 22], so that the resulting
      // strings can be safely sorted in lexicographical order)
      a.map(a => 'KQJT98765432A'.search(a[0]) + 10).sort()
    )
    // keep the best one
    .sort().pop()
  ),
  // compare a with b
  a == b ? 2 : a > b
)
Arnauld
источник
Вам это нужно join?
Нил
1

Желе , 36 байт

ẎŒQȦ;L;Ṗ€Ṣ$
“A+KYTE”yḲONŒPÇ€ṢṪµ€⁼€Ṁ$

Монадическая ссылка принимая список из двух списков символов
- каждый из которых является пространством , отделенным представление стороны (например "Ac 2d 4s 3h") ,
возвращающим список из двух чисел , обозначающих победитель (ы) с 1и любым неудачником с 0
- то есть [1, 0]= левой победу; [0, 1]= правильные победы; [1, 1]= рисовать

Попробуйте онлайн! или посмотрите набор тестов .

Как?

ẎŒQȦ;L;Ṗ€Ṣ$ - Link 1, sortKey: list of lists of numbers representing some cards (see Main)
Ẏ           - flatten into a single list of numbers
 ŒQ         - distinct sieve (1 at first occurrence of anything, 0 at the rest)
   Ȧ        - Any & All? zero if any are 0 or if empty; 1 otherwise (i.e. playable hand?)
     L      - length of input (number of cards in the hand)
    ;       - concatenate
          $ - last two links as a monad:
       Ṗ€   -   pop each (get just the rank portions)
         Ṣ  -   sort (Main's translation & negation of ordinals ensures A>2>3>...>Q>K)
      ;     - concatenate (now we have [isPlayable; nCards; [lowToHighCards]])

“A+KYTE”yḲONŒPÇ€ṢṪµ€⁼€Ṁ$ - Main link: list of lists of characters, hands
                  µ€     - for €ach of the two hands:
“A+KYTE”                 -   literal list of characters "A+KYTE" (compressing doesn't help - lower case would be “£Ḅṁ⁽>» though -- I'll stick with kyte though it's kind of nice.)
        y                -   translate - change As to +s, Ks to Ys and Ts to Es
                         -               note the ranks are now in ordinal order:
                         -               +<2<3<4<5<6<7<8<9<E<J<Q<Y
         Ḳ               -   split at spaces - split the four cards up
          O              -   to ordinals '+'->43, '2'->50, ...
           N             -   negate - effectively reverse the ordering
            ŒP           -   power-set - get all combinations of 0 to 4 cards inclusive
              Ç€         -   call the last link (1) as a monad for €ach such selection
                Ṣ        -   sort these keys
                 Ṫ       -   tail - get (one of) the maximal keys
                         -                       (the key of a best, playable selection)
                       $ - last two links as a monad:
                      Ṁ  -   maximum (the better of the two best, playable selection keys)
                    ⁼€   -   equals? for €ach (1 if the hand is a winner, 0 if not)
Джонатан Аллан
источник
1

Python 3 , 207 204 байта

lambda i,j:L(h(i))-L(h(j))if L(h(i))!=L(h(j))else(h(i)<h(j))-(h(i)>h(j))
L=len
def h(l):s=set();return[x[0]for x in sorted(y.translate({65:49,75:90,84:65})for y in l)if not(s&set(x)or s.update(*x))][::-1]

Попробуйте онлайн!

Сохранено 3 байта благодаря Джонатану Фреху

Возвращает, 1если выигрывает первая рука, -1если выигрывает вторая рука и 0в случае ничьей.

Функция hвычисляет список, который представляет руку.

Лямбда сравнивает два представления руки. Я думаю, что это может быть сокращено, но я хотел вернуть только три значения и не нашел более простой способ сделать сравнение.

jferard
источник
Вы можете сохранить два байта, определяя L=lenи заменяя все остальные вхождения lenс L.
Джонатан Фрех
Кроме того, вы, вероятно, можете заменить s=set()на s={0}и set(x)&s orсs&set(x)or
Джонатан Фрех