วิเคราะห์การสับแบบ overhanded


13

Rod กำลังควบคุมเกมการ์ดระหว่างผู้เล่นสองคน: George และ Tim ปัจจุบันทิมกำลังสับไพ่ ร็อดสงสัยว่าทิมพยายามโกงดังนั้นเขาต้องการความช่วยเหลือจากคุณเพื่อตรวจสอบว่าการสับเปลี่ยนนั้นยุติธรรม

ทิมกำลังสับไพ่ overhanded: เขาตัดไพ่กองจากด้านล่างของดาดฟ้าจากนั้นก็ตัดส่วนต่าง ๆ จากด้านบนของกองไปยังด้านบนของดาดฟ้าและทำซ้ำขั้นตอนสองสามครั้ง

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

  • หากหลังจากการสับไพ่ไพ่ที่อยู่ติดกันน้อยกว่า 25 คู่ยังคงอยู่ติดกัน (เรียงตามลำดับเดียวกัน) การสับไพ่นั้นยุติธรรมและเกมสามารถเล่นต่อไปได้
  • ถ้าอย่างน้อย 25 (แต่ไม่ใช่ทั้งหมด) คู่ของไพ่ที่อยู่ติดกันยังคงอยู่ติดกันการสับไพ่นั้นอ่อนแอและร็อดจะทำให้ทิมกระแทกศีรษะและขอให้เขาสับไพ่เพิ่ม
  • หากไพ่ทั้งหมดยังคงอยู่ในตำแหน่งเดียวกันในตอนท้ายทิมก็โกงอย่างเห็นได้ชัดและร็อดจะตีเขาด้วยปลาเทราท์ขนาดใหญ่

นี่คือรหัสกอล์ฟดังนั้นรหัสที่สั้นที่สุดชนะ

การป้อนข้อมูล:

คุณจะได้รับชุดตัวเลขระหว่าง 0 ถึง 52 (ทั้งเอกสิทธิ์) คั่นด้วยช่องว่างในหลายบรรทัดซึ่งแต่ละบรรทัดแสดงการสับแบบรอบที่เริ่มต้นและสิ้นสุดด้วยไพ่ทั้งหมดที่ซ้อนกัน

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

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

เอาท์พุท:

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

ตัวอย่าง:

เด็คนี้มี 52 ใบ แต่สำหรับการสาธิตฉันจะใช้เด็คขนาดเล็ก 10 ใบ

การป้อนข้อมูล:

5 3 1
4 2 2

เด็คเริ่มต้นมองจากด้านบน: 0 1 2 3 4 5 6 7 8 9
50 1 2 3 4( 5 6 7 8 9ในมือ)
35 6 7 0 1 2 3 4( 8 9ในมือ)
18 5 6 7 0 1 2 3 4( 9ในมือ)
ปลายแถว9 8 5 6 7 0 1 2 3 4
4➜➜ 9 8 5 6 7 0( 1 2 3 4ในมือ)
21 2 9 8 5 6 7 0( 3 4ในมือ)
2➜ ( ในมือ) ➜ 3 4 1 2 9 8 5 6 7 0
4 คู่ยังคงติดกัน:(3 4) (1 2) (5 6) (6 7)

กรณีทดสอบ:

43 5 5 5 5 5 5 5 5
43 5 5 5 5 5 5 5 5
43 5 5 5 5 5 5 5 5

เอาท์พุท: fair


43 5 5 5 5 5 5 5 5
43 5 5 5 5 5 5 5 5
43 5 5 5 5 5 5 5

เอาท์พุท: weak


29 24
19 18
38 2 1 8 13 6 4
47 15 16 5 2 1 7
34 22 9 3
44 9 10 11 3 1 7
33 18 4 2 3 3

เอาท์พุท: fair


24 6 12 4
25 3 19
36 4 25 2
19 11 1 3
15 9 3
37 5 27

เอาท์พุท: weak


26 13
26 13
26 13
26 13

เอาท์พุท: trick


50 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

เอาท์พุท: weak


50 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
50 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

เอาท์พุท: trick


50 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
49 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

เอาท์พุท: fair

ที่ต้องการ:

  • หากคุณเขียนฟังก์ชั่นสามารถอ่านได้จากอินพุตมาตรฐานหรือรับอินพุตเป็นพารามิเตอร์สตริงเดียว นอกจากนี้ฟังก์ชั่นสามารถพิมพ์ออกหรือส่งกลับ
  • โปรแกรมต้องสามารถรันได้ใน Linux โดยใช้ซอฟต์แวร์ที่มีให้ฟรี
  • ซอร์สโค้ดต้องใช้อักขระ ASCII เท่านั้น
  • ไม่มีช่องโหว่มาตรฐาน

2
ทำไมข้อ จำกัด ของ ASCII? หลายภาษา (APL, รหัสเครื่อง, TI-BASIC) ไม่ได้ใช้ ASCII เลยดังนั้นคุณไม่อนุญาตให้ใช้ภาษาเหล่านั้นโดยปริยาย
lirtosiast

@ThomasKwa เพราะฉันไม่ชอบปัญหาที่เกี่ยวข้องกับการแสดงและการนับอักขระที่ไม่ใช่ ASCII ภาษาเหล่านั้นบางภาษามีการรับรอง ASCII หรือทางเลือกอื่น ฉันคิดว่ามันไม่ได้เป็นข้อ จำกัด ที่รุนแรงมากและมันเป็นระดับที่สนามเด็กเล่นเล็กน้อย
aditsu ออกเพราะ SE ไม่ทำงาน

ฉันคิดว่าระบบการให้คะแนนเช่น "รายการที่ใช้เฉพาะอักขระ ASCII ที่พิมพ์ได้จะมีจำนวนไบต์คูณด้วยบันทึก (95) / บันทึก (256)" จะเป็นตัวเลือกที่ดีกว่าถ้าคุณต้องการจูงใจให้ส่ง ASCII ที่พิมพ์ได้อย่างเป็นธรรม เหตุผลคือเนื้อหาข้อมูลของรายการที่มีคะแนนเท่ากันจะเท่ากัน โดยส่วนตัวแล้วฉันยังคงต้องการให้คะแนนแบบเป็นไบต์
lirtosiast

@ThomasKwa โอเคแล้วเรื่องนี้ล่ะ อักขระ unicode ที่พิมพ์ได้เท่านั้นจำนวนไบต์ในการเข้ารหัส UTF-8
aditsu ออกเนื่องจาก SE เป็นความชั่วร้าย

คำตอบ:




2

JavaScript, 292 289 ไบต์

นี่อาจเป็นไปได้ที่จะได้รับจำนวนไบต์ที่บีบออกมา แต่ตอนนี้เป็นครั้งแรกที่ผ่านไปอย่างรวดเร็ว:

d=[];for(i=0;i<52;i+=1)d[i]=i
s=prompt().split('\n')
s.forEach(function(e,i){s[i]=e.split(' ')
h=d.splice(-s[i][0],99)
for(j=1;j<s[i].length;j+=1)d.unshift.apply(d,h.splice(0,s[i][j]))
d.unshift.apply(d,h)})
for(c=0;i>1;i-=1)if(d[i-2]==d[i-1]-1)c+=1
alert(c<25?"fair":c<51?"weak":"trick")

แก้ไข: บันทึก 3 ไบต์โดยนำค่าiจากวงวนการสร้างดาดฟ้ากลับมาใช้ใหม่เมื่อนับจำนวนการ์ดที่อยู่ติดกัน

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