在Euchre玩最好的卡


13

输入:

首先
,由三张纸牌组成的数组代表每个玩家所玩的纸牌,格式如下

[JD][TH][9S]

代表

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

由于您总是在Euchre中与队友面对面,所以第二个元素代表队友的表现。在这里TH

其次
,代表王牌西装的单个字符,字符串等格式如下

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,因为我们的合作伙伴目前正在赢得手,所以我们要发挥9DAD

在:[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中的其他卡片强度,请参阅Euchre规则

因为这是Code-Golf,所以最短的代码胜出!

祝好运并玩得开心点!


2
我认为这出戏应该在这里不加链接描述。
乔纳森·艾伦

@JonathanAllan我曾考虑过,但在链接中有更好的描述。对于那些不熟悉游戏的人来说,这可能不是最好的挑战。除非他们想即时学习。
jacksonecac

结果示例9D将心设置为王牌(尽管我认为它不会影响该结果)。
乔纳森·艾伦

@JonathanAllan很好,谢谢。
jacksonecac

1
@jacksonecac感谢您的问题,我很开心。
戴夫

Answers:


2

Perl- 557532511490490482384 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};

然后,它将所有卡组合成一个字符串并进行一些替换,从而使卡自然以正确的顺序进行排序:

$_="\]$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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.