「#カレンダープログラミング プチコンテスト 2014」ピックアップ Vol. 3
慧: こんにちは! 「カレンダープログラミング プチコンテスト」の応募されたコードをピックアップして紹介していくよ。
今回は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で書いてみました。JavaのCalendarを使う以外の方法はあるのかな……https://t.co/JsmWkgQcAD@pronama #カレンダープログラミング
— 森越 一 Hajime Morikoshi (@firstforest) October 13, 2014
今回ひとつ目のピックアップは、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))
1週目の「余白」と、1日から最終日までの「日」を、ひとつのコレクションにまとめちゃって、そのコレクションを7個区切りにしてるのが、他とは違う特徴かなと思ったよ。
ピックアップ No.11 F#
https://twitter.com/Myoga1012/status/524933959482748928
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
わかりやすい解説付き! 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"));
}
次は Dart! 6週 x 7日分の空白文字が入った2次元のコレクションを作って、日の数字が入る部分を書き換える方法が、特徴的! 6週分あるけど、calendar.where((w) => w.any((d) => d.trim() != "")) の部分で、全部空白の週は捨てるようにしてるんだね。
ピックアップ No.13 Word VBA
https://twitter.com/Myoga1012/status/523739014415646721
カレンダーを数式の行列に見立てて出力するっていうおもしろいアイデア!
コードは、ちょっと長めなので省略するね。
ピックアップ No.14 Adobe JavaScript
Photoshop Auto Calendar http://t.co/4S6xU1ECm5
おまけ。色が付いたそれなりのカレンダーを自動で作ります。遅いので気長にお待ちください。@pronama #カレンダープログラミング pic.twitter.com/kp2GUJNbYf— ぴこりる (@picolyl) October 21, 2014
今回の最後は、Photoshop のスクリプトでカレンダーを作っちゃう大作! これで印刷するカレンダー自体を作れる…よね?
コードは、これも省略。590行ぐらいだったよ。
というわけで、今回はここまで。まだまだ紹介していくから待っててね!






