Jogue o melhor cartão em Euchre

13

Entrada:

Primeiramente
Um conjunto de três cartas representando as cartas jogadas por cada jogador formatado como

[JD][TH][9S]

Representando

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

Como você sempre se senta em frente ao seu companheiro de equipe no Euchre, o segundo elemento representa o jogo do seu companheiro de equipe. Aqui, o TH.

Em segundo lugar,
um único caractere, string etc. representando o trunfo formatado como

S, D, C, H

representando

Spades, Diamonds, Clubs, Hearts

Terceiro, uma série de quatro cartas representando sua mão formatada como

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

representando

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

Objetivo:

Dadas as três entradas, imprima a melhor placa possível para adicionar às cartas que foram jogadas, de modo que atenda aos seguintes critérios:

  1. É preciso a mão, se puder, se não emitir o cartão menos valioso
  2. É preciso a mão, se puder, no entanto, não trunfo o seu companheiro de equipe, a menos que seja inevitável
  3. Se conseguir pegar a mão, use o cartão menos valioso. (Se você tem um ás e uma dama que pode ganhar a mão, você joga a dama).
  4. Qualquer jogada deve seguir o exemplo, conforme exigido pelas regras na parte inferior.

Formato de saída como [JD]

Formatação

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

Exemplos

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

Fora: 9H

Razão: Como os clubes são trunfos, o 9C está ganhando a mão, não podemos pegá-la, portanto devemos descartar nossa carta mais baixa. 9H

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

Fora: 9H

Razão: Como os corações são trunfos, o Ás de Diamantes está atualmente ganhando a mão, somos capazes de trunfar a mão, portanto, devemos usar nossa carta mais baixa. 9H

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

Fora: 9D

Razão: Como os diamantes são trunfos e atualmente estamos ganhando a mão, devemos jogar o 9D porque nosso parceiro está ganhando a mão no momento, então queremos jogar o 9DoverAD

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

Fora: QH

Razão: Como os diamantes são trunfos, nossos oponentes estão ganhando com o JHcaramanchão esquerdo.QH

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

Fora: JD

Razão: Como os diamantes são trunfos, nossos oponentes estão ganhando com o JHcaramanchão esquerdo. Nós temos o caramanchão direito e, como não Diamondstemos, podemos trunfá-lo com oJD

Pontos fortes do cartão Euchre

Se Hearts for trunfo:

JH
JD
AH
KH
QH
TH
9H

Consulte as Regras do Euchre se você não estiver familiarizado com a força de diferentes cartões no Euchre.

Como este é o Code-Golf, o código mais curto vence!

Boa sorte e divirta-se!

jacksonecac
fonte
2
Eu acho que a peça deve ser descrita aqui, não com um link.
Jonathan Allan
@ JonathanAllan Eu pensei sobre isso, mas é melhor descrito no link. Provavelmente não é o melhor desafio para aqueles que não estão familiarizados com o jogo. A menos que eles queiram aprender rapidamente.
jacksonecac
O exemplo com 9Dcomo resultado tem corações definidos como trunfos (embora eu não ache que isso afeta esse resultado).
Jonathan Allan
@JonathanAllan boa captura, obrigado.
jacksonecac
1
@jacksonecac obrigado pelo problema, eu me diverti com ele.
Dave

Respostas:

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

Como funciona

Experimente online!

Primeiro, ele lê args e encontra o naipe do bauer esquerdo (macaco da mesma cor que o trunfo) com uma pesquisa de hash:

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

Em seguida, combina todos os cartões em uma única sequência e faz algumas substituições, fazendo com que os cartões sejam classificados naturalmente na ordem correta para o 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/\]\[/,$_;

No final deste bloco, a sequência de cartões é dividida entre colchetes, o que cria uma matriz de todos os cartões em que:

  • índice 0 = cartão principal do oponente

  • índice 1 = cartão do companheiro

  • índice 2 = carta do outro oponente

  • os índices 3-6 representam a mão

O naipe principal é analisado a partir da primeira carta, mas o naipe muda para '0' para representar trunfo se o trunfo foi liderado:

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

A melhor carta em jogo é encontrada classificando as três primeiras cartas e recuperando a primeira carta:

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

As cartas jogáveis ​​são encontradas. Se alguma das cartas na mão corresponder ao naipe principal, somente essas cartas permanecerão. Caso contrário, todas as cartas são consideradas jogáveis:

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

A carta 'descartável' é encontrada retornando a última carta no conjunto ordenado de cartas jogáveis:

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

A menor carta 'vencedora' que pode vencer o truque é encontrada adicionando a carta mais alta em jogo à matriz de cartas jogáveis, classificando a matriz e repetindo-a até encontrar a carta mais alta em jogo. O cartão 'vencedor' é o cartão da iteração anterior:

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

A jogada correta é então avaliada. A carta 'descartável' é escolhida se alguma das seguintes situações for verdadeira:

  1. A melhor carta da mesa tem um índice de 1 na matriz não classificada de todas as cartas, o que significa que pertence ao nosso companheiro de equipe
  2. A busca pela menor carta 'vencedora' surgiu nula, o que significa que a melhor carta do nosso oponente é maior que todas as cartas da mão

Caso contrário, o cartão 'vencedor' é retornado:

$_=$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
Dave
fonte