Я пытаюсь получить среднюю длину fasta sequences с помощью Erlang. Файл FASTA выглядит следующим образом«Средняя длина последовательностей в файле fasta»: можете ли вы улучшить этот код Erlang?
>title1
ATGACTAGCTAGCAGCGATCGACCGTCGTACGC
ATCGATCGCATCGATGCTACGATCGATCATATA
ATGACTAGCTAGCAGCGATCGACCGTCGTACGC
ATCGATCGCATCGATGCTACGATCTCGTACGC
>title2
ATCGATCGCATCGATGCTACGATCTCGTACGC
ATGACTAGCTAGCAGCGATCGACCGTCGTACGC
ATCGATCGCATCGATGCTACGATCGATCATATA
ATGACTAGCTAGCAGCGATCGACCGTCGTACGC
>title3
ATCGATCGCATCGAT(...)
Я попытался answser этот вопрос с помощью следующей Erlang код:
-module(golf).
-export([test/0]).
line([],{Sequences,Total}) -> {Sequences,Total};
line(">" ++ Rest,{Sequences,Total}) -> {Sequences+1,Total};
line(L,{Sequences,Total}) -> {Sequences,Total+string:len(string:strip(L))}.
scanLines(S,Sequences,Total)->
case io:get_line(S,'') of
eof -> {Sequences,Total};
{error,_} ->{Sequences,Total};
Line -> {S2,T2}=line(Line,{Sequences,Total}), scanLines(S,S2,T2)
end .
test()->
{Sequences,Total}=scanLines(standard_io,0,0),
io:format("~p\n",[Total/(1.0*Sequences)]),
halt().
компиляции/выполнение:
erlc golf.erl
erl -noshell -s golf test < sequence.fasta
563.16
этот код кажется чтобы работать отлично для небольшого файла fasta, но для анализа большего размера требуется несколько часов (> 100Mo). Зачем ? Я новичок в Erlang, вы можете улучшить этот код?
См. Также оригинальную «задачу»: http://biostar.stackexchange.com/questions/1759 – Pierre
Вау, отличная коллекция нетривиальных образцов кода из широкого спектра языков. Благодаря! – sarnold