ตรวจสอบไพ่ในมือเพื่อหาไพ่นกกระจอก


12

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

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

ชุดของสามสามารถเป็นได้ทั้ง:

  • แฝดสามตัวเดียวกัน (เช่น444) หรือ
  • ลำดับของไพ่สามใบติดต่อกัน (เช่น123หรือ678ไม่ก็ได้357) ลำดับไม่ห่อ (ดังนั้นจึง912ไม่ถูกต้อง)

คู่คือไพ่สองใบที่เหมือนกัน (เช่น55)

ความท้าทาย

ระบุไพ่ที่ถูกต้องสิบสี่ใบให้พิจารณาคะแนนตามเกณฑ์ต่อไปนี้:

Condition                Description                                 Point/s
-------------------------------------------------------------------------------
Straight                 Contains the sequences 123 456 789          1
Identical sequences      Contains two identical sequences            1
All simples              Only 2-8, no 1s or 9s                       1
All sequences            All sets of three are sequences             1
All triplets             All sets of three are triplets              2
Flush                    Single-suit hand (always applies)           5

(การให้คะแนนที่นี่ขึ้นอยู่กับกฎไพ่นกกระจอกของญี่ปุ่น แต่ง่ายขึ้นอย่างมากเพื่อทำให้ข้อมูลจำเพาะยุ่งน้อยลง)

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

มือไพ่รับประกันว่าถูกต้องคือสิบสี่แผ่นจาก 1 ถึง 9 และไพ่แต่ละใบปรากฏมากที่สุดสี่ครั้งและอาจสันนิษฐานว่าเรียงลำดับแล้ว อินพุตคือรายการของตัวเลข (เป็นสตริงหรือรายการเดียวของจำนวนเต็ม) ผ่าน STDIN, อาร์กิวเมนต์ของฟังก์ชันหรือบรรทัดคำสั่ง เอาต์พุตอาจเป็น STDOUT หรือส่งคืนค่า

กรณีทดสอบ

22233355777888  ->  8  # 222 333 55 777 888, flush + all simp. + all trip.
11112345678999  ->  6  # 111 123 456 789 99, flush + straight
11123456788999  ->  5  # 111 234 567 88 999, flush only (no straight)
23344455566788  ->  7  # 234 345 456 567 88, flush + all simp. + all seq.
33334444555566  ->  8  # 33 345 345 456 456, flush + all simp. + all seq. + identical seq.
11122233377799  ->  7  # 111 222 333 777 99, flush + all trip. (no identical seq.)
12344556678889  ->  8  # 123 456 456 789 88, flush + all seq. + straight + identical seq.
11344556678999  ->  5  # 11 345 456 678 999, flush only (no identical seq.)
22233344455566  ->  8  # 222 333 444 555 66, flush + all simp. + all trip.
11112233344555  ->  5  # 111 123 234 345 55, flush only

สำหรับตัวอย่างที่ห้าถึงแม้จะมีลำดับที่เหมือนกันสองคู่ แต่เพียงคนเดียวเท่านั้นที่จำเป็นต้องอยู่เพื่อบรรลุจุดนั้น การย่อยสลาย345 345 345 345 66จะทำคะแนนเท่ากันในขณะที่333 345 444 555 66คะแนนแย่ลง

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

นี่คือดังนั้นวิธีการแก้ปัญหาในไบต์ที่น้อยที่สุดชนะ ช่องโหว่มาตรฐานใช้


ความท้าทายที่เกี่ยวข้อง: คุณจะรออะไรอีกหรือ (แก้ปัญหาไพ่นกกระจอก)

คำตอบ:


1

J (241 ไบต์)

คุณต้องติดตั้งJเวอร์ชันล่าสุด

i=:>:@i.9
q=:,/^:4>@:{(i.9);(i.;i.;i.;i.)16
s=:3 :'(>./((5+([:(*./)(3*i.3)&e.)+(-.@:(-:~.))+((*./)@:(6&>:))+2*((*./)@:(6&<)))"1(}."1(y(-:/:~"1)"1((([:{&(i,.i){.),[:,/[:{&(((>:@i.7)+"0 1(i.3)),|:3 9$i)}.)"1 q))#q)))+([:(*./)[:-.((1 9)&e.))y'

เรียกใช้ฟังก์ชันsด้วยรายการจำนวนเต็ม ตัวอย่างเช่นสคริปต์ตัวอย่างต่อไปนี้ตรวจสอบกรณีทดสอบด้านบน:

#!/usr/bin/jconsole
i=:>:@i.9
q=:,/^:4>@:{(i.9);(i.;i.;i.;i.)16
s=:3 :'(>./((5+([:(*./)(3*i.3)&e.)+(-.@:(-:~.))+((*./)@:(6&>:))+2*((*./)@:(6&<)))"1(}."1(y(-:/:~"1)"1((([:{&(i,.i){.),[:,/[:{&(((>:@i.7)+"0 1(i.3)),|:3 9$i)}.)"1 q))#q)))+([:(*./)[:-.((1 9)&e.))y'


echo (s 2 2 2 3 3 3 5 5 7 7 7 8 8 8)=8
echo (s 1 1 1 1 2 3 4 5 6 7 8 9 9 9)=6
echo (s 1 1 1 2 3 4 5 6 7 8 8 9 9 9)=5
echo (s 2 3 3 4 4 4 5 5 5 6 6 7 8 8)=7
echo (s 3 3 3 3 4 4 4 4 5 5 5 5 6 6)=8
echo (s 1 1 1 2 2 2 3 3 3 7 7 7 9 9)=7
echo (s 1 2 3 4 4 5 5 6 6 7 8 8 8 9)=8
echo (s 1 1 3 4 4 5 5 6 6 7 8 9 9 9)=5
echo (s 2 2 2 3 3 3 4 4 4 5 5 5 6 6)=8
echo (s 1 1 1 1 2 2 3 3 3 4 4 5 5 5)=5

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