2

私はしばらくの間、これに頭を悩ませようとしてきましたが、良い解決策を思いつくことができませんでした. ここに行きます:

セット数が与えられた場合:

set1: A, T
set2: C
set3: A, C, G
set4: T
set5: G

セットのリストから可能なすべてのシーケンスを生成したいと考えています。この例では、シーケンスの長さは 5 ですが、約 20 までの長さにすることができます。位置 1 の場合、考えられる候補はそれぞれ「A」と「T」であり、位置 2 の場合、唯一のオプションは「C」です。の上。

上記の例の答えは次のようになります。

ACATG, ACCTG, ACGTG, TCATG, TCCTG, TCGTG

私はこれをルビーで行っており、マスター配列内の配列としてさまざまなセットを持っています:

[[A, T], [C], [A, C, G], [T], [G]]

最初は再帰的な解決策が最善だと思っていましたが、適切に設定する方法がわかりませんでした。

私の 2 番目のアイデアは、各セットのインデックスを持つ同じサイズの別の配列を作成することでした。したがって、00000 は「ACATG」の上の最初のシーケンスに対応し、10200 は「TCGTG」に対応します。00000 から始めて、最後のインデックスを 1 増やし、問題のセットの長さ (上記の set1 の場合は 2、set2 の場合は 1) でそれをモジュロします。

しかし、このソリューションについて考えれば考えるほど、この非常に小さな問題には複雑すぎるように思えました。私が見逃しているもっと簡単な解決策があるはずです。誰か助けてくれませんか?

/ニック

4

1 に答える 1

4

Ruby 1.8.7 の Array クラスには、問題の配列のデカルト積を返す Array#product メソッドがあります。

irb(main):001:0> ['A', 'T'].product(['C'], ['A', 'C', 'G'], ['T'], ['G'])
=> [["A", "C", "A", "T", "G"], ["A", "C", "C", "T", "G"], ["A", "C", "G", "T", "G"],     ["T", "C", "A", "T", "G"], ["T", "C", "C", "T", "G"], ["T", "C", "G", "T", "G"]]
于 2009-11-24T16:19:21.043 に答える