cgios.comさんの過去問、DNA問題を解いた
ここのページの問題。
以下回答ソース。
(2)が超難しかった。
(3)はおそらく(2)の出力課程でフィルタリングするだけだと思うので省略。
(2)で苦戦したなー。4のn乗ループってどうやるのか初めて考えた。
4進数のDNA(アデニン (A) 、グアニン (G) 、チミン (T) 、シトシン (C) )ではなく、
おなじみの10進数(0から9までの10通りの整数)で考えるとやりやすかった。
以下ソース。
関数oneやtwoが問題(1), (2)の回答ソースになっている。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
<?php /* (1) 4種類のアルファベット "A,C,G,T" から成る3文字の文字列を全て列挙するプログラムを書きなさい。ただし、文字列内に同じアルファベットが出現しても構わないものとし、出力順序は問わないものとします。 (2) 4種類のアルファベット "A,C,G,T" から成るn文字の文字列を全て列挙するプログラムを書きなさい。ただし、nは1以上の整数とし、その他の条件は(1)と同じであるものとします。 (3) 4種類のアルファベット "A,C,G,T" から成るn文字の文字列のうち、"AAG"という並びが含まれる文字列を全て列挙するプログラムを書きなさい。ただし、nは3以上の整数とし、その他の条件は(1)と同じであるものとします。 */ // one(); two(4); function one(){ $first = ["A", "C", "G", "T"]; $second = ["A", "C", "G", "T"]; $third = ["A", "C", "G", "T"]; foreach($first as $f){ foreach($second as $s){ foreach($third as $t){ echo $f . $s . $t . PHP_EOL; } } } } function two(int $n){ // ガード if($n<1){ return; } $dnArray = ["A", "C", "G", "T"]; // $dnArray = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]; $base = count($dnArray); for($i=0; $i<pow($base, $n); $i++){ for($j=0; $j<$n; $j++){ $num = intval($i / pow($base, $j)); $outputIdxes[$j] = $num % $base; } two_output($outputIdxes, $dnArray); } } function two_output($outputIdxes, $dnArray){ foreach($outputIdxes as $key => $value){ $output[$key] = $dnArray[$value]; } for($i=count($output)-1; 0<=$i; $i--){ echo $output[$i]; } echo PHP_EOL; } |
例によってpaiza.ioで実行できる