Mainkan Kartu Terbaik di Euchre

13

Memasukkan:

Pertama
Array terdiri dari tiga kartu yang mewakili kartu yang dimainkan oleh setiap pemain yang diformat seperti

[JD][TH][9S]

Mewakili

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

Karena Anda selalu duduk berhadapan dengan rekan setim Anda di Euchre, elemen kedua mewakili permainan rekan setim Anda. Di sini, itu TH.

Kedua
A Single Char, String, dll mewakili setelan truf diformat seperti

S, D, C, H

mewakili

Spades, Diamonds, Clubs, Hearts

Ketiga, susunan empat kartu yang mewakili bentuk tangan Anda

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

mewakili

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

Objektif:

Diberikan tiga input, output kartu terbaik untuk ditambahkan ke kartu yang telah dimainkan sehingga memenuhi kriteria berikut:

  1. Dibutuhkan tangan jika bisa, jika tidak mengeluarkan kartu yang paling tidak berharga
  2. Dibutuhkan bantuan jika bisa, namun itu tidak akan mengalahkan rekan setim Anda kecuali jika hal itu tidak dapat dihindari
  3. Jika dapat mengambil tangan, ia melakukannya dengan menggunakan kartu yang paling tidak berharga. (Jika Anda memiliki kartu As dan seorang ratu yang dapat memenangkan tangan, Anda bermain ratu).
  4. Setiap permainan harus mengikuti seperti yang dipersyaratkan oleh aturan di bagian bawah.

Format keluaran seperti [JD]

Memformat

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

Contohnya

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

Di luar: 9H

Alasan: Karena klub adalah kartu truf, 9C memenangkan kartu, kami tidak dapat mengambil kartu sehingga kami harus membuang kartu terendah kami, di sini 9H

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

Di luar: 9H

Alasan: Karena Hati adalah truf, Ace of Diamonds saat ini memenangkan tangan, kita dapat mengalahkan tangan sehingga kita harus menggunakan kartu terendah kita, di sini 9H

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

Di luar: 9D

Alasan: Karena berlian adalah truf dan kami saat ini memenangkan tangan, kami harus memainkan 9D karena mitra kami saat ini memenangkan tangan, jadi kami ingin memainkan 9Dlebih dari yangAD

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

Di luar: QH

Alasan: Karena Berlian adalah truf, lawan kita menang dengan Bower kiri. JHKita memiliki bower yang tepat tetapi tidak dapat mengalahkannya karena QH dipimpin dan kita harus mengikuti,QH

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

Di luar: JD

Alasan: Karena Berlian adalah truf, lawan kita menang dengan Bower kiri. JHKita memiliki bower yang tepat dan karena kita tidak punya, Diamondskita dapat mengalahkannya denganJD

Kekuatan Kartu Euchre

Jika Hati adalah truf:

JH
JD
AH
KH
QH
TH
9H

Lihat Aturan Euchre jika Anda tidak terbiasa dengan kekuatan kartu yang berbeda di Euchre

Karena ini adalah Code-Golf, kode terpendek akan menang!

Semoga berhasil dan selamat bersenang - senang!

jacksonecac
sumber
2
Saya pikir permainan harus dijelaskan di sini bukan dengan tautan.
Jonathan Allan
@ Jonathanathan Allan Saya memikirkannya, tetapi lebih baik dijelaskan di tautan. Mungkin bukan tantangan terbaik bagi mereka yang tidak terbiasa dengan permainan. Kecuali mereka ingin belajar dengan cepat.
jacksonecac
Contoh dengan 9Dhasilnya telah menetapkan hati sebagai kartu truf (meskipun saya tidak berpikir itu mempengaruhi hasil ini).
Jonathan Allan
@ Jonathan Allan tangkapan yang bagus, terima kasih.
jacksonecac
1
@jacksonecac terima kasih atas masalahnya, saya senang dengannya.
Dave

Jawaban:

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

Bagaimana itu bekerja

Cobalah online!

Pertama membaca args dan menemukan setelan kiri-bauer (jack dengan warna yang sama seperti truf) dengan pencarian hash:

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

Kemudian menggabungkan semua kartu menjadi satu string dan melakukan beberapa penggantian, membuat kartu secara alami mengurutkan dalam urutan yang benar untuk 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/\]\[/,$_;

Di akhir blok ini, string kartu kemudian dibagi pada tanda kurung, yang membangun larik semua kartu di mana:

  • indeks 0 = kartu utama lawan

  • indeks 1 = kartu rekan satu tim

  • indeks 2 = kartu lawan lain

  • indeks 3-6 mewakili tangan

Suit utama diuraikan dari kartu pertama, tetapi suit berubah menjadi '0' untuk mewakili truf jika truf dipimpin:

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

Kartu terbaik yang sedang dimainkan ditemukan dengan mengurutkan tiga kartu pertama dan mengambil kartu pertama:

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

Kartu yang dapat diputar ditemukan. Jika ada kartu di tangan yang cocok dengan setelan utama, maka hanya kartu yang tersisa. Kalau tidak, semua kartu dianggap dapat dimainkan:

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

Kartu 'throwaway' ditemukan dengan mengembalikan kartu terakhir dalam susunan kartu yang dapat dimainkan yang diurutkan:

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

Kartu 'menang' terendah yang dapat memenangkan trik ditemukan dengan menambahkan kartu tertinggi yang sedang dimainkan ke dalam array kartu yang dapat dimainkan, mengurutkan susunan, dan mengulanginya sampai kartu tertinggi yang sedang dimainkan ditemukan. Kartu 'menang' adalah kartu dari iterasi sebelumnya:

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

Permainan yang benar kemudian dievaluasi. Kartu 'sekali pakai' dipilih jika salah satu dari yang berikut ini benar:

  1. Kartu terbaik di atas meja memiliki indeks 1 di array yang tidak disortir dari semua kartu, yang berarti itu milik rekan satu tim kami
  2. Pencarian untuk kartu 'pemenang' terendah muncul nol, yang berarti kartu terbaik lawan kami lebih tinggi daripada semua kartu di tangan

Kalau tidak, kartu 'menang' dikembalikan:

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