「#カレンダープログラミング プチコンテスト 2014」ピックアップ Vol. 3

DevelopmentClojure,Dart,F#,Photoshop,VBA,カレンダープログラミング

慧: こんにちは! 「カレンダープログラミング プチコンテスト」の応募されたコードをピックアップして紹介していくよ。

今回は3回目! 現時点の応募数も更新してるよ! もう正確な数わからないね……。ピックアップは、コードの処理が他と違って特徴的かな? と思ったものや、おもしろいアイデアを紹介していくよ。

ピックアップは、別にコードの内容が、良い悪いって話じゃないからね! たくさん応募があるから、他の人のコードを参考にアップデートしてもいいし、バグがあったらつっこむのもアリだよ!

Ideone.com コード消失事件!(再掲)

もう一度、お知らせ。コードの公開に Ideone.com を紹介してたんだけど、コードが消える・以前のバージョンに戻る障害があったみたい。カレンダープログラミングの応募も消えちゃってるので、最新のものに更新し直せる人は、元に戻して! あと別の場所に投稿し直すときは、前の関連するツイートにリプライする形でお願い!

現在の応募状況!

10/23 20:50 の時点だよ。とりあえず100件以上! 件数の数え方や粒度はもう気にしないで!

  • PowerShell 3件
  • Python 4件
  • SmileBASIC(プチコン) 1件
  • Windows cmd.exe 3件
  • C# 6件
  • VBA (Excel) 3件
  • Android (Java) 1件
  • Unity (C#) 1件
  • Ruby 4件
  • Java 3件
  • Pascal 1件
  • C 5件
  • Perl 5件
  • Objective-C 1件
  • F# 1件
  • PHP 3件
  • Tcl 1件
  • 一太郎マクロ 1件
  • Clojure 1件
  • HSP 1件
  • PL/SQL 1件
  • MSX BASIC 1件
  • Forth (GForth) 1件
  • Smalltalk 2件
  • ASP.NET (C#) 1件
  • C# + XAML 3件
  • jQuery UI 1件
  • N88互換BASIC 1件
  • Processing 1件
  • C++ 2件
  • PostScript 1件
  • JR-100 (JR-BASIC) 1件
  • N-BASIC 1件
  • Prolog 2件
  • Lua 1件
  • Emacs Lisp 2件
  • Shell 1件
  • Go 1件
  • Brainf*ck 1件
  • PC-E500 (BASIC) 1件
  • openFrameworks (C++) 1件
  • broom 1件
  • Transact-SQL 1件
  • Haskell 1件
  • VB.NET 2件
  • D 言語 2件
  • FORTRAN 2件
  • GBDK (C 言語) 1件
  • TypeScript 1件
  • ActionScript 1件
  • N88-BASIC 1件
  • C++ + Boost 1件
  • COBOL 1件
  • J 言語 3件
  • ドリトル 1件
  • なでしこ 3件
  • C++/CLI 1件
  • PC-1260 (BASIC) 1件
  • SQL 2件
  • GBA ゲームボーイアドバンス 1件
  • C++14 + Sprout 1件
  • VBA (Word) 1件
  • C++ DirectX 2件
  • IronPython 1件
  • C++ + Win32 API 2件
  • Scala 1件
  • Windows Store App (C#) 1件
  • Biz/Browser 1件
  • AutoHotkey 1件
  • VBScript 1件
  • Java Swing 1件
  • C + Win32 API 1件
  • Racket 1件
  • Node.js (JavaScript) 1件
  • WhiteSpace 1件
  • Photoshop 2件
  • IJCAD (VBA) 1件
  • CoffeeScript 3件
  • bash 1件
  • GNAT(GNU Ada Translator) 1件
  • C++ + SDXFramework 1件
  • Groovy 1件
  • Ada 1件
  • AWK 1件
  • MASM(DOS) 1件
  • ActionScript 2件
  • C 言語 1件
  • IchigoJam 1件
  • LotusNotes 1件
  • Dart 2件
  • Mind 1件
  • PALO ALTO TINY BASIC 1件

みんなのコードを見るには、Togetter まとめ から。

カレンダー表示のオーソドックスな処理の説明は、ピックアップ Vol. 1 を見てみてね。

ピックアップ No.10 Clojure

今回ひとつ目のピックアップは、Clojure。


(import 'java.util.Calendar)
(def firstday (doto (Calendar/getInstance) (.set Calendar/DATE 1)))
(def day-of-week (.get firstday Calendar/DAY_OF_WEEK))
(def last-date (.getMaximum firstday Calendar/DATE))
(def dates
(concat
(repeat (dec day-of-week) " ")
(map (partial format "%2d") (range 1 (inc last-date)))))
(doseq
[week (map (partial clojure.string/join " ") (partition-all 7 dates))]
(println week))

view raw

calendar.clj

hosted with ❤ by GitHub

1週目の「余白」と、1日から最終日までの「日」を、ひとつのコレクションにまとめちゃって、そのコレクションを7個区切りにしてるのが、他とは違う特徴かなと思ったよ。

ピックアップ No.11 F#


open System;
[<EntryPoint>]
let main argv =
// 現在の日付を取得し、当月1日の曜日と末日を求めます。
let now = DateTime.Today
let prePad = int( DateTime( now.Year, now.Month, 1 ).DayOfWeek )
let lastDay = DateTime.DaysInMonth( now.Year, now.Month )
// カレンダーを出力します。
for curDay in [( -prePad + 1 )..lastDay] do
// 範囲を[( – 1日の曜日 + 1 )..末日]にし、要素が負の時に空白を出力します。
// こうすることで1日の曜日に合わせてオフセットすることができます。
if curDay > 0 then printf "%3d" curDay else printf " "
if ( curDay + prePad ) % 7 = 0 || curDay = lastDay then printfn ""
done
0

view raw

calendar.fs

hosted with ❤ by GitHub

わかりやすい解説付き! 1週目の余白部分は、“負の日”と扱って、余白表示と日の表示をひとつループにまとめてるのが特徴だね。負の数だったら空白を表示。他の言語でも短くできるテクニックかも?

書式 “%3d" を使うと、日と日の間の空白を入れられるけど、日曜の日の左にも余白ができちゃうね。

ピックアップ No.12 Dart

https://twitter.com/laco0416/status/525265286346199040


void main() {
var today = new DateTime.now();
var calendar = new List.generate(6, (i) => new List.filled(7, " "));
for (var i = 1, week = 0; i <= new DateTime(today.year, today.month + 1, 0).day; i++) {
var day = new DateTime(today.year, today.month, i);
calendar[week][day.weekday % 7] += i.toString();
if (day.weekday == DateTime.SATURDAY) week++;
}
print(calendar.where((w) => w.any((d) => d.trim() != "")).map(
(w) => w.map((d) => d.substring(d.length – 2)).join(" ")).join("\r\n"));
}

view raw

calendar.dart

hosted with ❤ by GitHub

次は Dart! 6週 x 7日分の空白文字が入った2次元のコレクションを作って、日の数字が入る部分を書き換える方法が、特徴的! 6週分あるけど、calendar.where((w) => w.any((d) => d.trim() != "")) の部分で、全部空白の週は捨てるようにしてるんだね。

ピックアップ No.13 Word VBA

カレンダーを数式の行列に見立てて出力するっていうおもしろいアイデア!

Word VBA

コードは、ちょっと長めなので省略するね。

ピックアップ No.14 Adobe JavaScript

今回の最後は、Photoshop のスクリプトでカレンダーを作っちゃう大作! これで印刷するカレンダー自体を作れる…よね?

カレンダー

コードは、これも省略。590行ぐらいだったよ。


というわけで、今回はここまで。まだまだ紹介していくから待っててね!

The following two tabs change content below.
都内の公立高校に通う高校生。部活は、情報処理研究会。身体を動かすのも好きで、気が向いたときはなぜか体育会系の部活に混ぜてもらっていろんなスポーツをすることも。プログラミング生放送のキャラクターとして活動中!