バイオインフォマティックス学習サイトROSALINDが面白い

生物情報科学Project Euler といったおもむき。

ROSALIND | Problems

やり方は最初の問題を開いてみればわかるはず。問題IDはその分野の用語っぽかったり? としゃれこんでいる。

問題ID:DNA ヌクレオチドの数え上げ

与えられたDNA文字列に含まれるそれぞれのヌクレオチドを数え上げる(文字列はアルファベットA,C,G,Tを含む。例:"ATGCTTCAGAAAGGTCTTACG")。

入力

長さ1000以下のDNA文字列s

出力

sに含まれるA,C,G,Tの数を4つの整数としてこの順番にスペース区切りで出力。

サンプルデータ
AGCTTTTCATTCTGACTGCAACGGGCAATATGTCTCTGTGTGGATTAAAAAAAGAGTGTCTGATAGCAGC
サンプルに対するアウトプット例
20 12 17 21
http://rosalind.info/problems/dna/

解答はページ下部のDownload Datasetから入力ファイルをダウンロードして行う(ファイル名の形式はrosalind_{問題IDの小文字}.txt)。
時間制限があり、ダウンロードボタンを押してから5分以内に答える必要がある。このへんはGoogle Code Jamっぽい?
制限時間に引っかからないためにもまず問題をしっかり吟味し、サンプルデータに対して正しい答えを出すコードを用意しておきましょう!

それぞれの問題にはゆるやかな関連性があり、簡単な問題を解くとそれよりも一段階難しい関連問題がレコメンドされるようになっている。

ROSALIND as graph

どうやらサイト自体が今年の7月ごろできたばかりのようで、まだ問題数も少ないが(66問, 2012.11.8現在)、利用者からの問題提出も受け付けているのでラインナップはこれからどんどん増えていくはず。

Pythonで問題を解く場合のTips

問題を解くときはもちろんどのようなプログラム言語を使っても構わないが、ROSALINDはPythonを推していたりする。
それぞれの問題については、いったん正答したあとは他の人の公開したソースを読むことができる。そして利用者もPythonで書いている人が多い印象がある。プログラミング初学者でROSALINDを始めてみようという人はこの機会にPythonを学んでみるのもよいかもしれない。

入力ファイル読み込みの小技

ファイルのオープンは普通次のように行う。

f = open("problem.txt")
text = f.read()
# ... テキストを処理する
f.close()

この方法だと、ファイルオブジェクトは不要になった時を見計らって明示的にcloseする必要がある。
これはwith文を使うと、ブロックを抜けるさい自動的に閉じてくれるようになる。

with open("problem.txt") as f:
    lines = f.readlines()
    # ... 処理 ...
改行のあるテキストファイルを読み込む

さて、ROSALINDの入力データには改行の含まれるものも存在する。問題は、入力データの改行フォーマットがWindowsのもの(CR CF)である場合があるということだ。この場合、UnixMacintoshでは改行を含む文字列を扱うことができない。
Pythonでこの問題を回避するにはopenに"U"オプションを付けてやればよい。

with open("problem.txt", "rU") as f:
    # ... 処理 ...

標準の fopen() における mode の値に加えて、 'U' または 'rU' を使うことができます。 Python が全改行文字サポートを行っている (標準ではしています) 場合、ファイルがテキストファイルで開かれますが、行末文字として Unix における慣行である '\n' 、Macintosh における慣行である '\r' 、 Windows における慣行である '\r\n' のいずれを使うこともできます。これらの改行文字の外部表現はどれも、 Python プログラムからは '\n' に見えます。

http://www.python.jp/doc/release/library/functions.html#open

あるいはリスト内包の中でrstripをかけてもよい。たとえばつぎのようなcons.txtがあったとすると、

ATCCAGCT
GGGCAACT
ATGGATCT
AAGCAACC
TTGGAACT
ATGCCATT
ATGGCACT

これを読み込むために以下のように書く。

>>> open("./cons.txt", "r").readlines() # これだと改行コードが残る
['ATCCAGCT\n', 'GGGCAACT\n', 'ATGGATCT\n', 'AAGCAACC\n', 'TTGGAACT\n', 'ATGCCATT\n', 'ATGGCACT\n']
>>> [line.rstrip() for line in open("rosalind_cons.txt").readlines()]
['ATCCAGCT', 'GGGCAACT', 'ATGGATCT', 'AAGCAACC', 'TTGGAACT', 'ATGCCATT', 'ATGGCACT']

Uオプションは問題ID:CONS 『Consensus and Profiles』の解答欄でのやりとりを見て知った。

ROSALINDとはなんのことか?

サイトのAbout見ればわかりますが、DNAの二重らせん構造発見に貢献したロザリンド・フランクリンのことのようです。

ロザリンド・フランクリン - Wikipedia
隠された科学者─ロザリンド・フランクリン─(pdf注意)

ダークレディと呼ばれて 二重らせん発見とロザリンド・フランクリンの真実

ダークレディと呼ばれて 二重らせん発見とロザリンド・フランクリンの真実

ひとこと

サイトを知った経緯。redditRSSで流し読んでたらたまたま目に入った。

I want to be better at solving algorithmic problems. : algorithms