摇摆假设 - 在 Ruby 中组合或排列字符串数组

4

我有一个包含4个字符串的Ruby数组

nucleotides = ['A', 'G', 'C', 'T']

我需要4的3次方个字符串组合。
new_array = ['AGC', 'AGT' .. 'TTT']

这是关于遗传学中的摇晃假说。能否有人解释一下我该如何使用Ruby实现这个假说呢?

它基于氨基酸三联密码子。因此,“UUU”、“UUC”编码苯丙氨酸,依此类推。 - Stacked-for-life
3个回答

5

使用Array#repeated_permutation

nucleotides = %w(A G C T)
nucleotides.repeated_permutation(3).map(&:join)
#=> ["AAA", "AAG", "AAC", "AAT", "AGA", "AGG", "AGC", "AGT", "ACA", "ACG", "ACC", "ACT", "ATA", "ATG", "ATC", "ATT", "GAA", "GAG", "GAC", "GAT", "GGA", "GGG", "GGC", "GGT", "GCA", "GCG", "GCC", "GCT", "GTA", "GTG", "GTC", "GTT", "CAA", "CAG", "CAC", "CAT", "CGA", "CGG", "CGC", "CGT", "CCA", "CCG", "CCC", "CCT", "CTA", "CTG", "CTC", "CTT", "TAA", "TAG", "TAC", "TAT", "TGA", "TGG", "TGC", "TGT", "TCA", "TCG", "TCC", "TCT", "TTA", "TTG", "TTC", "TTT"]

哈!没想到还有这个。 - fl00r
这在1.8.7中不起作用,但是一旦我们升级,它会非常有用。谢谢。 - Stacked-for-life

3
nucleotides = ['A', 'G', 'C', 'T'] 
(nucleotides*3).permutation(3).to_a.map(&:join).uniq
#=> ["AGC", "AGT", "AGA", "AGG", "ACG", "ACT", "ACA", "ACC", "ATG", "ATC", "ATA", "ATT", "AAG", "AAC", "AAT", "AAA", "GAC", "GAT", "GAA", "GAG", "GCA", "GCT", "GCG", "GCC", "GTA", "GTC", "GTG", "GTT", "GGA", "GGC", "GGT", "GGG", "CAG", "CAT", "CAA", "CAC", "CGA", "CGT", "CGG", "CGC", "CTA", "CTG", "CTC", "CTT", "CCA", "CCG", "CCT", "CCC", "TAG", "TAC", "TAA", "TAT", "TGA", "TGC", "TGG", "TGT", "TCA", "TCG", "TCC", "TCT", "TTA", "TTG", "TTC", "TTT"]

ACG 是有效的吗?还是只有 AGC 有效? - fl00r
这并不能给我所有的64个正确结果。排列并不会给出“AAA”和其他重复的结果。 - Stacked-for-life
1
@Stacked-for-life,实际上是这样的 :) (核苷酸*3).排列(3).转换为数组.映射(&:join).去重.include?("AAA") #=> true - fl00r
1
而:(核苷酸*3).permutation(3).to_a.map(&:join).uniq.size #=> 64 - fl00r
太棒了,我没有看到乘法器。这在Ruby 1.8.7中也适用。 - Stacked-for-life
@Stefan的回答可能更合适 :) - fl00r

0

Ruby内置了基本的组合枚举器。Array#repeated_permutation 应该能够产生所需的结果:

nucleotides.repeated_permutation(3).map(&:join)
#=> ["AAA", "AAG", ..., "TTT"]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接