Pyth, 73 байти
eo_S+*-5l@\AN}SPMJ+NZSM.:+\AT5+-4l{eMJlM.gPkJ-sM*=T+`M}2Tc4"JQKA""hscd"=Zc
Це досить жахливо. Розбір карт, сортування значень, ... Все займає стільки символів. Але підхід цікавий.
Спробуйте в Інтернеті: Демонстрація або Тестовий набір
Пояснення:
Я генерую всі 52 картки, виймаю чотири карти введення, генерую за кожну карту (оцінка руки) та роздруковую карту з максимальним балом.
Оцінка трохи дивна. Якщо я порівняю оцінку двох абсолютно різних рук, це може вибрати неправильного переможця. Наприклад, пряма людина била 4 тузи. Але це працює, якщо перші 4 карти однакові в обох руках. І моя обчислена оцінка фактично не значення, а перелік значень:
- G: Спочатку я групую 5 карток за рангом і беру довжини:
5h 5d 6c 5s Jd -> [3, 1, 1]
- F: Тоді я додаю до цього списку 4 мінус кількість різних наборів.
Flush -> 3додається,not flush -> 2/1/0 додає.
- S: Додайте інше число.
0якщо це не пряма, 4якщо вона пряма A2345, або 5якщо це вища пряма.
Ці списки з 4-7 чисел сортуються у порядку зменшення та вибирається список з максимальним значенням.
Чому це працює? Тут ви бачите можливі конфігурації для всіх типів. Буква поруч із цифрами повідомляє, за яким правилом це число генерується.
- Прямий рум'янець:
[5S, 3F, 1G, 1G, 1G, 1G, 1G]або[4S, 3F, 1G, 1G, 1G, 1G, 1G]
- Чотири з роду:
[4G, 1G, 0F, 0S]
- Повний будинок:
[3G, 2G, 1F, 0S]або[3G, 2G, 0F, 0S]
- Промивання:
[3F, 1G, 1G, 1G, 1G, 1G, 0S]
- Straight:
[5S, 2F, 1G, 1G, 1G, 1G, 1G], [5S, 1F, 1G, 1G, 1G, 1G, 1G], [5S, 1G, 1G, 1G, 1G, 1G, 0F], [4S, 2F, 1G, 1G, 1G, 1G, 1G], [4S, 1F, 1G, 1G, 1G, 1G, 1G],[4S, 1G, 1G, 1G, 1G, 1G, 0F]
- Три види:
[3G, 1G, 1G, 1F, 0S],[3G, 1G, 1G, 0F, 0S]
- Дві пари
[2G, 2G, 2F, 1G, 0S], [2G, 2G, 1F, 1G, 0S],[2G, 2G, 1G, 0F, 0S]
- Одна пара:
[2G, 2F, 1G, 1G, 1G, 0S], [2G, 1G, 1G, 1G, 1F, 0S],[2G, 1G, 1G, 1G, 0F, 0S]
- Старша карта:
[2F, 1G, 1G, 1G, 1G, 1G, 0S], [1F, 1G, 1G, 1G, 1G, 1G, 0S],[1G, 1G, 1G, 1G, 1G, 0S, 0F]
Pyth порівнює списки по елементу. Тож очевидно, що прямий флеш завжди буде бити четвірок. Більшість типових правил покеру очевидні в цих списках. Деякі здаються конфліктними.
- Прямий переможе проти "Чотирьох" або "Повного дому": не проблема. Якщо у вас є шанс придбати Чотири з роду / Повний будинок з річковою карткою, тоді ви не можете одночасно дістатися до прямої (оскільки у вас вже є 2 або 3 різних апартаменти).
- Прямий переможе проти флеш. Якщо ви можете доїхати до флеш і прямо з річковою картою, то ви також можете досягти прямого флеша. А прямий флеш має кращу оцінку, ніж прямий та флеш.
- Одна пара
[2G, 2F, 1G, 1G, 1G, 0S] виграє проти деяких двох парних рук. Також ніяких проблем. Якщо ви отримаєте дві пари з річковою карткою, то у вас була принаймні одна пара до річки. Але це означає, що ви можете вдосконалитись до трьох з роду, що краще. Тож дві пари насправді ніколи не будуть відповіддю.
- Висока карта
[2F, 1G, 1G, 1G, 1G, 1G, 0S]виграє проти деяких рук однієї пари. Якщо це найкращий результат, який ви можете досягти, перед річкою у вас буде 3 карти одного набору та одна карта іншого набору. Але тоді ви можете вибрати карту з одним із цих двох наборів та зі значенням, яке вже з’являється, і ви закінчитеся з балом [2F, 2G, ...], що також краще.
Таким чином, це вибирає правильний тип рішення. Але як мені отримати найкращу однопарну (з 4 можливостей), як вибрати найкращу пряму, ...? Тому що два різні однопарні рішення можуть мати однаковий бал.
Це просто. Pyth гарантує стабільне сортування (при взятті максимуму). Тому я просто генерую картки в порядку 2h 2s 2c 2d 3h 3s ... Ad. Тож карта з найвищим значенням автоматично буде максимальною.
Деталі реалізації
=Zcрозбиває рядок введення і зберігає список карт в Z.
=T+`M}2Tc4"JQKA"формує список рангів ['2', ..., '10', 'J', 'Q', 'K', 'A']і зберігає їх у T. -sM*T..."hscd"Zгенерує кожну комбінацію рангів із наборами та вилучає картки Z.
o...упорядковує ці картки, що залишилися, за lM.gPkJдовжиною груп рангів, +-4l{eMJlMдодає 4 - довжину (сюїти), +*-5l@\AN}SPMJ+NZSM.:+\AT5додає 0/4/5 залежно від набору (генеруйте кожну підрядку довжиною 5 "A" + T, перевірте, чи рука один з них (вимагає сортування від руки та сортування всіх підмножин), помноживши на 5 - число "A" s у картці), _Sсортує список за зменшенням.
e виберіть максимум та роздрукуйте.