การเต้นรำในหลายมิติ


19

ท้าทาย

กำหนดnอาร์เรย์ -dimensional ของจำนวนเต็มและการเรียงลำดับของnจำนวนธรรมชาติแรกให้เปลี่ยนขนาดอาร์เรย์ตามลำดับ

รายละเอียด

ความท้าทายนี้เป็นแรงบันดาลใจ permuteMATLABs การสาธิต การเรียงสับเปลี่ยนจะได้รับเป็นรายการจำนวนเต็มเช่น[1,3,2]หมายถึง 1 ได้รับการแมปกับ 1, 2 ได้รับการแมปกับ 3 และ 3 ได้รับการแมปที่ 2 (นี่iคือรายการที่ th คือค่าที่iได้รับการแมป) แต่คุณสามารถใช้รูปแบบอื่นที่สะดวกเช่นรอบหรือฟังก์ชั่น ถ้าสะดวกยิ่งขึ้นคุณสามารถใช้การจัดทำดัชนีแบบ 0

อาร์เรย์สามารถสันนิษฐานได้ว่าเป็น "รูปสี่เหลี่ยมผืนผ้า" เต็มรูปแบบ - m1 x m2 x ... x mn(เช่นคุณสามารถสมมติได้ว่ามันไม่ได้เป็นขรุขระ / ขรุขระ )

คุณสามารถสันนิษฐานได้ว่าnไม่ใหญ่เกินไปเนื่องจากหลายภาษามีข้อ จำกัด ด้านขนาดในอาร์เรย์ซ้อน

หากภาษาของคุณไม่รองรับอาเรย์หลายมิติคุณสามารถใช้สตริงที่แทนอาร์เรย์เป็นอินพุทได้

ตัวอย่าง

  • nอาร์เรย์มิติใด ๆ ที่มีการเปลี่ยนค่าตัวตน[1,2,3,...,n]จะไม่มีการเปลี่ยนแปลง
  • อาร์เรย์[[10,20,30],[40,50,60]]ที่มีการเปลี่ยนลําดับได้รับการแมปไป[2,1][[10,40],[20,50],[30,60]]
  • อาร์เรย์[[[1,2],[3,4]],[[5,6],[7,8]]]ที่มีการเปลี่ยนลําดับได้รับการแมปไป[2,3,1][[[1,3],[5,7]],[[2,4],[6,8]]]

คำตอบ:


13

9

Haskell , 168 ไบต์

pเป็นฟังก์ชั่น (ประเภทคลาส polymorphic) ที่ใช้การเรียงสับเปลี่ยนเป็นรายการของInts และรายการซ้อนที่แสดงอาร์เรย์หลายมิติของInts

โทรเป็น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ที่ทุกมิติยกเว้นการแรกได้รับอนุญาตอย่างถูกต้องค่อนข้างสัมพันธ์กัน
    • ส่วนที่เหลืออีกการเปลี่ยนแปลงที่จะต้องดำเนินการบนจะได้รับจากnx:y:z = x:sort r
    • หากx<yมิติแรกของnวางไว้อย่างถูกต้องแล้วจะถูกnส่งกลับ
    • ถ้าหากจำเป็นต้องสลับx>yมิติแรกและมิติที่สองnซึ่งทำกับtransposeฟังก์ชัน สุดท้ายp(x:z)จะถูกนำไปใช้ซ้ำกับองค์ประกอบทุกส่วนของผลลัพธ์เพื่อให้แน่ใจว่ามิติแรกเริ่มแรกถูกย้ายไปยังตำแหน่งที่เหมาะสม

3

Python 2 , 312 ไบต์

สิ่งนี้ใช้การจัดทำดัชนี 0 สำหรับการเปลี่ยนแปลง

from numpy import*
from itertools import*
z=range
def f(i,r):
	l=array(i).shape;R={b:a for a,b in enumerate(r)};r=len(r);m=eval('['*r+'0'+q('for k in z(l[R[%s]])]',r-1,-1,-1))
	for d in product(*[z(p) for p in l]):exec'm'+q('[d[R[%s]]]',r)+'=i'+q('[d[%s]]',r)
	return m
q=lambda s,*j:''.join(s%(j)for j in z(*j))

ลองออนไลน์!

-2 ไบต์ขอบคุณ @Jonathan Frech


คุณไม่จำเป็นต้องใช้วงเล็บในการโทรexec (บันทึกสองไบต์)เนื่องจากเป็นคำสั่งใน Python 2
Jonathan Frech

z(p) forนอกจากนี้ยังมีพื้นที่ในฟุ่มเฟือย
Jonathan Frech

1
มือสองmap(z,l), s%jและprintสำหรับ 301 ไบต์ - ลองมันออนไลน์!
นาย Xcoder

3

Python 2 , 41 25 ไบต์

import numpy
numpy.einsum

ลองออนไลน์!

เวกเตอร์การเรียงสับเปลี่ยนpจะได้รับเป็นสตริงตัวอักษร ดังนั้นสามารถจะได้รับเป็น[2,3,1]'bca'

ขอบคุณ @EriktheOutgolfer บันทึก 16 ไบต์แล้ว!


สิ่งนี้รองรับมากกว่า 26 มิติหรือไม่
Erik the Outgolfer

อันที่จริงไม่เกิน 52 มิติ: ตัวพิมพ์ใหญ่ + ตัวพิมพ์เล็ก
rahnema1

2

JavaScript (ES6), 136 132 ไบต์

(a,p,v=[],r=[],g=(a,[d,...p],_,h=(r,[i,...v])=>1/v[0]?h(r[i]=r[i]||[],v):r[i]=a)=>1/d?a.map((e,i)=>g(e,p,v[d]=i)):h(r,v))=>g(a,p)&&r

0 การจัดทำดัชนี คำอธิบาย: giterates ซ้ำมากกว่าอาร์เรย์aสร้างอาร์เรย์ของดัชนีตับแลบโดยใช้การเปลี่ยนลําดับv pครั้งเดียวpหมดhแล้วแทรกองค์ประกอบซ้ำลงในอาร์เรย์ผลrโดยใช้ดัชนีดัด

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