多方面的舞蹈


19

挑战

给定n整数维数组和第一个n自然数的排列,请相应地排列数组维。

细节

这一挑战是受MATLAB启发的permute演示 排列以整数列表形式给出,例如,[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]]]

Answers:



9

Haskell,168个字节

p是一个(类型类多态的)函数,将排列作为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解析函数需要知道您要解析的值的类型。

结果,该程序似乎不可避免地需要包含与类型相关的声明,这些声明相对冗长。对于打高尔夫球的部分,我决定定义一个类型类P,以便p可以在数组的类型上进行多态处理。

同时,TIO的测试工具显示了一种解决解析问题的方法。

怎么运行的

  • 总结此算法的实质:在置换列表上执行冒泡排序,在交换相应的置换索引时转置相邻维度。

  • 正如class P a声明所给的,在任何情况下,p它都带有两个参数,即一个置换(始终为type [Int])和一个数组。

  • 排列可以挑战说明中的形式给出,尽管算法的工作方式是,索引的选择是任意的,除了它们的相对顺序。(因此,基于0和1的工作。)
  • 基数instance P Int处理维度为1的数组,该数组p仅返回不变,因为一个维度只能映射到自身。
  • 另一个instance P a => P [a]是递归定义的,p使用n维子数组进行调用,以便为n + 1维数组定义它。
    • p(x:r)mfirst p r对的每个元素进行递归调用m,得到一个结果数组n,其中除第一个维度外的所有维度都相对彼此正确地进行了排列。
    • 需要执行的剩余排列n由给出x:y:z = x:sort r
    • 如果是x<yn则已经正确放置的第一个维度,并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的声明
乔纳森富来

在那里还有一个多余的空间z(p) for
乔纳森·弗雷希

1
已使用map(z,l)s%j并且print为301字节- 在线试用!
Xcoder先生18年


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索引。说明:g递归地遍历数组,以a建立v使用permutation重新排序的索引数组p。一旦p用尽,h就可以r使用置换后的索引将元素递归插入结果数组。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.