Photo by
laprasdrum
なでしこさんで目標日割計算機
本記事は、日本語プログラミング言語「なでしこ」 Advent Calendar 2024 に投稿しようと思って進めていたが実現しなかった内容の供養である。
ゲームの期間限定イベントをやる際、序盤はつい手を抜いてしまい、期間終了間際に慌てて要求される点数を稼ぐ、なんてことはないだろうか?
このような行動をしてしまうと、負荷が集中してしまい、大変になってしまう。
もっと序盤からコツコツやっていれば、1日あたりの負荷を抑えられるのに……
そこで、今回はなでしこを用いて、「今から終了日まで毎日同じだけ点数を稼ぐとしたら、それぞれの日の終わりまでにどの程度まで点数を稼いでいればいいか」を計算するツールを作ってみた。
仕様
「開始日」「終了日」「開始時の値」「目標値」の入力を受け付ける
「目標値」は「開始時の値」より大きくても小さくても (同じでも) OK
入力された条件をもとに、「開始時の値」から毎日同じだけ値を変えて「目標値」にするとき、それぞれの日の終わりにとる値を計算して表示する
長期の計画でも見やすいよう、表示する日付の間隔を設定できる
1日ごと:毎日表示する
1週ごと:毎週日曜日を表示する
1月ごと:月末を表示する
1年ごと:年末を表示する
プログラム
DOM部品オプション["テーブル数値右寄せ"]はオフ。
パラメータエリアは「DIV」のDOM部品作成。
改行作成。
時間単位ボックスは["1日ごと","1週ごと","1月ごと","1年ごと"]のセレクトボックス作成。
改行作成。
結果表は「日付,目標値」のテーブル作成。
パラメータエリアに{
"display": "inline-grid",
"grid-template-columns": "auto auto",
"grid-template-rows": "auto auto auto auto",
"align-items": "center",
}をDOMスタイル一括設定。
パラメータエリアにDOM親要素設定。
「開始日」のラベル作成。
開始日ボックスは日付選択ボックス作成。
「終了日」のラベル作成。
終了日ボックスは日付選択ボックス作成。
「開始時の値」のラベル作成。
開始時値ボックスは「0」のエディタ作成。
「目標値」のラベル作成。
目標値ボックスは「10000」のエディタ作成。
今日の「/」を「-」に置換して開始日ボックスにテキスト設定。
今日に「6日」を日時加算して「/」を「-」に置換して終了日ボックスにテキスト設定。
終了日ボックスのテキスト取得して開始日ボックスの「max」にDOM属性設定。
開始日ボックスのテキスト取得して終了日ボックスの「min」にDOM属性設定。
開始日ボックスの変更時には
開始日ボックスのテキスト取得して終了日ボックスの「min」にDOM属性設定。
目標計算。
ここまで。
終了日ボックスの変更時には
終了日ボックスのテキスト取得して開始日ボックスの「max」にDOM属性設定。
目標計算。
ここまで。
開始時値ボックスの変更時には
目標計算。
ここまで。
目標値ボックスの変更時には
目標計算。
ここまで。
時間単位ボックスの変更時には
目標計算。
ここまで。
目標計算。
関数 目標計算とは
開始日は開始日ボックスのテキスト取得して「-」を「/」に置換。
終了日は終了日ボックスのテキスト取得して「-」を「/」に置換。
開始時値は開始時値ボックスのテキスト取得して実数変換。
目標値は目標値ボックスのテキスト取得して実数変換。
計算結果は「日付,目標値」。
もし、(開始時値を非数判定)または(目標値を非数判定)でなければ
時間単位は時間単位ボックスのテキスト取得。
全日数は開始日から終了日までの日数差に1を足す。
現在日は開始日。
(全日数)回、繰り返す
翌日は現在日に「1日」を日時加算。
経過日数は開始日から翌日までの日数差。
目標は開始時値+(目標値-開始時値)×経過日数÷全日数。
表示フラグはオン。
もし、時間単位が「1月ごと」と等しいならば
表示フラグは翌日で2文字右部分が「01」と等しい。
違えば、もし、時間単位が「1週ごと」と等しいならば
表示フラグは現在日の曜日が「日」と等しい。
違えば、もし、時間単位が「1年ごと」と等しいならば
表示フラグは翌日で5文字右部分が「01/01」と等しい。
ここまで。
もし、表示フラグまたは(現在日が終了日と等しい)ならば
計算結果は計算結果に「{改行}{現在日},{目標}」を追加。
ここまで。
現在日は翌日。
ここまで。
ここまで。
結果表を計算結果にテーブル更新。
ここまで。実行
目標日割計算機 (なでしこ3貯蔵庫)
改良のアイデア
これらは読者への宿題とする。
「開始時の値」と「目標値」の差に基づき、表示する小数点以下の桁数を適切に調整する
パラメータを保存し、毎回設定しなくても目標を確認できるようにする
実測値を入力し、グラフで目標値と比較できるようにする
まとめ
なでしこで、目標に向かって無理せず進めるためにそれぞれの日で達成しておくべき値を計算することができた。


コメント