「#カレンダープログラミング プチコンテスト 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。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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行ぐらいだったよ。
というわけで、今回はここまで。まだまだ紹介していくから待っててね!
最新記事 by kei (全て見る)
- HSP プログラムコンテスト2024 結果発表&プロ生ちゃん賞発表! #hsp3 - 2024/12/13
- プロ生ちゃんチョコプログラミングコンテスト2024開催! - 2024/02/13
- HSP プログラムコンテスト2023 結果発表&プロ生ちゃん賞発表! #hsp3 - 2023/12/04