我想知道存在哪些算法或方法能够解决以下问题。
具有两个数组:
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]
将来的目标是使用更长的数组,并声明更多的函数。
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()