ใครจะเป็นผู้ชนะในการหลอกลวง


19

เขียนโค้ดเพื่อตรวจสอบว่าใครชนะเป็นเคล็ดลับที่สี่บัตรในเกมของSpades ไบต์ที่น้อยที่สุดจะเป็นผู้ชนะ

อินพุตเป็นสตริงที่แสดงไพ่สี่ใบที่เล่นตามลำดับเช่นTH QC JH 2H(Ten of Hearts, Queen of Clubs, Jack of Hearts, Two of Hearts) บัตรจะได้รับจากสองตัวอักษร: ชุดจากและค่าจากCDHS 23456789TJQKAคุณรับประกันว่าอินพุตนั้นถูกต้องและการ์ดนั้นแตกต่างกัน

คุณควรส่งออกหมายเลข 1, 2, 3 หรือ 4 สำหรับผู้ชนะของเคล็ดลับ ในตัวอย่างTH QC JH 2Hแจ็คฮาร์ตชนะเคล็ดลับดังนั้นคุณควรเอาท์พุท 3

อินพุตและเอาต์พุตของคุณจะต้องตรงตามที่อธิบายไว้ยกเว้นการขึ้นบรรทัดใหม่เป็นตัวเลือก

นี่คือกฎ Spades สำหรับการชนะเคล็ดลับ การ์ดที่ชนะนั้นเป็นการ์ดที่สูงที่สุดในสี่ซึ่งมีคำเตือนอยู่บ้าง Spades เป็นชุดคนที่กล้าหาญดังนั้นโพดำที่อยู่เหนือกว่าโพดำใด ๆ ชุดของไพ่ใบแรกที่เล่นคือชุดนำและมีเพียงไพ่ของชุดหรือโพดำเท่านั้นที่มีสิทธิ์ได้รับเล่ห์เหลี่ยม 23456789TJQKAการ์ดของชุดเดียวกันเมื่อเทียบจากค่าของพวกเขาซึ่งจะได้รับในการสั่งซื้อเพิ่มขึ้นเป็น

กรณีทดสอบ:

TH QC JH 2H
3
KC 5S QS 9C
3
QD 2D TD 5D
1
9S 5D AD QS
4
3D 4C 3H JH
1
9S 4S TS JS
4
5H 9H 2C AD
2
5S 4C 3H QD
1
2H 2S KH AH
2

คำตอบ:


10

Pyth, 28 27 25 ไบต์

J"KTAZ"hxcz)eo_XN+@z1JJcz

ลองใช้ออนไลน์: การสาธิตหรือชุดทดสอบ (4 ตัวแรกคือชุดการทดสอบ)

ขอบคุณ @isaacg สำหรับเคล็ดลับซึ่งบันทึกไว้ 2 ตัวอักษร

แนวคิดหลักคือการแก้ไขตัวละครของแต่ละมือเช่นในทางที่มือชนะมีค่าสูงสุด

ค่าของมือ23456789TJQKAนั้นเกือบเรียงแล้ว ฉันเพียงแค่ต้องเปลี่ยนTด้วยA, KมีTและAมีผลกับZ23456789AJQSZ

ลำดับของชุดสูทCDHSสำหรับคนที่ไม่สำคัญที่สุด Sชุดที่ทรงพลังที่สุดซึ่งเป็นค่าสูงสุดแล้ว สิ่งสำคัญคือการให้ค่าที่มีประสิทธิภาพมากที่สุดที่สองมือแรก Kดังนั้นผมจึงแปลชุดนี้ลงใน

มือทั้งสองข้างยังต้องอ่านกลับด้านเนื่องจากชุดมีพลังมากกว่าค่า

                           implicit: z = input string
J"KTAZ"                    J = "KTAZ"
             o         cz  orders the hands N of split(z) by:
              _              the reversed of 
               XN+@z1JJ      N, where the values z[1]+J are replaced by J
            e              last element (winning hand)
        xcz)               index of the winning hand in split(z)
       h                   + 1

ฉันยอมแพ้เล่นได้ดี: P
orlp

ฉันไม่คิดว่าของ.eมีค่าควรใช้น้อยoกว่า 1 ตัวอักษรเพราะคิด
isaacg

@isaacg สิทธิ์ของคุณ สิ่งที่ตลกคือฉันมีวิธีแก้ปัญหา 27 ข้อก่อน.eแก้ปัญหา 28 ข้อ แต่โซลูชัน 27 จบลงด้วย a )ดังนั้นจึงมี 28 ไบต์ : อุ๊ปส์:
Jakube

1
ฉันคิดว่าวิธีที่จะประหยัดอีก 2 ตัวอักษร: แปลจาก+@z1"KTA"ไป"KTAZ"แต่แทนการใช้สายโดยตรงใช้J"KTAZ"ที่จุดเริ่มต้นและการ+@z1J J
isaacg

