F#でカレンダープログラミングをやってみました(その5・EXTRA)

By | Date : 2015/01/08 ( Last Update : 2016/04/12 ) | 41 views

Nia-TN-SDF-A2

こんにちはー!ニアです。

今回はミョウガさんによる「F#でカレンダープログラミングをやってみました」シリーズのスピンオフとして、

for文を一切使用せずにカレンダープログラミングをしていこうと思います。

 

1. [MISSION] for in文を一切使用せずにカレンダープログラミング

ルール:

  1. 「 https://gist.github.com/Myoga1012/e4c9e921ed1ae635185b 」の「Calender.fsx」と同じようなカレンダーを出力するプログラムをコードせよ
  2. 但し、for文(for toやfor inなど)はダメよ~、ダメダメ

という条件の下でプログラミングしていきます。

 

リスト生成時のfor文をどうすればよいのでしょう?

その「Calender.fsx」(このブログでは「Calendar6.fsx」(F#でカレンダープログラミングをやってみました(その4・FINAL)より))を以下に示します。

 

9行目のfor in文の代替となる方法として、「-prePad + 1」から「lastDay」までのシーケンスをSeq.mapi関数によって日付リストを作成するという方法を思いつきました。

9行目において、1日の曜日の値(prePad)と月末日(lastDay)のタプルから「-prePad + 1」から「lastDay」までのシーケンスを生成し、それをSeq.mapi関数に渡します。

Seq.mapi関数で各要素に対する処理では、日付の値(curDay)の正負及び土曜日もしくは月末日を条件判断し、カレンダー用日付リストを生成します。

あとはSeq.iter関数で各要素を出力するだけで出来上がります。

「Calendar6.fsx(GitHub内:Calendar.fsx)」とほぼ同じ動作をしますが、日付リストの生成時の土曜日の条件判断において、あちらでは日付の値(curDay)と1日の曜日の値(prePad)の和を利用しているのに対し、こちらではSeq.mapi関数に指定したシーケンスのインデックス値を利用しています。なお、インデックス値は0から始まるので、7の余剰が6の時が土曜日となります。

CalendarFSI5

ひとまず、ミッションはクリアしました。

 

2. 最小コード量はどれくらい?

「Calendar7.fsx」と同じアルゴリズムの最小コードを以下に示します。

コード量としては252バイトと、#カレンダープログラミングに採用されたコード「CalendarMin.fsx(GitHub内:同ファイル名)」(コード量:244バイト)より少し多いかな。

 

3. おわりに

これはミョウガさんがF#のカレンダープログラミングの開発記事をまとめている時にとっさに思いついたネタですが、いざ蓋を開けてみれば、for in文がSeq.mapi関数に変わっただけで動作が同じというオチになりましたw(当初は劇的に変化するのかなと思ったのだけど・・・(^▽^;))

でも、このミッションのようにわざと条件を付けてプログラミングするのも中々面白いと思います。

それでは、See you next!

この記事をシェアする
Chronoir.netのRSSフィードを購読する

About : ニア(Nia)

紅茶とコーヒーが好きな湘南生まれのプログラマー/ITエンジニアです。主にC#/C++/PHPを使ってプログラミングをしています。趣味は写真撮影と音ゲーです。時々イラストを描いています。プログラミングを勉強している方々と仲良くなりたいです! 興味を持っている分野:UWP/Xamarin/Android Wear/WPF/Windows/Visual Studio/WordPress/KUSANAGI/nginx

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*