การให้คะแนนสะพานมือ


13

หนึ่งในสิ่งที่ทำให้สะพานสัญญาน่าสนใจมากคือเกมเมตา "ประดิษฐ์" ที่มีความซับซ้อนสูง ระบบการให้คะแนนของมือนี้เป็นเพียงส่วนเล็ก ๆ ของมัน

Bridge เป็นเกมไพ่กลโกง ผู้เล่นแต่ละคนได้รับในมือของ 13 ใบและเกมเริ่มต้นด้วยการเสนอราคา การเสนอราคาเป็นตัวกำหนดว่าส่วนที่เหลือของเกมจะเล่นอย่างไรและเป็นส่วนสำคัญของเกม เพื่อให้แน่ใจว่าคุณและคู่ของคุณจะไม่เสนอราคาสูงเกินไป (หรือต่ำเกินไป) ระบบการให้คะแนนแบบประดิษฐ์นี้ได้รับการพัฒนาขึ้นเพื่อบอกคุณว่ามือของคุณดีแค่ไหน

เกณฑ์การให้คะแนน

นี่คือตัวอย่างมือ:

S:KQT5
H:J72
D:965
C:AK8

S, H, D, C เป็นตัวแทนของชุดสูท (โพดำ, หัวใจ, เพชรและคลับ) และส่วนที่เหลือเป็นไพ่ในชุดเหล่านั้น ดังนั้นมือนี้จึงมีราชินีแห่งโพดำ (Q), ราชาแห่งโพดำ (K), สิบโพดำ (T), ห้าโพดำ, แจ็คแห่งหัวใจ, เจ็ดดวง, ฯลฯ

ระบบการให้คะแนนทำงานดังนี้:

  • คุณได้รับ 4 แต้มสำหรับทุกแต้ม (A) คุณมี 3 คะแนนสำหรับทุกราชา (K), 2 คะแนนสำหรับทุกราชินี (Q) และ 1 คะแนนสำหรับแจ็ค (J) ไม่มีบัตรอื่นให้คะแนน
  • ไพ่ทุกใบหลังจากไพ่ใบที่สี่ในชุดสูทให้ 1 แต้ม ดังนั้นถ้าคุณมีหัวใจหกดวงคุณจะได้รับ 2 คะแนน
  • ชุดที่คุณมีไพ่ 2 ใบให้ 1 คะแนน (นี่คือ doubleton) ชุดที่คุณมีไพ่ 1 ใบให้ 2 คะแนน (นี่คือซิงเกิล) หากคุณไม่มีไพ่ในชุดสูทคุณจะได้รับ 3 คะแนน (นี่เป็นโมฆะ) (โดยปกติสิ่งเหล่านี้จะนับเฉพาะเมื่อคุณเห็นด้วยกับคู่ของคุณ แต่ฉันรวมพวกเขาเพื่อทำให้ความท้าทายน่าสนใจยิ่งขึ้น)

มือข้างบนมี 13 คะแนน

ท้าทาย

ให้มือบริดจ์ในรูปแบบที่แสดงด้านบนให้คำนวณจำนวนแต้มที่มี ชุดจะถูกระบุไว้ในลำดับโพดำ, หัวใจ, เพชรและคลับและการ์ดจะถูกจัดเรียงตามลำดับ A, K, Q, J, T, 9 - 2

ตัวอย่างอินพุตและเอาต์พุต

S:KQT5
H:J72
D:965
C:AK8
       \-> 13

S:AKQT6
H:54
D:J83
C:732
       \-> 12

S:
H:KQT8754
D:A86
C:432
       \-> 15

S:9876
H:843
D:652
C:432
       \-> 0

S:AKQT5
H:AQJ6
D:Q3
C:AK
       \-> 28

นี่คือดังนั้นรหัสที่สั้นที่สุดในหน่วยไบต์ชนะ

คำตอบ:


4

เยลลี่, 27 25 21 ไบต์

ขอบคุณ @Dennis สำหรับ -3 ไบต์!

L_5.AḞW+“JQKA”i$€Sµ€S

สิ่งนี้รับอินพุตเป็นรายการของบรรทัด เพื่อที่จะใช้การป้อนข้อมูลเป็นสตริง multiline, precatenateṣ⁷µ

ทำตารางคะแนนความถี่:

Cards:    0  1  2  3  4  5  6 ... 4+k
Points:   3  2  1  0  0  1  2 ... k

เราเห็นได้ว่าพวกมันมีค่าเท่ากันabs(c-3.5)-.5โดยที่ c คือจำนวนไพ่ เนื่องจากแต่ละบรรทัดมีอักขระพิเศษสองตัวและจำนวนคะแนนเป็นจำนวนเต็มเสมอนี่คือfloor(abs(l-5.5))ที่ซึ่ง l คือความยาวบรรทัด

โปรดทราบว่าดัชนีของ Jelly นั้นใช้พื้นฐาน 1 และพฤติกรรมของฟังก์ชันเวกเตอร์ในมิติที่ไม่ตรงกัน: องค์ประกอบพิเศษของรายการที่ยาวขึ้นจะไม่ได้รับผลกระทบ ดังนั้นให้[1] + [3,2,0,0][4,2,0,0]

                  µ      The program is two monadic fs applied in turn; an atop.
L_5.AW+“JQKA”i$€S       Helper function:
                 €        For €ach line:
L                         Get the line Length.
 _5.                      Subtract 5.5 (Numeric literals' decimal parts default to .5)
    A                     Apply Absolute value
     Ḟ                    Floor
      W                   Then Wrap it in an array. "S:AKQT6" gives [1].
        “JQKA”i$          Monadic function: index into the string "JQKA".
                €         Apply ^ over €ach char of the line; [3,2,0,0,0].
       +                  Add the two arrays together; [4,2,0,0,0].
                 S        Sum; 6.
                    S    Main link: Sum all results

ลองมันนี่



2

Pyth, 27 25 24 ไบต์

sms+a5.5ldshMxL"JQKA"d.z

เราคำนวณค่าแยกกันสำหรับแต่ละชุดแล้วเพิ่มเข้าไป

  s m                 sum of map lambda d:  (d is a line of input)
      +                 add the
        s a                 floor of the absolute difference between
            5.5               5.5
            l d               and len(d)
          s hM xL           to the sum of the indices each incremented by one
                  "JQKA"      of each char in d in the string "JQKA"
                  d
      .z

ชุดทดสอบ


1

เรติน่า, 77 59 ไบต์

T`AKQJTd`5-1
:(.){0,3}(.)?
$#1$#1$#2 3$0
\S
$0$*1
+`1 1

1

คำอธิบายโดยคู่สาย / สาย:

  • ในบรรทัดแรกที่เราแปลงตัวอักษรไปAKQJT987655432 5432111111111นี่หมายถึงทุกชุดที่เรามี หากเรามี0 1 2 3 4 5 6 7 ...ไพ่ในชุดนี้ผลรวมจะออก+3 +1 -1 -3 -4 -4 -4 -4 ...จากคะแนนที่ถูกต้อง
  • ในบรรทัดที่ 2 และ 3 เพื่อแก้ไขสิ่งนี้เราบวก 3 เข้ากับทุกบรรทัดและก่อนที่ช่องว่างเราจะเพิ่มค่าที่เราจะลบออก ค่าที่หักออกนี้คือความยาวของไพ่สองเท่าโดยมีค่าสูงสุด 3 และอีก 1 หากมีอย่างน้อย 4 ใบ
  • ในบรรทัดที่ 4 และ 5 เราแปลงตัวเลขเป็น unary ปล่อยทุกอย่างอื่นยกเว้นตัวคั่นพื้นที่
  • ในบรรทัดที่ 6 และ 7 เราทำการลบค่านารี
  • ในบรรทัดที่ 8 เรานับจำนวน1ของที่ให้ผลลัพธ์

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



1

Stax , 18 ไบต์

½Γ}♣▓="pì∩û╨▐M↨}╚-

คำตอบที่สั้นที่สุดแพ้ Jelly (แม้ว่าฉันคาดว่าจะพ่ายแพ้เร็ว ๆ นี้ ... )

เรียกใช้และแก้ไขข้อบกพร่องออนไลน์!

คำอธิบาย

ใช้เวอร์ชันที่คลายการบีบอัดเพื่ออธิบาย

LZF{"JQKA"I^+i5-:++F5+
L                         Collect input in a list (if this is not needed, we can yet save another byte)
 Z                        Put a zero under the top of the stack, used as the accumulator
  F                       Loop for every suit
   {               F      Calculate the "score" for the string describing the suit
    "JQKA"I^              Find the 1-based index of current character in "JQKA", 0 for not found
            +             Add to the accumulator
             i5-:+        Subtract 5 from the current 0-based index, and take the sign
                  +       Add to the accumulator
                    5+    Add 5 extra points for each suit

นี่คือความสำเร็จโดยการแปล

  • ไพ่ทุกใบหลังจากไพ่ใบที่สี่ในชุดสูทให้ 1 แต้ม ดังนั้นถ้าคุณมีหัวใจหกดวงคุณจะได้รับ 2 คะแนน
  • ชุดที่คุณมีไพ่ 2 ใบให้ 1 คะแนน (นี่คือ doubleton) ชุดที่คุณมีไพ่ 1 ใบให้ 2 คะแนน (นี่คือซิงเกิล) หากคุณไม่มีไพ่ในชุดสูทคุณจะได้รับ 3 คะแนน (นี่เป็นโมฆะ)

ถึง

  • คะแนน 3 คะแนนพิเศษสำหรับแต่ละชุด
  • ไพ่แต่ละใบก่อนไพ่ใบที่สี่ในชุดสูทให้คุณ -1 แต้มไพ่แต่ละใบหลังไพ่ใบที่สี่ให้ 1 คะแนนไพ่ใบที่สี่ 0

จากนั้นเราสามารถใช้ประโยชน์จากคุณสมบัติของฟังก์ชั่น signum

โดยการทำเช่นนี้เราสามารถหลีกเลี่ยงการจัดการกับจำนวนการ์ดที่ชัดเจนซึ่งบันทึกไม่กี่ไบต์

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