なでしこさんで13日の金曜日探し
今週もnoteの記事を書かずに週末。
頭が悪い。
Qiitaはかなり早い段階で書けたんだけどね…… (まあやらかしたからっていうのもあるが)
とりあえず、いつものように(爆)適当なプログラムを書いて繋いどこう。
今回やったこと
日本語プログラミング言語「なでしこ」で、今日の前後5回の13日の金曜日を表示する。
今日だけでなく、任意の日付を指定できるようにする。
プログラム
13日の金曜日探し (なでしこ3貯蔵庫)
ポイント
UIの用意
前ラベルリストは空配列。
位置で5から2まで繰り返す
「{位置}回前:」のラベル作成。
空のラベル作成して前ラベルリストに配列追加。
改行作成。
ここまで。
「前回:」のラベル作成。
空のラベル作成して前ラベルリストに配列追加。
改行作成。
前ラベルリストを配列逆順。結果を表示するラベルを格納する配列を用意する。
「2回前」とそれより前は数字で表示し、「前回」は「前回」と表示する。
最後に、配列内のラベルを起点となる日付から近い順位するため、逆順にする。
「今日:」のラベル作成。
日付欄は日付選択ボックス作成。
今日の「/」を「-」に置換して日付欄にテキスト設定。
改行作成。起点となる日付の入力欄を用意する。
初期値は今日の日付とする。
日時処理の命令では「/」を区切り文字に使う一方、日付選択ボックス (<input type="date">) では「-」を区切り文字に使うので、「置換」で変換を行う。
次ラベルリストは空配列。
「次回:」のラベル作成。
空のラベル作成して次ラベルリストに配列追加。
改行作成。
位置で2から5まで繰り返す
「{位置}回後:」のラベル作成。
空のラベル作成して次ラベルリストに配列追加。
改行作成。
ここまで。起点となる日付より前の結果を表示するラベルを作成したときと同様に、起点となる日付より後の結果を表示するラベルを作成する。
このとき、ラベルが最初から起点となる日付に近い順に格納されるので、逆順にはしない。
●表示更新とは
# 省略
ここまで。
日付欄を変更した時には
表示更新。
ここまで。
表示更新。計算と表示の更新を行う関数を定義する。
起点となる日付の入力欄の内容が変化した際に、その関数を呼び出すようにする。
また、最初に開いたときにも、初期値 (今日の日付) で計算を行うため、定義した関数を呼び出す。
計算
定数の今日付は日付欄のテキスト取得して「-」を「/」に置換。
もし、それが空ならば
前ラベルリストを反復
対象に空をテキスト設定。
ここまで。
次ラベルリストを反復
対象に空をテキスト設定。
ここまで。
空を戻す。
ここまで。
定数の今13日は今日付の「[0-9]+$」を「13」に正規表現置換。
探索日付とは変数。まず、入力されている日付を取得し、フォーマットの変換を行う。
それが空文字列の場合、結果も空文字列とし、処理を終了する。
次に、その日付がある月の13日を用意する。
日時処理の命令に日時の要素 (今回の場合「何日か」) を取得したり設定したりする命令は (今のところ) 無いようなので、かわりに文字列の置換を用いて13日に設定した。
最後に、探索で現在見ている日付を格納する変数を用意する。
探索日付は今13日。
もし、今日付と探索日付の日数差が0以上ならば
探索日付は探索日付に「-0/1/0」を日付加算。
ここまで。
前ラベルリストを反復
探索日付の曜日が「金」と等しく無い間
探索日付は探索日付に「-0/1/0」を日付加算。
ここまで。
対象に探索日付をテキスト設定。
探索日付は探索日付に「-0/1/0」を日付加算。
ここまで。起点となる日付から、前方向に探索を行っていく。
起点となる日付が、その月の中で13日またはそれより前の場合、前月から探索を開始する。
そうでない場合、(当月の13日も過去であるため) 当月から探索を開始する。
探索は、結果を格納する欄 (ラベル) の数だけ行う。
現在の日付が金曜日でない間、前月に行く。
金曜日になったら、結果を格納して、次を探索するためにさらに前月に行く。
探索日付は今13日。
もし、今日付と探索日付の日数差が0以下ならば
探索日付は探索日付に「+0/1/0」を日付加算。
ここまで。
次ラベルリストを反復
探索日付の曜日が「金」と等しく無い間
探索日付は探索日付に「+0/1/0」を日付加算。
ここまで。
対象に探索日付をテキスト設定。
探索日付は探索日付に「+0/1/0」を日付加算。
ここまで。前方向への探索と同様に、後方向への探索を行う。
改良のアイデア
以下は読者への宿題とする。
UIをもっといい感じにする
どこまで探索するかを「前後5回」固定ではなく指定できるようにする
日付だけでなく、それが何ヶ月前/後なのかも表示するようにする
まとめ
なでしこで、「今日」の前後の13日の金曜日を探索して表示できた。
過去に向かう探索と未来に向かう探索は、似たコードになった。


コメント