課題
AAAA, AAAC, AAAG, AAAT, AACA, AACC, ..., TTTTと、4塩基からなるDNA塩基配列を全て列挙する。
これを1行1配列の形式でテキストファイルにセーブする。
検討
文字列をいじるんだから、そりゃ使うツールはperlだろう。
単純に考えれば4重forループを作ってその中で文字列を連結して出力すればよい。
だが、幾らなんでも安直というか。第一、4ぐらいならいいがこれを10とか20とかに拡張する必要が生じたとしたらどうする?
解決
標準ではないモジュールに頼っているのが癪ではあるが、思いつく限りではこれが一番簡単だった。
perl -MMath::BaseCalc -le '$n=4; $x=new Math::BaseCalc(digits=>[qw/A C G T/]); map {print substr('A' x $n.$x->to_base($_), -$n)} 0..4**$n-1' > output.txt
塩基配列を4進数の数字と捉えて処理している。先頭の$nの定義を変更してやれば、塩基数が10でも200でも1000でも問題なく処理できるはずだ、多分。
おわりに
もっとクールな方法をご存じの方はコメントで教えてください。
追記
私が書いたものより遥かにクールなコードを書いた方がさっそく現れた。
それによれば、以下でいける。
perl -E "say for <@{['{A,C,G,T}' x 4]}>"
ふつうはファイル名の展開に使うglobをこう云うふうに使うアイディア、@{[]}
記法の応用など、いずれも私の引き出しにはないものだった。
perlを使いはじめて何年もたつが、本当に奥が深い。いまだ深淵を見通すこと叶わず。