日付の2進数変換

awkは必要最小限の関数しか用意されていません。
perlのreverseとか2進数に変換するのもないので、全て自前で作る必要があります。
これは、逆にアルゴリズムを勉強するチャンスです。
では、問題です。

年月をYYYYMMDDの8桁の整数で表したとき、これを2進数に変換して逆から並べ、
さらに10進数に戻したとき、元の日付と同じ日付になるものを探してください。
期間は、前回の東京オリンピック(1964年10月10日)から、次回の東京オリンピック
(2020年7月24日)とします。

例)1996年7月13日の場合
①YYYYMMDDのフォーマット→19660713
②2進数に変換
③2進数を逆から並べる
④逆から並べた2進数を10進数に戻す→19660713

これも素直にコードを書けば出来ますね。

#!/usr/bin/gawk -f

BEGIN{
    begin = mktime("1964 10 10 00 00 00");
    start =  strftime("%Y%m%d",begin);
    end = 20200724;
    d = 1;
    while(start <= end){
        nishin = bit(start);
        reverse_nishin = reverse(nishin);
        if(nishin == reverse_nishin){
            print start;
        }
        start =strftime("%Y%m%d",begin + 60*60*24*d);
        d++;
    }

}

function bit(num,   amari,bit_num){
    while(num > 1){
        amari = num % 2;
        num = int(num / 2);
        bit_num = amari bit_num ;
    }
    return 1 bit_num;
}

function reverse(num,   rev_num){
    len = split(num,a,"");
    for(i = 1; i <= len; i++){
        rev_num = a[i] rev_num;
    }
    return rev_num;
}

実行してみます。

awk -f q07.awk
19660713
19660905
19770217
19950617
20020505
20130201

想像していたより、結構ありました。