Бадугі, хто виграє?


9

Натхненний цим викликом і пов'язаний з цим .

Фон

Badugi [bæduːɡiː] - варіант гри в покер з низьким балом.

Всесвітній Кубок Pokerstars з онлайн-покеру в $ 1К розпочинається протягом 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-карткової, ймовірно, вона має дві картки, але якщо ні одна - це 1-картка.

  • Найкращою можливою рукою є рука з 4 картками 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 2hграється рука з 3 картками 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']]розумного?
Ерік Аутгольфер

@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
}

Як не цікаво, як <...>ваш тестовий ремінь перекладається на список рядків? Це якийсь цукор, який говорить, що вміст слід розділити на пробіли?
Джонатан Аллан

@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
)

Вам це потрібно 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обчислює список, який представляє руку.

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


Ви можете зберегти два байта, визначаючи L=lenі замінюючи всі інші входження lenз L.
Джонатан Фрех

Крім того , ви , ймовірно , можете замінити s=set()з s={0}і set(x)&s orзs&set(x)or
Джонатаном Frech
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.