Ansatzの備忘録

勉強したことあるいはふと思い立ったこと

シェルワンライナー160本ノック問題66

問題66 リスケジュール

ころころ変わる予定の日付を出力する問題だった。なんだ簡単じゃないかと思ったら予想外に難しくて結局解けなかった。

解答例は

$ nextwd(){ read d; date -d "$d $((7 - $(date -d $d +%w) + $(date -d $1 +%w))) day" +%F; };echo 2017-09-18 | nextwd Tue | nextwd Fri | xargs -I@ date -d '@ yesterday' +%F

date の機能では起点の日付を指定して日付を計算する能力にかなり限りがあるので関数をうまく定義してやる必要がある。nextwd()はカレンダーを見ながら考えると処理がわかりやすい。この関数は引数で与えられた次週の曜日が標準入力から与えられた日付から数えて何日目かを出力する関数となっている。最初のマイナスの項で翌週の日曜日になり、次のプラスの項で引数で指定した曜日が何日後かわかるようになっている。