2008-01-28 23:28:15
RやY、そしてNに対応させてみた。足したら10になる組合わせとして設定している。
<?php $seq0 = ereg_replace("A","1",$argv[1]); $seq0 = ereg_replace("C","2",$seq0); $seq0 = ereg_replace("Y","3",$seq0); $seq0 = ereg_replace("N","5",$seq0); $seq0 = ereg_replace("R","7",$seq0); $seq0 = ereg_replace("G","8",$seq0); $seq0 = ereg_replace("T","9",$seq0); $seq1 = ereg_replace("A","1",strrev($argv[2])); $seq1 = ereg_replace("C","2",$seq1); $seq1 = ereg_replace("Y","3",$seq1); $seq1 = ereg_replace("N","5",$seq1); $seq1 = ereg_replace("R","7",$seq1); $seq1 = ereg_replace("G","8",$seq1); $seq1 = ereg_replace("T","9",$seq1); $seq0a = str_split($seq0); $seq1a = str_split($seq1); $res = array(); if(strlen($seq0) == strlen($seq1)){ for($i=0;$i<strlen($seq0);$i++){ array_push($res,($seq0a[$i]+$seq1a[$i])); } }else{ echo "二つの配列の長さが等しくありません。\n"; } $count = array_count_values($res); if($count[10]==strlen($seq0)){ echo "二つの塩基配列は互いに相補鎖です。\n"; }else{ echo "二つの塩基配列は互いに相補鎖ではありません。\n"; $dif = array(); for($j=0;$j<strlen($seq0);$j++){ if($res[$j]!=10){ array_push($dif,($j+1)); } } echo "異なっている位置: ".implode(",",array_unique($dif))."\n"; echo $argv[1]."\n"; echo strrev($argv[2])."\n"; for($k=1;$k<=strlen($argv[1]);$k++){ if(in_array($k,$dif)){ echo "*"; }else{ echo " "; } } echo "\n"; } ?>これをcomple.phpとでも名付けて保存し、php comple.php GGCCYTCTNA TNAGARGGTCと入力してみれば、
二つの塩基配列は互いに相補鎖ではありません。 異なっている位置: 2 GGCCYTCTNA CTGGRAGANT *と答えてくれる。実は三延期の組合わせの一文字表記というのもあるのだが、面倒臭いので今回は設定していない。足したら10ではなく、14くらいにする必要はあると思うが、最初の数値への変換設定を増やせばいいだけだ。