Juega la mejor carta en Euchre

13

Entrada:

En primer lugar,
un conjunto de tres cartas que representan las cartas jugadas por cada jugador formateadas como

[JD][TH][9S]

Representando

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

Como siempre te sientas frente a tu compañero de equipo en Euchre, el segundo elemento representa el juego de tu compañero de equipo. Aquí, el TH.

En segundo lugar,
un solo carácter, cadena, etc., que representa el palo de triunfo formateado como

S, D, C, H

representando

Spades, Diamonds, Clubs, Hearts

En tercer lugar, un conjunto de cuatro cartas que representan su mano formateada como

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

representando

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

Objetivo:

Dadas las tres entradas, genera la mejor carta posible para agregar a las cartas que se han jugado de manera que cumpla con los siguientes criterios:

  1. Toma la mano si puede, si no saca la carta menos valiosa
  2. Toma la mano si puede, sin embargo, no derrotará a tu compañero de equipo a menos que sea inevitable
  3. Si puede tomar la mano, lo hace usando la carta menos valiosa. (Si tienes un as y una reina que pueden ganar la mano, juegas con la reina).
  4. Cualquier jugada debe seguir el ejemplo, según lo requerido por las reglas en la parte inferior.

Formato de salida como [JD]

Formateo

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

Ejemplos

En: [QD][KD][9C]` "C"`[AH][JH][QH][9H]

Fuera: 9H

Motivo: Como los clubes son triunfadores, el 9C está ganando la mano, no podemos tomar la mano, por lo que debemos descartar nuestra carta más baja, aquí el 9H

En: [QD][KD][AD]` "H"`[AH][JH][QH][9H]

Fuera: 9H

Motivo: Como los Corazones son triunfadores, el As de Diamantes actualmente está ganando la mano, podemos vencer la mano, por lo que debemos usar nuestra carta más baja, aquí el 9H

En: [QD][KD][TD]` "D"`[AD][JH][QH][9D]

Fuera: 9D

Motivo: Como los diamantes son triunfo y actualmente estamos ganando la mano, deberíamos jugar el 9D porque nuestro compañero actualmente está ganando la mano, por lo que queremos jugar 9DelAD

En: [QH][KH][JH]` "D"`[AD][JD][QH][9D]

Fuera: QH

Motivo: a medida que los diamantes triunfan, nuestros oponentes ganan con el Bower izquierdo. JHTenemos el bower derecho pero no podemos vencerlo porque QH fue liderado y debemos seguir su ejemplo.QH

En: [QH][KH][JH]` "D"`[AD][JD][QC][9D]

Fuera: JD

Motivo: a medida que los diamantes triunfan, nuestros oponentes ganan con el Bower izquierdo. JHTenemos el bower derecho y, como no Diamondstenemos, podemos vencerlo con el Bower .JD

Fortalezas de la tarjeta Euchre

Si Corazones es triunfo:

JH
JD
AH
KH
QH
TH
9H

Vea las Reglas de Euchre si no está familiarizado con la fortaleza de las diferentes cartas en Euchre

Como se trata de Code-Golf, ¡el código más corto gana!

¡Buena suerte y diviertete!

jacksonecac
fuente
2
Creo que la obra debería describirse aquí, no con un enlace.
Jonathan Allan el
@ JonathanAllan Lo pensé, pero está mejor descrito en el enlace. Probablemente no sea el mejor desafío para aquellos que no están familiarizados con el juego. A menos que quieran aprender sobre la marcha.
jacksonecac
El ejemplo con 9Dcomo resultado tiene corazones establecidos como triunfos (aunque no creo que afecte este resultado).
Jonathan Allan
@ JonathanAllan buena captura, gracias.
jacksonecac
1
@jacksonecac gracias por el problema, me divertí mucho con él.
Dave

Respuestas:

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

Cómo funciona

Pruébalo en línea!

Primero lee args y encuentra el traje de bauer izquierdo (jack del mismo color que el trump) con una búsqueda de hash:

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

Luego combina todas las tarjetas en una cadena y realiza algunos reemplazos, haciendo que las tarjetas se ordenen naturalmente en el orden correcto para 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/\]\[/,$_;

Al final de este bloque, la cadena de la tarjeta se divide en los corchetes, lo que crea una matriz de todas las tarjetas donde:

  • índice 0 = carta principal del oponente

  • índice 1 = tarjeta de compañero de equipo

  • índice 2 = otra carta del oponente

  • los índices 3-6 representan la mano

El palo principal se analiza desde la primera carta, pero el palo cambia a '0' para representar el triunfo si el triunfo fue liderado:

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

La mejor carta en juego se encuentra ordenando las tres primeras cartas y recuperando la primera carta:

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

Se encuentran las cartas jugables. Si alguna carta en la mano coincide con el palo principal, solo quedan esas cartas. De lo contrario, todas las cartas se consideran jugables:

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

La carta 'desechable' se encuentra al devolver la última carta en el conjunto ordenado de cartas jugables:

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

La carta 'ganadora' más baja que puede ganar el truco se encuentra agregando la carta más alta en juego a la matriz de cartas jugables, clasificando la matriz e iterando sobre ella hasta encontrar la carta en juego más alta. La carta 'ganadora' es la carta de la iteración anterior:

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

Luego se evalúa la jugada correcta. La tarjeta 'desechable' se elige si se cumple alguna de las siguientes condiciones:

  1. La mejor carta de la mesa tiene un índice de 1 en el conjunto no ordenado de todas las cartas, lo que significa que pertenece a nuestro compañero de equipo.
  2. La búsqueda de la carta 'ganadora' más baja resultó nula, lo que significa que la mejor carta de nuestro oponente es más alta que todas las cartas en la mano

De lo contrario, se devuelve la tarjeta 'ganadora':

$_=$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
fuente