p
เป็นฟังก์ชั่น (ประเภทคลาส polymorphic) ที่ใช้การเรียงสับเปลี่ยนเป็นรายการของInt
s และรายการซ้อนที่แสดงอาร์เรย์หลายมิติของInt
s
โทรเป็นp [2,1] [[10,20,30],[40,50,60]]
อย่างไรก็ตามหากการเริ่มต้นประเภทไม่สำเร็จคุณอาจต้องเพิ่มคำอธิบายประกอบประเภทเช่น:: [[Int]]
(ซ้อนกันอย่างเหมาะสม) ให้ประเภทของผลลัพธ์
import Data.List
class P a where p::[Int]->[a]->[a]
instance P Int where p _=id
instance P a=>P[a]where p(x:r)m|n<-p r<$>m,y:z<-sort r=last$n:[p(x:z)<$>transpose n|x>y]
ลองออนไลน์!
ความท้าทายในการตีกอล์ฟกับอาเรย์ที่ซ้อนกันของความลึกตามอำเภอใจนั้นค่อนข้างน่าอึดอัดใจใน Haskell เนื่องจากการพิมพ์แบบสแตติกมีแนวโน้มที่จะเข้าใกล้ ในขณะที่รายการ Haskell (ที่มีไวยากรณ์เดียวกับในคำอธิบายการท้าทาย) สามารถซ้อนกันได้ดีรายการของความลึกการซ้อนที่แตกต่างกันเป็นประเภทที่ไม่สามารถใช้ร่วมกันได้ ฟังก์ชั่นการแยกวิเคราะห์แบบมาตรฐานของ Haskell จำเป็นต้องทราบชนิดของค่าที่คุณพยายามแยกวิเคราะห์
เป็นผลให้ดูเหมือนว่าโปรแกรมจะต้องมีการประกาศที่เกี่ยวข้องกับประเภทซึ่งค่อนข้าง verbose สำหรับชิ้นส่วน golfed ฉันตัดสินโดยการกำหนดประเภทคลาสP
เช่นที่p
สามารถ polymorphic ผ่านประเภทของอาร์เรย์
ในขณะเดียวกันชุดทดสอบของ TIO แสดงวิธีการแก้ไขปัญหาการแยกวิเคราะห์
มันทำงานอย่างไร
เพื่อสรุปสาระสำคัญของอัลกอริธึมนี้: มันทำการเรียงลำดับฟองอากาศในรายการการเปลี่ยนแปลงโดยการย้ายมิติที่อยู่ใกล้เคียงเมื่อดัชนีการเปลี่ยนแปลงที่สอดคล้องกันถูกสลับ
ตามที่กำหนดไว้โดยการclass P a
ประกาศในกรณีใด ๆp
จะใช้เวลาสองข้อโต้แย้งการเปลี่ยนแปลง (ประเภทเสมอ[Int]
) และอาร์เรย์
- การเปลี่ยนแปลงสามารถให้ในแบบฟอร์มในคำอธิบายการท้าทายถึงแม้ว่าวิธีการทำงานของอัลกอริทึมตัวเลือกของดัชนีมีอิสระโดยพลยกเว้นสำหรับลำดับญาติ (ดังนั้นการทำงานทั้ง 0- และ 1)
- ฐาน
instance P Int
จัดการอาร์เรย์ของมิติ 1 ซึ่งp
ส่งกลับค่าไม่เปลี่ยนแปลงเนื่องจากมิติเดียวสามารถแมปกับตัวเองเท่านั้น
- อีกชุดหนึ่ง
instance P a => P [a]
ถูกกำหนดแบบเรียกซ้ำp
ด้วยการเรียกมิติย่อยnเพื่อกำหนดให้มิติอาร์เรย์
n + 1
p(x:r)m
การเรียกครั้งแรกp r
ซ้ำ ๆ ในทุก ๆ องค์ประกอบของการm
ให้อาร์เรย์ผลn
ที่ทุกมิติยกเว้นการแรกได้รับอนุญาตอย่างถูกต้องค่อนข้างสัมพันธ์กัน
- ส่วนที่เหลืออีกการเปลี่ยนแปลงที่จะต้องดำเนินการบนจะได้รับจาก
n
x:y:z = x:sort r
- หาก
x<y
มิติแรกของn
วางไว้อย่างถูกต้องแล้วจะถูกn
ส่งกลับ
- ถ้าหากจำเป็นต้องสลับ
x>y
มิติแรกและมิติที่สองn
ซึ่งทำกับtranspose
ฟังก์ชัน สุดท้ายp(x:z)
จะถูกนำไปใช้ซ้ำกับองค์ประกอบทุกส่วนของผลลัพธ์เพื่อให้แน่ใจว่ามิติแรกเริ่มแรกถูกย้ายไปยังตำแหน่งที่เหมาะสม
exec
(บันทึกสองไบต์)เนื่องจากเป็นคำสั่งใน Python 2