ruby - 如何制作最大长度为 5 的不同长度的字母 (a-z) 数组

ruby - How to make an array of arrays of letters (a-z) of varying lengths with maximum length five

所以我正在尝试制作一个包含字母表字母(全部小写)的所有可能排列的数组,其中字母可以重复并且长度从 1 到 5 不等。例如,这些是一些可能性将在数组中:

['this','is','some','examp','le']

我试过了,它得到了 5 个字母长的单词的所有变体,但我不知道如何找到变长。

("a".."z").to_a.repeated_permutation(5).map(&:join)

编辑:

我正在尝试这样做以破解 SHA1 加密字符串:

require 'digest'
def decrypt_string(hash)
  ("a".."z").to_a.repeated_permutation(5).map(&:join).find {|elem| Digest::SHA1.hexdigest(elem) == hash}
end

Hash是单词的SHA1加密,如'e6fb06210fafc02fd7479ddbed2d042cc3a5155e'

如果您不介意重复字符串的可能性,那么

e = Enumerator.new do |y| 
  r = ('a'..'z').to_a * 5
  loop do 
    y << r.shuffle.take(rand(4)+1).join
  end
end

应该可以。然后你可以调用 as

e.take(10) 
#=> ["bz", "tnld", "jv", "s", "ngrm", "phiy", "ar", "zq", "ajjn", "cn"]

这个:

  • 创建 a 到 z 的 Array 重复 5 次
  • 不断洗牌说Array
  • 然后从打乱的 Array 中取出前 1 到 5 个(“随机数”)元素并将它们连接在一起

您可以稍微修改一下您的方法。

require 'digest'

def decrypt_string(hash)
  arr = ("a".."z").to_a
  (1..5).each do |n|
    arr.repeated_permutation(n) do |a|
      s = a.join
      return s if Digest::SHA1.hexdigest(s) == hash
    end
  end
end
word = "cat"
hash = Digest::SHA1.hexdigest(word)
  #=> "9d989e8d27dc9e0ec3389fc855f142c3d40f0c50"
decrypt_string(hash)
  #=> "cat"
word = "zebra"
hash = Digest::SHA1.hexdigest(word)
  #=> "38aa53de31c04bcfae9163cc23b7963ed9cf90f7"
decrypt_string(hash)
  #=> "zebra"

"cat" 的计算在我的 2020 Macbook Pro 上花费了不到一秒钟的时间; "zebra" 的那些花了大约 15 秒。

请注意,join 应在 repeated_permutation 的块中应用,因为 repeated_permutation(n).map(&:join) 会创建一个包含多达 26**5 #=> 11,881,376 个元素的临时数组(对于 n = 5).