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くらいにする必要はあると思うが、最初の数値への変換設定を増やせばいいだけだ。