seri::diary

日常

コーディングテスト 例題を解いてみた

たまたま見つけたのでやってみた。
問題はcgios technologiesの採用試験の過去問から


(1)はfor文3つ回して4の3乗だけループ回して
ゴリ押しで何とかなるレベルなので割愛。

(3)も大人しく正規表現使いなさいよ、ということで割愛


問題は(2)で、これは数学の問題でもよくある
「問1のホゲホゲがn個の時の式を求めなさい」っていう汎用パターンを求める問題。

問題文引用
(2) 4種類のアルファベット "A,C,G,T" から成るn文字の文字列を全て列挙するプログラムを書きなさい。ただし、nは1以上の整数とし、その他の条件は(1)と同じであるものとします。


cgios technologiesの募集要項見ると
perljavaで回答、とあったけど
とりあえずphpで回答。

<?php
set_time_limit(120);

class joinCharClass{
    
    public $joinedCharStack = "";
    public $count = 0;
    
    public function __construct($joinedCharStack){
        $this->joinedCharStack = $joinedCharStack;
    }
    
    public function printStrings($joinedChar){

        if($this->joinedCharStack !== $joinedChar){
            $this->joinedCharStack = $joinedChar;
            echo $this->joinedCharStack . " \n";
            $this->count++;
            return;
        }else{
            return;
        }
    }

   
    public function joinChar($n, $char, $joinedChar ){
 
        if($n == 0){
            $this->printStrings($joinedChar);
            return;
        }
        
        $joinedChar .= $char;
        --$n;
        
       $this->joinChar($n, "A" ,$joinedChar);
       $this->joinChar($n, "C" ,$joinedChar);
       $this->joinChar($n, "G" ,$joinedChar);
       $this->joinChar($n, "T" ,$joinedChar);
    }
}

$jS = new joinCharClass("");

$jS->joinChar(10, "A", "");
$jS->joinChar(10, "C", "");
$jS->joinChar(10, "G", "");
$jS->joinChar(10, "T", "");

echo "表示文字列数:" . $jS->count;

最初はもうちょいシンプルに書いていたのだが
1文字目を指定して、その次に続く文字列を指定して再起呼び出しすると
何故か同じパターンが4つ表示されるという現象が発生した。

色々検証したが対応できなかったので、仕方なく重複した場合は表示しないという
ちょっと無駄な処理を入れて対応。

突っ込みどころ満載かと思うので色々突っ込んでいただければ幸いです。