Грати в найкращу карту в Ейхре


13

Вхід:

По-перше,
масив з трьох карт, що представляють карти, які грає кожен гравець, відформатованих як

[JD][TH][9S]

Представлення

Jack of Diamonds, 10 of Hearts, and Nine of Spades.

Оскільки ви завжди сидите навпроти свого товариша по команді в Ейхрі, другий елемент представляє гру вашого товариша по команді. Ось TH.

По-друге,
Одиночний Char, String і т. Д., Що представляє костюм козиря у форматі

S, D, C, H

представляючи

Spades, Diamonds, Clubs, Hearts

По-третє, масив з чотирьох карт, що представляють вашу руку, відформатовану як

[KD][JC][QH][AS]

представляючи

King of Diamonds, Jack of Clubs, Queen of Hearts, Ace of Spades

Мета:

З огляду на три входи, виведіть найкращу карту, яку можна додати до відтворених карт, щоб вона відповідала таким критеріям:

  1. Він бере руку, якщо зможе, якщо не випустить найменш цінну карту
  2. Він бере руку, якщо зможе, однак це не буде козирем партнера по команді, якщо це неминуче
  3. Якщо вона може взяти руку, це зробить, використовуючи найменш цінну карту. (Якщо у вас є туз і королева, які можуть виграти руку, ви граєте в королеву).
  4. Будь-які п'єси повинні відповідати вимогам, як того вимагають правила знизу.

Формат виводу типу [JD]

Форматування

A - Ace
K - King
Q - Queen
J - Jack
T - Ten
9 - Nine

H - Hearts
D - Diamonds
S - Spades
C - Clubs

TH, 9D, JD, QH, AD, 9C, TC

Приклади

В: [QD][KD][9C], "C",[AH][JH][QH][9H]

Вийшов: 9H

Причина: Оскільки клуби є козирним, 9С виграє руку, ми не можемо взяти руку, тому ми повинні відкинути нашу найнижчу карту 9H

В: [QD][KD][AD], "H",[AH][JH][QH][9H]

Вийшов: 9H

Причина: Коли сердечні козирі, туз з діамантів в даний час виграє руку, ми можемо козир руці, тому ми повинні використовувати найнижчу карту, ось 9H

В: [QD][KD][TD], "D",[AD][JH][QH][9D]

Вийшов: 9D

Причина: Оскільки алмази є козирним, і ми в даний час виграємо руку, ми повинні грати в 9D, оскільки наш партнер зараз виграє руку, тому ми хочемо грати 9DнаAD

В: [QH][KH][JH], "D",[AD][JD][QH][9D]

Вийшов: QH

Причина: Оскільки алмази є козирним, наші опоненти перемагають з лівим Бауер. JHУ нас є правий бауер, але не можемо його козирувати, тому що QH вів, і ми мусимо слідувати прикладу,QH

В: [QH][KH][JH], "D",[AD][JD][QC][9D]

Вийшов: JD

Причина: Оскільки Алмази є козирем, наші опоненти перемагають з лівим Бауер. JHУ нас є правий бауер, і оскільки у нас немає, Diamondsми можемо натхнути йогоJD

Сильні сторони картки Euchre

Якщо Серця козир:

JH
JD
AH
KH
QH
TH
9H

Дивіться правила Ейхре, якщо ви не знайомі з силою різних карт в Euchre

Оскільки це Code-Golf, найкоротший код виграє!

Хай щастить!


2
Думаю, п’єсу слід описувати тут не за посиланням.
Джонатан Аллан

@JonathanAllan Я думав про це, але це краще описано у посиланні. Напевно, не найкращий виклик для тих, хто незнайомий з грою. Якщо тільки вони не хочуть вчитися на льоту.
jacksonecac

У прикладі з 9Dрезультатом є серця, які є козирями (хоча я не думаю, що це впливає на цей результат).
Джонатан Аллан

@JonathanAllan приємний улов, дякую.
jacksonecac

1
@jacksonecac дякую за проблему, я з нею розважався.
Дейв

Відповіді:


2

Perl - 557 532 511 490 482 384 363

($p,$t,$h)=@ARGV;%L=(H=>D,D=>H,C=>S,S=>C);$B=%L{$t};$_="\]$p$h\[";s/(.$t)/0$1/g;s/J$B/01$B/;s/0J/00/;s/J/R/g;s/9/Z/g;($T,@C)=split/\]\[/,$_;$s=$C[0];$s=~s/.+(.)/$1/;$s=~s/$t/0/;$X=(sort@C[0..2])[0];@M=@C[3..6];@F=(grep{/$s/}@M);@M=@F if@F;$w=(sort@M)[@M-1];push@M,$X;foreach$g(sort@M){$g ne$X?$b=$g:last}$_=$C[1]eq$X||!$b?$w:$b;s/.(..)/$1/;s/Z/9/;s/0|1|R/J/;print

Як це працює

Спробуйте в Інтернеті!

Спочатку він читає аргументи і знаходить костюм лівого бауера (джек такого ж кольору, як і козир) з хеш-пошуком:

($p,$t,$h)=@ARGV;
%L=(H=>D,D=>H,C=>S,S=>C);
$B=%L{$t};

Потім вона об'єднує всі картки в одну рядок і робить деякі заміни, роблячи карти, природно, сортувати у правильному порядку для euchre:

$_="\]$p$h\[";
s/(.$t)/0$1/g; # trump cards start with '0'
s/J$B/01$B/;   # left-bauer's 'J' changes to '01', making it trump
s/0J/00/;      # right-bauer's 'J' changes to '0'
s/J/R/g;       # all other jacks have 'J' changed to 'R'
s/9/Z/g;       # all 9s change to Z
($T,@C)=split/\]\[/,$_;

В кінці цього блоку рядок карт розбивається на дужки, що створює масив усіх карт, де:

  • індекс 0 = головна карта суперника

  • індекс 1 = картка товариша по команді

  • індекс 2 = картка іншого противника

  • індекси 3-6 представляють руку

Костюм ведучого розбирається з першої картки, але костюм змінюється на '0', щоб представляти козир, якщо козир був приведений:

$s=$C[0];
$s=~s/.+(.)/$1/;
$s=~s/$t/0/;

Найкраща гра, яка знаходиться в процесі гри, виявляється шляхом сортування перших трьох карт та отримання першої карти:

$X=(sort@C[0..2])[0];

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

@M=@C[3..6];
@F=(grep{/$s/}@M);
@M=@F if@F;

Карту "викидання" можна знайти, повернувши останню карту в відсортованому масиві відтворюваних карт:

$w=(sort@M)[@M-1];

Найнижча «виграшна» карта, яка може виграти трюк, виявляється додаванням найвищої карти в програмі до масиву відтворюваних карт, сортування масиву та повторення над ним, поки не буде знайдена найвища карта в програванні. "Виграшна" карта - це картка попередньої ітерації:

push@M,$X;
foreach$g(sort@M){$g ne$X?$b=$g:last}

Потім оцінюється правильна гра. Карту "викидання" вибирають, якщо відповідає дійсності будь-яке з наведеного нижче:

  1. Найкраща карта на столі має індекс 1 у неортинованому масиві всіх карт, тобто вона належить нашому товаришеві по команді
  2. Пошук найнижчої "виграшної" картки виявився недійсним, це означає, що найкраща карта нашого суперника вища за всі карти в руці

В іншому випадку повертається картка "виграш":

$_=$C[1]eq$X||!$b?$w:$b;
s/.(..)/$1/; # remove the '0' that indicated trump
s/Z/9/;      # get those 9s back
s/0|1|R/J/;  # fix the jacks
print
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.