Играйте в лучшую карту в Euchre


13

Входные данные:

Во-первых,
массив из трех карт, представляющих карты, сыгранные каждым игроком, отформатированные как

[JD][TH][9S]

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

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

Поскольку вы всегда сидите напротив своего напарника в Euchre, второй элемент представляет игру вашего напарника. Здесь TH.

Во-вторых,
A Single 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

Причина: поскольку козыри являются козырными, 9C выигрывает, мы не можем взять руку, поэтому мы должны сбросить самую низкую карту, здесь 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 Card

Если червы козыри

JH
JD
AH
KH
QH
TH
9H

Смотрите правила Euchre, если вы не знакомы с силой различных карт в 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

Как это устроено

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

Сначала он читает args и находит костюм левого Бауэра (домкрат того же цвета, что и Трамп) с поиском хеша:

($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.