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
виберіть максимум та роздрукуйте.