เล่นการ์ดที่ดีที่สุดใน 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

เหตุผล: เนื่องจาก Hearts เป็นคนที่กล้าหาญ Ace of Diamonds กำลังชนะมือเราจึงสามารถที่จะเป็นมือคนที่กล้าหาญดังนั้นเราควรใช้ไพ่ที่ต่ำที่สุดของเราที่นี่ 9H

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

ออก: 9D

เหตุผล: เนื่องจากเพชรเป็นคนที่กล้าหาญและขณะนี้เราชนะมือเราควรเล่น 9D เพราะพันธมิตรของเรากำลังชนะมือเราจึงต้องการเล่น9Dมากกว่าAD

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

ออก: QH

เหตุผล: เนื่องจาก Diamonds เป็นคนที่กล้าหาญฝ่ายตรงข้ามของเราชนะด้วย Bower ด้านซ้ายJHเรามีBower ที่เหมาะสม แต่ไม่สามารถ Trump เขาได้เพราะ QH เป็นผู้นำและเราต้องทำตามความเหมาะสมQH

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

ออก: JD

เหตุผล: ในขณะที่ Diamonds เป็นคนที่กล้าหาญฝ่ายตรงข้ามของเราจะชนะด้วย Bower ด้านซ้ายJHเรามี bower ที่ถูกต้องและเนื่องจากเราไม่มีDiamondsเราจึงสามารถที่จะเอาชนะเขาได้ด้วยJD

จุดแข็งของไพ่ยูเครอ

หาก Hearts เป็นคนที่กล้าหาญ:

JH
JD
AH
KH
QH
TH
9H

ดูกฎของไพ่ยูเครอถ้าคุณไม่คุ้นเคยกับความแข็งแกร่งของไพ่ในไพ่ยูเครอ

เนื่องจากนี่คือ Code-Golf รหัสที่สั้นที่สุดชนะ!

ขอให้โชคดีและสนุก!


2
ฉันคิดว่าการเล่นควรจะอธิบายที่นี่ไม่ได้มีลิงก์
Jonathan Allan

@JanathanAllan ฉันคิดถึงมัน แต่มันอธิบายได้ดีกว่าในลิงค์ อาจไม่ใช่ความท้าทายที่ดีที่สุดสำหรับผู้ที่ไม่คุ้นเคยกับเกม นอกเสียจากว่าพวกเขาต้องการที่จะเรียนรู้ได้ทันที
jacksonecac

ตัวอย่างที่9Dเป็นผลมีการตั้งค่าหัวใจเป็นสำคัญกว่า (แม้ว่าฉันไม่คิดว่ามันมีผลต่อผลลัพธ์นี้)
Jonathan Allan

@Janathan ทุกคนจับได้ดีมากขอบคุณ
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

มันทำงานอย่างไร

ลองออนไลน์!

ก่อนอื่นมันอ่านอาร์กและค้นหาชุดสูทซ้าย - บาเออร์ (แจ็คที่มีสีเดียวกับทรัมป์) ด้วยการค้นหาแบบแฮช:

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

พบการ์ด 'throwaway' โดยส่งคืนไพ่ใบสุดท้ายในแถวเรียงไพ่ที่เล่นได้:

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

ไพ่ที่ 'ชนะ' ต่ำที่สุดที่สามารถเอาชนะเคล็ดลับได้โดยการเพิ่มไพ่ที่สูงที่สุดในการเล่นลงในอาร์เรย์ของไพ่ที่เล่นได้เรียงลำดับอาร์เรย์แล้ววนซ้ำจนกว่าจะพบไพ่ที่สูงที่สุดในการเล่น การ์ด 'ชนะ' คือการ์ดจากการทำซ้ำครั้งก่อน:

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

ประเมินการเล่นที่ถูกต้องแล้ว บัตร 'throwaway' ถูกเลือกหากมีสิ่งใดสิ่งหนึ่งต่อไปนี้เป็นจริง:

  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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.