生物情報科学版 Project Euler といったおもむき。
やり方は最初の問題を開いてみればわかるはず。問題IDはその分野の用語っぽかったり? としゃれこんでいる。
http://rosalind.info/problems/dna/問題ID:DNA ヌクレオチドの数え上げ
与えられたDNA文字列に含まれるそれぞれのヌクレオチドを数え上げる(文字列はアルファベットA,C,G,Tを含む。例:"ATGCTTCAGAAAGGTCTTACG")。
入力
長さ1000以下のDNA文字列。
出力
に含まれるA,C,G,Tの数を4つの整数としてこの順番にスペース区切りで出力。
サンプルデータ
AGCTTTTCATTCTGACTGCAACGGGCAATATGTCTCTGTGTGGATTAAAAAAAGAGTGTCTGATAGCAGCサンプルに対するアウトプット例
20 12 17 21
解答はページ下部のDownload Datasetから入力ファイルをダウンロードして行う(ファイル名の形式はrosalind_{問題IDの小文字}.txt)。
時間制限があり、ダウンロードボタンを押してから5分以内に答える必要がある。このへんはGoogle Code Jamっぽい?
制限時間に引っかからないためにもまず問題をしっかり吟味し、サンプルデータに対して正しい答えを出すコードを用意しておきましょう!
それぞれの問題にはゆるやかな関連性があり、簡単な問題を解くとそれよりも一段階難しい関連問題がレコメンドされるようになっている。
どうやらサイト自体が今年の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)である場合があるということだ。この場合、UnixやMacintoshでは改行を含む文字列を扱うことができない。
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の二重らせん構造発見に貢献したロザリンド・フランクリンのことのようです。
ダークレディと呼ばれて 二重らせん発見とロザリンド・フランクリンの真実
- 作者: ブレンダ・マドックス,福岡伸一,鹿田昌美
- 出版社/メーカー: 化学同人
- 発売日: 2005/08/10
- メディア: 単行本
- 購入: 1人 クリック: 21回
- この商品を含むブログ (37件) を見る
ひとこと
サイトを知った経緯。redditをRSSで流し読んでたらたまたま目に入った。
I want to be better at solving algorithmic problems. : algorithms