@isaacg ฉลาดมาก ขอบคุณ Btw ฉันคิดว่าในขณะที่เกี่ยวกับการทำให้อาร์กิวเมนต์ที่สามของXตัวเลือก (เฉพาะถ้า a และ b เป็นสตริง) แต่ฉันไม่แน่ใจจริง ๆ ว่าXab)ควรประเมินXab_b(กลับหัวขจะดีสำหรับสิ่งที่ชอบXa"</\>") หรือXab+tbhb(ขเปลี่ยน) คุณชอบอะไร
Jakube

6

CJam, 34 33 ไบต์

lS/_{)2$0='S+\#\"TQKA"_$er+}$W>#)

ขั้นตอนวิธี

ตรรกะนั้นง่าย ฉันมีการเรียงลำดับที่กำหนดเองซึ่งฉันให้ความสำคัญกับตัวละครตัวที่สองซึ่งเป็นตัวแทนของชุดสูท ในนี้ Spades จะได้รับความสำคัญสูงสุดจากนั้นก็โยนชุดแรก -1ส่วนที่เหลือทั้งหมดที่มี แล้วฉันจะเรียงลำดับตัวอักษรตัวแรกที่มีการแลกเปลี่ยนของTที่มีAและQด้วยKที่จะมีการเรียงลำดับคำศัพท์

คำอธิบายรหัส

ก่อนอื่นให้เราดูว่าค่าลำดับใบหน้าของไพ่คืออะไร:

"23456789TJQKA"$

23456789AJKQT

ดังนั้นตัวเลขทั้งหมดอยู่ในตำแหน่งที่ถูกต้อง Jยังอยู่ในตำแหน่งที่ถูกต้อง เราจำเป็นต้องสลับKและQและJและAเพื่อให้ได้คำศัพท์

lS/_{)2$0='S+\#\"TQKA"_$er+}$W>#)
lS/                                 "Read an input line and split on spaces";
   _{                      }$       "Copy the array and sort it using this custom logic";
     )                              "Take off the last character of each hand.";
      2$0=                          "Get the suit of the first hand";
          'S+                       "Add Spades suit to it";
             \#                     "Get the index of the current hand suit.
                                     1 for Spades, 0 for first hand suit, -1 otherwise";
               \                    "Put face value of this hand on top of stack";
                "TQKA"              "Put string TQKA on stack";
                      _$            "Copy and sort. This essentially reverses the string
                                     TQKA to form AKQT. This is 1 byte shorter than _W%";
                        er+         "Swap T with A and K with Q and add to the
                                     suit index calculated previously";
                                    "After the above tuple, sorting will automatically
                                     convert the tuple to string and sort lexically";
                             W>     "Get the array containing only the last element";
                               #)   "Get the index of this hand in original set and
                                     increment to convert it to 1 based";

ลองออนไลน์ได้ที่นี่


3

JavaScript (ES6), 112

สแกนรายการและส่งคืนตำแหน่งของค่าสูงสุดที่พบ

เรียกใช้ตัวอย่างเพื่อทดสอบ (ใน Firefox)

F=t=>t.split(' ').map((c,i)=>(n='23456789TJQKA'.search(c[0])+(c[1]>'H'?40:c[1]==t[1]&&20))>m&&(m=n,r=i+1),m=0)|r

C.innerHTML=['TH QC JH 2H','KC 5S QS 9C','QD 2D TD 5D','9S 5D AD QS','3D 4C 3H JH','9S 4S TS JS','5H 9H 2C AD','5S 4C 3H QD'].map(h=>h+' -> '+F(h)).join('\n')
<pre id=C></pre>


3

Perl, 73 ไบต์

#!perl -pl
/\B./;s/$&/P/g;y/TKA/IRT/;$_=reverse;@a=sort split;/$a[-1]/;$_=4-"@-"/3

ลองฉัน

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


2

Ruby, 59 + 2 = 61

ด้วยแฟล็กบรรทัดคำสั่งnaให้รัน

p (1..4).max_by{|i|$F[i-1].tr($_[1]+'SJQKA','a-z').reverse}

2

J, 47 ไบต์

