คุณสามารถเอาชนะ Bill Gates ได้ไหม?


13

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

ในปี 1979 หนุ่มบิลเกตส์และ Christos Papadimitriou เขียนกระดาษพิสูจน์ผูกพันบนของP (n) = (5n + 5) / 3 2

ฉันคิดว่ามันปลอดภัยที่จะสมมติว่า Gates (และ / หรือ Papadimitriou) เขียนโปรแกรมเพื่อทำการคัดแยกแพนเค้กโดยใช้อัลกอริทึมที่พัฒนาขึ้น (อาจช้ากว่า 1979) เนื่องจาก Gates เป็นโปรแกรมเมอร์ที่มีทักษะพวกเขาจึงอาจลองใช้รหัสนี้ได้อย่างดีเท่าที่จะทำได้ แต่ขนาดของซอร์สโค้ดไม่สามารถใช้งานได้แบบสาธารณะ (AFAIK)

ท้าทาย:

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

คุณอาจจะคิดว่าn <50 ดังนั้นคุณต้อง จำกัด จำนวนการพลิกไปที่ (บางค่าn- ค่าที่เลือกแบบสุ่ม):

 n   P(n)
38   65
49   83
50   85

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

กฎเพิ่มเติม:

  • รันไทม์ต้องถูกกำหนดไว้แล้ว
  • ไม่มีการ จำกัด เวลาคงที่ แต่คุณต้องสามารถให้ผลลัพธ์สำหรับรายการที่มี 50 องค์ประกอบ

รายการทดสอบ:

ฉันไม่สามารถให้รายการที่ยากที่สุด (ถ้าเป็นเช่นนั้นฉันจะเขียนกระดาษไม่ใช่เรื่องท้าทาย) ดังนั้นฉันจะให้รายการตัวเลขสุ่มที่คุณสามารถทดสอบฟังก์ชั่น / โปรแกรมของคุณได้ ฉันอาจเพิ่มคนอื่น ๆ ถ้ามันเปิดออกรายการเหล่านี้ที่ "ง่าย"

9, 63, 62, 75, 45, 78, 59, 75, 69, 3, 28, 94, 51, 10, 45, 93, 97, 80, 72, 36, 80, 88, 30, 93, 84, 80, 17, 31, 6, 80, 76, 91, 9, 76, 38, 33, 22, 15, 45, 46, 15, 98, 2, 56, 90, 27, 27, 26, 69, 25
...
74, 89, 57, 52, 70, 96, 16, 5, 77, 84, 54, 13, 90, 64, 31, 80, 3, 25, 13, 19, 13, 34, 1, 79, 35, 43, 4, 19, 82, 29, 48, 95, 97, 28, 45, 62, 64, 82, 70, 34, 38, 15, 51, 83, 21, 66, 4, 42, 74, 84
...
62, 73, 7, 90, 83, 18, 12, 35, 72, 71, 99, 67, 87, 62, 65, 70, 14, 72, 55, 92, 87, 3, 7, 4, 4, 95, 49, 25, 4, 18, 49, 39, 26, 1, 45, 64, 23, 66, 39, 17, 33, 24, 58, 72, 77, 46, 99, 71, 10, 21

หวังว่า Bill Gates และ Papadimitriou จะเห็นความท้าทายนี้และให้รหัสของพวกเขาเพื่อที่เราจะได้ทราบว่าในความเป็นจริงแล้วพวกเขาเหนือกว่าพวกเขาหรือไม่

3มีการค้นพบขอบเขตบนที่ดีขึ้น แต่คุณไม่จำเป็นต้องใส่ใจกับสิ่งเหล่านั้น


ที่เกี่ยวข้องแต่ไม่ซ้ำกัน คำตอบที่นั่นจะไม่ทำงานที่นี่
Stewie Griffin

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

@miles จากนั้นสามารถโพสต์ได้ฟรี ฉันไม่ได้ทำทุกคำตอบอย่างละเอียด แต่ส่วนใหญ่ใช้วิธีการที่ไร้เดียงสา
Stewie Griffin

คำตอบ:


4

Python 2 (PyPy) , 238 235 222 ไบต์

a=input();n=len(a);r=range(n);a=zip(a,r);a=map(sorted(a).index,a)+[n]
def s(u,m):
 if m<1:return[0]
 for k in r:
  v=u[k::-1]+u[k+1:]
  if sum(1<abs(v[i]-v[i+1])for i in r)<m:
   p=s(v,m-1)
   if p:return[k]+p
print s(a,5*n/3)

* (2 ช่องว่าง = แท็บ)

ลองออนไลน์!

ที่บันทึกไว้ 13 ไบต์ยืมวิธีการในการจัดอันดับรายการ

DFS พร้อมฮิวริสติกแบบง่ายที่ตรวจสอบว่าการพลิกแยกคู่ของ "แพนเค้ก" ที่จะอยู่ติดกันเมื่อเรียงลำดับหรือไม่ จัดเรียงตามลำดับจากน้อยไปหามาก เอาท์พุทเป็น 0 ดัชนีจากด้านซ้ายที่ 0 พลิก 2 ครั้งแรกและอื่น ๆ จำนวนของการเคลื่อนไหวที่ใช้เป็น(5/3)*n+1 < 5/3*(n+1)ที่(18/11)*n < (5/3)*n+1 < 5/3*(n+1)และ(18/11)*nเป็นที่พบที่ถูกผูกไว้ที่เข้มงวดมากขึ้นบนใน2009

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