日付の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
想像していたより、結構ありました。