1+[:(i.>./)_3+/\16!@-]i.~'SXAKQJT9876543'1}~1&{

การใช้งาน:

   (1+[:(i.>./)_3+/\16!@-]i.~'SXAKQJT9876543'1}~1&{) 'TH QC 9S 8S'
3

วิธี:

  • สำหรับถ่านอินพุตทุกอันเรากำหนดค่าตามตำแหน่งใน'S[second char of input]AKQJT9876543'สตริง ตัวอักษรที่ไม่พบจะได้รับค่าlast position + 1โดยนัย อักขระเพิ่มเติมมีค่าน้อยกว่ามาก ( value=(16-position)!)
  • คำนวณผลรวมสำหรับ triplet char 3 อินพุทและหนึ่ง duplet (เช่นTH_ QC_ 9S_และ8S)
  • เลือกดัชนีที่ใช้ 1 ค่าสูงสุด

(น่าเสียดายที่ J ไม่สามารถเปรียบเทียบ chars หรือ strings ได้โดยตรงมันสามารถตรวจสอบความเท่าเทียมกันของพวกเขาเท่านั้น

ลองออนไลน์ได้ที่นี่


2

C #, 237

using System;namespace S{class P{static void Main(string[] a){var V="23456789TJQKA";int x=0;int y=0;var z=a[0][1];for(int i=0;i<4;i++){int q=V.IndexOf(a[i][0])+2;var w=a[i][1];q*=w==z?1:w=='S'?9:0;if(q>y){x=i;y=q;}}Console.Write(x+1);}}}

มันทำงานอย่างไร: ย้ำแต่ละมือเพื่อคำนวณ "คุณค่า" ของการ์ด .. เก็บดัชนีที่มีค่าสูงสุด มูลค่าบัตรจะถูกกำหนดเป็นอันดับของการ์ดคูณด้วย 0 หากไม่ใช่สเปดหรือชุดการเปิด 1 ถ้าเป็นชุดเปิดและ 9 ถ้าเป็นสเปด แต่ไม่ใช่ชุดเปิด (9 เลือก b / c 2 * 9 = 18> A = 14 & 9 เป็นตัวอักษรตัวเดียว)


1

Pyth, 36 33 ไบต์

KczdhxKeo,x,ehK\SeNXhN"TKA""AYZ"K

วิธีการตรงไปตรงมาอย่างยุติธรรมใช้การเรียงลำดับด้วยฟังก์ชั่นคีย์ที่กำหนดเองจากนั้นค้นหาดัชนีที่มีค่าสูงสุด


คุณลองหลีกเลี่ยงการเรียงลำดับและค้นหาค่าสูงสุดหรือไม่ ใน JavaScript ที่กลายเป็นสั้นกว่า
edc65

@ edc65 ใน Pyth ไม่มีการดำเนินการเพื่อหาค่าสูงสุดเพียงเพื่อเรียงลำดับ แต่ด้วยอักขระหนึ่งตัว ( e) คุณสามารถรับองค์ประกอบสุดท้ายดังนั้นการหาค่าสูงสุดคือการเรียงลำดับตามด้วยการรับองค์ประกอบสุดท้าย
orlp

Downvoter สนใจอธิบายไหม?
orlp

1

Pyth, 31 ไบต์

hxczdeo}\SNo}@z1Zox"TJQKA"hNScz

ลองที่นี่

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

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

  • cz: นี่จะสร้างรายการของสตริงการ์ด c, chop, โดยปกติคือฟังก์ชันเลขฐานสอง (arity 2) แต่เมื่อเรียกใช้เพียงอินพุตเดียวทำหน้าที่เป็น.split()เมธอดสตริง

  • S: สิ่งนี้ใช้พฤติกรรมการเรียงแบบปกติซึ่งเรียงลำดับหมายเลขบัตรที่ต่ำกว่าก่อนที่จะสูงกว่า

  • ox"TJQKA"hN: คำสั่งนี้จะเรียงลำดับตามดัชนี ( x) ในสตริง"TJQKA"ของตัวอักษรตัวแรกของการ์ด ( hN) -1สำหรับบัตรกับตัวเลขตัวอักษรตัวแรกไม่พบให้ผล เนื่องจากฟังก์ชั่นการเรียงลำดับของ Pyth นั้นมีความเสถียรคำสั่งของหมายเลขบัตรจะไม่ได้รับผลกระทบ

  • o}@z1Z: ต่อไปเราจะเรียงลำดับโดยดูว่าไพ่ชุดแรกที่เล่น ( @z1) อยู่ในการ์ดนั้นหรือไม่ ตั้งแต่Trueเรียงลำดับไว้ด้านหลังFalseจะส่งไพ่ชุดนำไปทางด้านหลัง

  • o}\SN: นี่เป็นแบบเดียวกับก่อนหน้านี้ แต่มันเรียงลำดับว่าตัวอักษรSอยู่ในการ์ดหรือไม่ส่งโพดำไปด้านหลัง

  • hxczde: นี่จะแยกไพ่ใบสุดท้ายที่เรียงลำดับด้วยวิธีนี้ ( e) ค้นหาดัชนีของมันในรายการไพ่ ( xczd) และเพิ่มทีละ 1 ( h) โดยให้ตำแหน่งผู้เล่นที่ต้องการ

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