Skip to content

Instantly share code, notes, and snippets.

@tnoda
Created January 5, 2013 04:50
Show Gist options
  • Save tnoda/4459823 to your computer and use it in GitHub Desktop.
Save tnoda/4459823 to your computer and use it in GitHub Desktop.
#mitori_clj Project Euler Problem 19
(ns tnoda.projecteuler.problem-19
(:import (org.joda.time DateTime) ; [joda-time/joda-time "2.1"]
(org.joda.time.chrono GregorianChronology)))
(defn- a-month-later
[^DateTime dt]
(.plusMonths dt 1))
(defn- sunday?
[^DateTime dt]
(= 7 (.getDayOfWeek dt)))
(defn- twentieth-century?
[^DateTime dt]
(= 20 (.getCenturyOfEra dt)))
(defn solver
[]
(->> (DateTime. 1901 1 1 0 0 (GregorianChronology/getInstance))
(iterate a-month-later)
(filter sunday?)
(take-while twentieth-century?)
count))
@tnoda
Copy link
Author

tnoda commented Jan 5, 2013

#mitori_clj Project Euler Problem 19

月初めの 1 日が日曜日であるような月は 20 世紀にいくつあるかという問題です.

解説

申し訳ありませんが時間があまりなかったので,既存のカレンダーライブラリを使って解きました.今回は安心と実績の Joda Time です.Joda Time は日付オブジェクトが immutable なので,Clojure との相性も抜群です.solver では 1901 年 1 月 1 日から順に各月の 1 日を順に調べて,全ての日曜日の数を 20 世紀について列挙し,その数を数えています.

実行例

user> (time (solver))
"Elapsed time: 1.086 msecs"

Clojure 速い(恒例).


私 Joda Time あまり使ったことがないので,使い方間違っていたら指摘してください > 経験者のみなさま

@kohyama
Copy link

kohyama commented Jan 7, 2013

Joda Time 覚えておきます.
Java ライブラリ, タイプヒントの扱い, いつも参考になります.

いろいろハードコードでやっつけですが, ライブラリを使わず, 与えられた情報から手動で計算したので, 貼っておきます.
https://gist.github.com/4472323

@ypsilon-takai
Copy link

基本的に問題文にある情報だけ使って地道に計算した例です。
何の工夫も無いんで、ちょっと恥かしいです。 gistに貼るまでも無いかと思ったので、ブログのままです。
(このころはまだgistをembedできることを知らなかったもので)

http://ypsilonbox.blogspot.jp/2011/05/euler-problem-19.html

そういえば、文中が1900年の1月1日なのに、質問が1901年からになっているのに気づかなくて、答えが合わなくてかなり悩んだのを思い出しました。計算のときに、1900から1900までを引いているのはそれです。

こんなやりかたなのに、かなり速いですね。

@ponkore
Copy link

ponkore commented Jan 9, 2013

Joda Time、いいですね。そういえば最近日付関係の演算って業務でやってないな...。
これくらいシンプルだとあえて Clojure の wrapper を作るまでもないのでしょうが、自分は filter とか take-while とかの述語にカッコをなるべく付けないのが好きなので、tnoda さんのように sunday? とか twentieth-century? は多分自分も同じように作ってしまうのでしょうね。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment