#author("2019-01-31T23:40:30+09:00","default:nobuoki","nobuoki")
* Q07 日付の2進数変換 [#pca402dd]
from &htmlinsert(amazontext,asin=B016QEE30G,text=プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問);

* 回答(osx版) [#v59cc0cf]
gseq 19641010 20200724 | gdate -f- +%Y%m%d 2>/dev/null | awk '$0=$1";obase=2;"$1";obase=10"' | bc | gsed '2~2s/./& /g' | awk '{printf $0" "}NR%2==0{print ""}' | awk '{l=2;r=NF;while(l<=r){if($l!=$r)next;l++;r--}print $0}'

#pre{{
19660713 1 0 0 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 0 0 1
19660905 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1
19770217 1 0 0 1 0 1 1 0 1 1 0 1 0 1 0 1 1 0 1 1 0 1 0 0 1
19950617 1 0 0 1 1 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 1 1 0 0 1
20020505 1 0 0 1 1 0 0 0 1 0 1 1 1 1 1 0 1 0 0 0 1 1 0 0 1
20130201 1 0 0 1 1 0 0 1 1 0 0 1 0 1 0 0 1 1 0 0 1 1 0 0 1

real	0m8.913s
user	0m10.720s
sys	0m2.224s
}}

ブルートフォースなんで遅いですね。。。

* 解説 [#if9b27fa]
#prism(bash){{{{
gseq 19641010 20200724                  # 探索期間内の日付を生成
| gdate -f- +%Y%m%d 2>/dev/null         # 日付として有効なものを抽出 
| awk '$0=$1";obase=2;"$1";obase=10"'   # 日付を2進数表示させるための bc スクリプト?を生成
| bc                                    # 日付と、2進数表示の生成
| gsed '2~2s/./& /g'                    # 2進数表示を1桁毎に分割
| awk '{printf $0" "}NR%2==0{print ""}' # 2行を1行に結合
| awk '{
  # 2進数の左端、右端から順に対象かを調べる
  l=2;
  r=NF;
  while(l<=r){
    # 非対称なら中断して次の入力データを処理
    if($l!=$r)next;
    # 対称だったら比較桁を移動
    l++;
    r--
  }
  # 左右対称な2進数表記を出力
  print $0
}'
}}}}



トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS