存在使用特定函数从数组的一个顺序转换到另一个顺序的算法吗?

问题描述 投票:0回答:1

我想知道存在哪些算法或方法能够解决以下问题。

具有两个数组:

arr_start = [1,2,3,4,5,6]
arr_finish = [5,3,6,1,4,2]

[并声明一些特定的功能,例如这两个功能,其中第一个功能在第n个元素中切割数组,就像切割一副纸牌,而第二个功能则进行法鲁混洗(这是完美的混洗):

def cut_arr(n,arr):
r=[1]*len(arr)
for i in range(len(arr)):
    if (i+n)<len(arr):
        r[i] = arr[i+n]
    else:
        r[i] = arr[i+n-len(arr)]
return r


def faro_shuffle(arr):
r = []

for (a, b) in zip(arr[0:3], arr[3:]):
    r.append(a)
    r.append(b)
arr = r
return r

该算法的目标是找出从arr_start到arr_finish确定最短路径必须使用多少次声明的函数以及使用哪些声明的函数。

在此示例中,我要的算法将告诉我们进行一次法拉西洗,然后在第三个元素中剪切数组,从arr_start开始获得arr_finish。

arr1 = faro_shuffle(arr_start)
cut_arr(3,arr1)

Output: [5,3,6,1,4,2]

将来的目标是使用更长的数组,并声明更多的函数。

algorithm sorting heuristics
1个回答
0
投票
[可能是最简单的算法(也是我唯一想到的算法)是随着

n的增加,生成函数的[[n倍Cartesian product s,然后依次应用结果集。可以通过为每个可能的值复制函数来处理该函数的参数。该示例程序(可以使用其他功能进行扩展)找到给定问题的解决方案:

arr_start = [1,2,3,4,5,6] arr_finish = [5,3,6,1,4,2] def cut_arr(n,arr): r=[1]*len(arr) for i in range(len(arr)): if (i+n)<len(arr): r[i] = arr[i+n] else: r[i] = arr[i+n-len(arr)] return r def faro_shuffle(arr): r = [] for (a, b) in zip(arr[0:3], arr[3:]): r.append(a) r.append(b) arr = r return r # make a list with the available functions ## for a function with an argument n, replicate it for all possible n ## for a function without an extra n, specify argument None functions = [(cut_arr, i) for i in range(len(arr_start))] \ + [(faro_shuffle, None)] import itertools for r in itertools.count(0): for c in itertools.product(functions, repeat=r): print("TRYING", c) arr = arr_start for f in c: func, argn = f arr = func(arr) if argn is None else func(argn, arr) if arr == arr_finish: print("SUCCESS") quit()
© www.soinside.com 2019 - 2024. All rights reserved.