gpt4 book ai didi

ruby - 了解 Ruby 的 repeated_permutation 方法的源代码

转载 作者:太空宇宙 更新时间:2023-11-03 16:06:54 24 4
gpt4 key购买 nike

我一直在用 Ruby 构建智能 Mastermind 游戏。在我的游戏中,如果您选择让计算机扮演密码破解者的选项,计算机会对密码制造者的密码进行有根据的猜测。

作为我算法的一部分,计算机首先查看所有可能代码的完整列表。

例如,如果有6种颜色可供选择(红橙蓝绿紫黄),代码由4种颜色组成(允许重复),那么要查看所有可能的代码,可以这样做:

valid_colors = %w(red orange blue green purple yellow)
all_possible_codes = valid_colors.repeated_permutation(4).to_a

all_possible_codes 将是一个数组,其中填充了代表所有可能代码的数组。然后,计算机从每个猜测中获得反馈,然后从该列表中删除代码。

然而,接下来我要做的是使用 JRuby 1.6.6,它使用 Ruby 1.8.7,它没有 repeated_permutation 方法。我需要编写自己的具有相同功能的方法。

所以我去了这里找到的源代码:http://www.ruby-doc.org/core-1.9.3/Array.html#method-i-repeated_permutation

不幸的是,我不明白他们在做什么,也不明白我该如何通过编写自己的方法来解决这个问题。我对编程还很陌生,一直无法弄清楚这一点。如果能帮助理解源代码,我们将不胜感激!

最佳答案

您链接的代码调用了 rpermute0,它完成了大部分工作,Array.c 中 rpermute0 的源代码是

static void
rpermute0(long n, long r, long *p, long index, VALUE values)
{
long i, j;
for (i = 0; i < n; i++) {
p[index] = i;
if (index < r-1) { /* if not done yet */
rpermute0(n, r, p, index+1, values); /* recurse */
}
else {
/* We have a complete permutation of array indexes */
/* Build a ruby array of the corresponding values */
/* And yield it to the associated block */
VALUE result = rb_ary_new2(r);
VALUE *result_array = RARRAY_PTR(result);
const VALUE *values_array = RARRAY_PTR(values);

for (j = 0; j < r; j++) result_array[j] = values_array[p[j]];
ARY_SET_LEN(result, r);
rb_yield(result);
if (RBASIC(values)->klass) {
rb_raise(rb_eRuntimeError, "repeated permute reentered");
}
}
}
}

基本上是一种蛮力,从 0 开始每次迭代返回一个排列。 ruby 版本是这样的

require 'pp'

def rpermute(numRepeat, pArray, index, originArray)
0.upto(originArray.length-1) do |i|
pArray[index] = i
if index < numRepeat-1
rpermute(numRepeat, pArray, index+1, originArray)
else
result = Array.new
0.upto(numRepeat-1) do |j|
result[j] = originArray[pArray[j]]
end
pp result
end
end
end

originArray1 = [1,2,3,4,5]
originArray2 = ['a','b','c','d','e']
pArray = []

rpermute(4, pArray, 0, originArray1)
rpermute(4, pArray, 0, originArray2)

我测试了上面的代码,它打印出所有长度为 4 的排列,你可能想将它们放入数组中。

关于ruby - 了解 Ruby 的 repeated_permutation 方法的源代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12161627/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com