strlen関数を、ループを使用しないで実現してください

とある書籍を読み返していて、

strlen関数を、ループを使用しないで実現してください

という文章が目に留まってちょいと気になった(スイッチが入った)ので、実際に書いてみた。所要時間は10分らしい。

久しぶりのC言語で、以下、私なりの答え。

#include <stdio.h>
#include <stdlib.h>
size_t strlen(const char *s) {
    return (*s != '\0' ? 1 + strlen(++s) : 0);
}
int main(void) {
    char *s = "hello, world.";
    printf("strlen(%s): %d\n", s, strlen(s));
    return EXIT_SUCCESS;
}

……所要時間約8分。

‘\0′を検出するまで再帰的に調べる方法ぐらいしか思いつかなかった。

2010年01月20日(水) 23時12分  

1年分の年月日を生成する

1年分の年月日を生成する場合、大抵はExcelを使ったり、プログラムを作って生成しまう場合が多い。

この1年分の年月日をSQLで生成生成する場合は、以下のようなSQL文を発行すれば生成できる。

 /*1年分の年月日生成*/
 select date_format(date_add('20100101', interval(number) day), '%Y%m%d') as yyyymmdd
 from (
   select hundred.n + tens.n + ones.n as number
   from (
     select 0 as n union all
     select 1 as n union all
     select 2 as n union all
     select 3 as n union all
     select 4 as n union all
     select 5 as n union all
     select 6 as n union all
     select 7 as n union all
     select 8 as n union all
     select 9 as n
   ) as ones cross join (
     select 0 as n union all
     select 10 as n union all
     select 20 as n union all
     select 30 as n union all
     select 40 as n union all
     select 50 as n union all
     select 60 as n union all
     select 70 as n union all
     select 80 as n union all
     select 90 as n
   ) as tens cross join (
     select 0 as n union all
     select 100 as n union all
     select 200 as n union all
     select 300 as n
   ) as hundred
 ) as dummy
 where date_format(date_add('20100101', interval(number) day), '%Y%m%d') < '20110101'
 order by yyyymmdd asc;

データベースに接続できる環境ならば、上記のSQL文をプログラムを書くよりも早いかもしれない。

2010年01月09日(土) 23時43分