Database JUNKY

MySQL,MariaDBを中心としたブログです

プログラミングテストの問題をMySQL ストアドプロシージャで解答する

最近更新していないのすこし休憩・・以下に記載している問題を、SQLなんかでやったら評価的には、おそらく「プログラミング能力不適合者」に認定されること必至なのでマネしないように・・・この問題・・前職での問題なのですが、利用する言語はなんでもよく、おそらくコードの可読性とか考え方を採点するものだと思われ・・(こんなの書かれたらきっと評価者は、解答自体を評価せずすっとばすでしょうww

ちゃんとした解答は、前職におりました。スーパープログラマ的な人が以下のサイトで紹介しております。

プログラミングテスト

その中に書かれている問題は以下の通りです。

与えられた文字列に対して、数字を挿入する関数を記述してください。
挿入ルールは、最初に”1″、1文字あけて”2″、2文字あけて”3”、・・・(英字が与えられる前提でOK、スペースやカンマも1文字と数える。)
ただし最後は、あける文字数によらず数字で終わらせる。

例)
Hello Jason, how are you?
→1H2el3lo 4Jaso5n, ho6w are 7you?8

・・ボクなりにがんばったのが以下のSQL(プロシージャ)

mysql> DELIMITER //
mysql> CREATE FUNCTION q1(_word varchar(500)) RETURNS varchar(600) DETERMINISTIC
    -> BEGIN
    ->   DECLARE _resultword varchar(600);
    ->   DECLARE _work       varchar(600);
    ->   DECLARE _work2       varchar(600);
    ->
    ->
    ->   declare _cnt1 int;
    ->   declare _cnt2 int;
    ->
    ->     set _resultword = '';
    ->
    ->     set _cnt1 = 1;
    ->     set _cnt2 = 1;
    ->
    ->     set _resultword = '';
    ->     set _work = '';
    ->     set _work2 = '';
    ->
    ->     set _work2 = concat('1',substr(_word,1,1));
    ->
    ->     while _cnt2 <= length(_word) do
    ->       set _cnt2 = _cnt1 + _cnt2;
    ->       set _work = concat(substr(_word,_cnt2,_cnt1 + 1));
    ->       set _work2 = concat(_work2,_cnt1 + 1,_work);
    ->
    ->       set _cnt1 = _cnt1 + 1;
    ->
    ->     end while;
    ->
    ->     SET _resultword = _work2;
    ->
    ->   RETURN _resultword;
    ->
    -> END;
    -> //
Query OK, 0 rows affected (0.00 sec)

mysql> DELIMITER ;

・結果は以下の通りです

mysql> select q1('Hello Jason, how are you?') ;
+-----------------------------------+
| q1('Hello Jason, how are you?')   |
+-----------------------------------+
| 1H2el3lo 4Jaso5n, ho6w are 7you?8 |
+-----------------------------------+
1 row in set (0.00 sec)