<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>マンジラボ</title>
	<atom:link href="http://manjilab.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://manjilab.com</link>
	<description>いわゆる卍研究所。</description>
	<lastBuildDate>Fri, 26 Feb 2010 15:23:31 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Clojure使い &#8658; Clojurian</title>
		<link>http://manjilab.com/2010/02/26/clojure-user-clojurian/</link>
		<comments>http://manjilab.com/2010/02/26/clojure-user-clojurian/#comments</comments>
		<pubDate>Fri, 26 Feb 2010 07:30:54 +0000</pubDate>
		<dc:creator>研究所大佐</dc:creator>
				<category><![CDATA[Clojure]]></category>

		<guid isPermaLink="false">http://manjilab.com/?p=439</guid>
		<description><![CDATA[Clojure使いを何と呼ぶか。この話題は去年の夏に収束したとおもっていたのですが、再燃してきているみたいなので再ループしないうちに記事にしておきます。]]></description>
			<content:encoded><![CDATA[
<p>この話題は去年の間に収束したとおもっていたのですが、再燃してきているみたいなので記事にしておきます。</p>

<p><strong>Clojure使いを何と呼ぶか。</strong></p>

<p><a href="http://d.hatena.ne.jp/skalabe/20100225/1267114975">Clojure使い &#8211; skalabeの日記</a></p>

<p>結論から言うと &#8220;<strong>Clojurian</strong>&#8220;。</p>

<p>実はRich本人がすでに言及しています。</p>

<p><a href="http://www.computerworld.com.au/article/313989/a-z_programming_languages_clojure/?pp=3">The A-Z of Programming Languages: Clojure (Page 3)</a></p>

<blockquote>
  <p><strong>interviewer</strong>: Perl gurus are &#8216;Perl Mongers&#8217;, Python ones are &#8216;Pythonistas&#8217;. We think Clojure needs something similar. Any suggestions?</p>
  
  <p><strong>Rich</strong>: I think everyone has settled on <strong>Clojurians</strong>.</p>
</blockquote>

<p>というわけでもうClojurianでいいよね。＞ all</p>

<p>「Clojure的な」についてはわかりません。<br />
どなたか知っている方はおられませんか？</p>

]]></content:encoded>
			<wfw:commentRss>http://manjilab.com/2010/02/26/clojure-user-clojurian/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&#8220;Clojureライブラリ・コーディング規約&#8221; まとめ</title>
		<link>http://manjilab.com/2010/02/13/clojure-library-coding-standards/</link>
		<comments>http://manjilab.com/2010/02/13/clojure-library-coding-standards/#comments</comments>
		<pubDate>Sat, 13 Feb 2010 04:54:45 +0000</pubDate>
		<dc:creator>研究所大佐</dc:creator>
				<category><![CDATA[Clojure]]></category>

		<guid isPermaLink="false">http://manjilab.com/?p=417</guid>
		<description><![CDATA[前エントリから1週間以上がすぎました。
Google Groupsでのディスカッションで合意されたClojureライブラリのコーディング規約ものをStuがまとめてアップしてくれてました。
さっそく和訳してみます。]]></description>
			<content:encoded><![CDATA[
<p>前エントリ
<a href="http://manjilab.com/2010/02/04/clojure-lib-coding-standards/">clojure.lib コーディング規約・訳</a>
から1週間以上がすぎました。</p>

<p>Google Groupsでのディスカッションで合意されたコーディング規約をStuがまとめてアップしてくれました。</p>

<p><a href="https://www.assembla.com/wiki/show/clojure/Clojure_Library_Coding_Standards">Clojure Library Coding Standards | Clojure | Assembla</a></p>

<p>さっそく和訳してみました。</p>

<p>間違いがあればご指摘ねがいます。
&rArr; <a href="http://twitter.com/manjilab">@manjilab</a></p>

<p>【和訳ここから】</p>

<p>免責事項：</p>

<ul>
<li>規則は破られるためにあります。この規約に倣うも絶対のものとして扱わないこと。</li>
</ul>

<p>規約:</p>

<ul>
<li>名前と使用法はよく考えて書くこと。RichはJavaにおける既存のコードとの互換性の維持を尊重しています。練習用のコードであればいつまでもいじってられますが、ひとたび名前と使用法が公開されればそうはいきません。（具体的な実装に興味がなく名前と用法だけを見ている利用者が多いですから）</li>
<li>コードの重要そうな関数には型ヒントをつける。もしくは型情報なしでも簡潔なコードに。

<ul>
<li>本当に必要なものにだけ型ヒントをつける。そうであると確信が持てないのであればつけない。</li>
</ul></li>
<li>良い名前をつける。他の名前空間のものとの衝突を恐れない。そのための名前空間。

<ul>
<li>とはいえ用法や意味が違うものを同じ名前で使う場合は、その中にふさわしくないものがないかどうかをよく検討すること。</li>
</ul></li>
<li>パッケージ依存は明確・最低限に。（useやrequireをする時には &#58;onlyオプションを使う） </li>
<li>関数で実現できる場合はマクロは使わない。マクロの方が使い勝手が良い場
合は関数版も合わせて提供すること。（未決の問題：命名規則は必要？ &#8220;foo&#8221; と &#8220;foo&#42;&#8221;が多く使われてるけど）</li>
<li>コンパイル時にすべての情報がわかっているのであれば、パフォーマンス上有効な部分にマクロを使う。（ログのためのマクロの<a href="http://groups.google.com/group/clojure-dev/browse_thread/thread/d090b5599909497c">議論</a>を参考。結局両方のバージョンが必要となった。コンパイル時に完全な情報が得られないケースが多いからだ。）</li>
<li>ライブラリレベルで docstringを書くこと。</li>
<li>全関数に対して自動化されたテストを書くこと。</li>
<li>オプションの引数は展開すること。呼び出し側がオプション引数をマップで包まなくてもいいように。

<ul>
<li>(release-sharks 2 :laser-beams true) ; 良い</li>
<li>(release-sharks 2 {:laser-beams true}) ; 悪い</li>
</ul></li>
<li>述語の名前は最後に ? をつける。

<ul>
<li>注意 &#8211; 述語はブール値を返す。</li>
</ul></li>
<li>docstringをつける。例外として、関数がの定義が明白そのものでdocstringが関数名と引数をただ冗長に示すだけのような場合は書かない。（私もそれに該当するdocstringは削除する方針にした。）

<ul>
<li>これはHTMLドキュメント化のようなツールにとってマイナス？</li>
</ul></li>
<li>迷ったら性能のよい方を公開すること。Clojureは求められるパフォーマンスを提供すべきであり、ライブラリも同じです。（それがマルチメソッド版の + をcoreでは提供していない理由です。）ユーザは必要に応じてAPIをハイジャックして新たな型を作ることが出来るのですから。</li>
<li>よい名前を使いたいけどcoreと衝突するような場合は意味が同等になるように心がけてください。coreのシーケンス関数に対する文字列処理関数が良い例となるでしょう。</li>
<li>assertや pre- post-などの条件処理を気軽に使いましょう。現時点ではあまり使われていませんが、もっと使われるべきです。<a href="http://www.google.com/url?sa=D&amp;q=http://www.assembla.com/spaces/clojure/tickets/250-turn-off-able-asserts--with-better-messages&amp;usg=AFQjCNE8W_uFlzIzS7vFnTuqahtwuSlrzA">#250</a>を参考。</li>
<li>できるだけ遅延評価で書きましょう。</li>
<li>変数名は pred や coll のように clojure.coreの慣例に従うこと。</li>
<li>clojure.coreの起動初期コードの慣用表記に倣ってはいけない。それらはClojureが立ち上がる前の限定された環境のために書かれているから。</li>
<li>コードを小さい塊に分割せよ。doseqの定義のような書式はRich以外の人は書かないで。</li>
<li>オブジェクトの要素へのアクセスはキーワードを先にもってくる。

<ul>
<li>(:property object-like-map)</li>
</ul></li>
<li>コレクションから値を取り出すときはコレクションを先にもってくる（コレクションがnilかもしれない場合にはgetを使う）

<ul>
<li>(collection-like-map key) (get collection-like-map key)</li>
<li>すべてのコレクションがキーワードをキーとして持つわけではないので注意。</li>
</ul></li>
<li>分配束縛はよく用いられる。しかし渡された値の一部を使いたいときには引数書式の所での使用にどめるべきだ。もしくはletの最初の行で。Programming Clojureに載せた<a href="http://www.google.com/url?sa=D&amp;q=http://github.com/stuarthalloway/programming-clojure/commit/7758eac3b0434654902835fde47c854708538864&amp;usg=AFQjCNF-_3aY28hS6PNBuTyEfrsPjaCpxg">スネークゲームのコード</a>はこれに反しているけれど。</li>
<li>トランザクションではセットよりも更新を使おう。統一的な更新モデルはもっとも基本的な方法であり、交換可能な処理を発見しやすくなる。それにより更新処理の衝突を少なくできる。</li>
<li>想定していないコレクション型をサポートしてはいけない。アルゴリズムがランダムアクセスを用いるのであれば、受け取る型はランダムアクセス可である必要がある。</li>
<li>&#42;earmuffs&#42; は再束縛を意図するものにのみ使用する。</li>
<li>bang! はSTMトランザクションで安全でないものにのみ使用する。</li>
<li>loop/recurよりもシーケンス・ライブラリの組み合わせを用いる。</li>
<li>varの再束縛にはスコープ系マクロをいっしょに。例）&#42;in&#42; と with-in-str</li>
<li>遅延シーケンスは最小限の状態を持つ関数として書く。つまり「頭をかかえない」こと。どの程度の規模で現実化するかは呼び出し側にまかせること。</li>
<li>interop は Klass/staticField, (Klass/staticMethod), (Klass.), (.method obj) の型式で。例外はコードを生成するコード中で(. obj method)の方が簡単な場合のみ。</li>
<li>引数の順序はよく考えて。ライブラリのなかでは一貫性を持たせること。</li>
<li>パラメータを動的束縛で暗に受け渡すインターフェイスを提供している場合（例: sqlにおけるdb）、パラメータを明確に受け渡せるインターフェイスも合わせて提供する。</li>
</ul>

<p>【和訳ここまで】</p>

]]></content:encoded>
			<wfw:commentRss>http://manjilab.com/2010/02/13/clojure-library-coding-standards/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>clojure.lib コーディング規約・訳</title>
		<link>http://manjilab.com/2010/02/04/clojure-lib-coding-standards/</link>
		<comments>http://manjilab.com/2010/02/04/clojure-lib-coding-standards/#comments</comments>
		<pubDate>Wed, 03 Feb 2010 23:14:39 +0000</pubDate>
		<dc:creator>研究所大佐</dc:creator>
				<category><![CDATA[Clojure]]></category>

		<guid isPermaLink="false">http://manjilab.com/?p=388</guid>
		<description><![CDATA[Programming Clojure の著者、Stuart Hallowayの提案する clojure.libコーディング規約です。まだ固まっていないようですが興味深かったので和訳してみました。]]></description>
			<content:encoded><![CDATA[
<p><strong>2/13 &#8211; 更新された規約はこちらの記事にまとめました。<br />
&rArr;
<a href="http://manjilab.com/2010/02/13/clojure-library-coding-standards/">“Clojureライブラリ・コーディング規約” まとめ</a></strong></p>

<p>　</p>

<p><a href="http://groups.google.com/group/clojure-dev">Clojure Dev Google groups</a>で盛り上がっているトピックがあります。</p>

<p><a href="http://groups.google.com/group/clojure-dev/browse_thread/thread/d090b5599909497c">&#8220;clojure.lib coding standards: initial draft brain dump Options&#8221;</a></p>

<p>Programming Clojure の著者、Stuart Halloway氏が音頭を取ってclojure.lib用のコーディング規約をみんなで決めようというものです。</p>

<p>興味深かったのでStuの提案したルールを和訳してみました。<br />
思いっきり意訳です。間違いがあればご指摘ねがいます。
&rArr; <a href="http://twitter.com/manjilab">@manjilab</a></p>

<p>（掲示板の流れに合わせていくつかの項目を追加・削除しています）</p>

<p>【和訳ここから】</p>

<p>最初に：</p>

<ul>
<li>これは公式でも最終版でもない。議論を誘発するための叩き台です。もし致命的に間違っている項目が含まれていなければ私の手抜きです &#58;-)</li>
<li>ルールは破られるためにある。よってどのような規約も絶対ではない。 </li>
<li>有言実行：ここで同意が得られた項目に沿うように自分の既存のコードを書き直すつもりです。</li>
<li>この文章はClojureの入門者にとって役立つものになるでしょう。参考資料となるリンクも示してあります。   </li>
</ul>

<p>規約:</p>

<ul>
<li>名前と使用法はよく考えて書きましょう。RichはJavaにおける既存のコードとの互換性の維持を尊重しています。練習用のコードであればいつまでもいじってられますが、ひとたび名前と使用法が公開されればそうはいきません。（具体的な実装に興味がなく名前と用法だけを見ている利用者が多いですから）</li>
<li>パフォーマンス的に重要な部分には type hintをつける。   </li>
<li>良い名前をつける。他の名前空間のものとの衝突を恐れない。そのための名前空間。 </li>
<li>パッケージ依存は明確・最小限に。（useやrequireをする時には &#58;onlyオプションを使う）  </li>
<li>関数で実現できる場合はマクロは使わない。マクロの方が使い良い場合は関数版も提供すること。（みんなへ質問：命名規則は必要？ &#8220;foo&#8221; と &#8220;foo*&#8221;が多く使われてるけど）</li>
<li>コンパイル時にすべての情報がわかっているのであれば、パフォーマンス上有効な部分にマクロを使う。（
<a href="http://groups.google.com/group/clojure-dev/browse_thread/thread/d090b5599909497c">ログのためのマクロ</a>
の議論を参考。結局両方のバージョンが必要となった。コンパイル時に完全な情報が得られないケースが多いからだ。）</li>
<li>ライブラリレベルで docstringを書くこと。</li>
<li>全関数に対して自動化されたテストを書くこと。</li>
<li>オプションの引数は展開すること。<br />
(foo x y {&#58;optional z}) ではなく (foo x y &#58;optional z)</li>
<li>述語(true または falseを返す）関数名の末尾は &#8216;?&#8217; で。</li>
<li>docstringを付けよ。例外として、関数がの定義が明白そのものでdocstringが関数名と引数をただ冗長に示すだけのような場合は書かない。（私もそれに該当するdocstringは削除する方針にした。）</li>
<li>迷ったら性能のよい方を公開すること。Clojureは求められるパフォーマンスを提供すべきであり、ライブラリも同じです。（それがマルチメソッド版の + をcoreでは提供していない理由です。）ユーザは必要に応じてAPIをハイジャックして新たな型を作ることが出来るのですから。</li>
<li>よい名前を使いたいけどcoreと衝突するような場合は意味が同等になるように心がけてください。coreのシーケンス関数に対する文字列処理関数が良い例となるでしょう。 </li>
<li>assertや pre- post-などの条件処理を気軽に使いましょう。現時点ではあまり使われていませんが、もっと使われるべきです。
<a href="http://www.google.com/url?sa=D&amp;q=http://www.assembla.com/spaces/clojure/tickets/250-turn-off-able-asserts--with-better-messages&amp;usg=AFQjCNE8W_uFlzIzS7vFnTuqahtwuSlrzA">参考</a></li>
<li>できるだけ遅延評価で書きましょう。</li>
<li>変数名は pred や coll のように clojure.coreの慣例に従うこと。</li>
<li>clojure.coreの起動初期コードの慣用表記に倣ってはいけない。それらはClojureが立ち上がる前の限定された環境のために書かれているから。</li>
<li>コードを小さい塊に分割せよ。doseqの定義のような書式はRich以外の人は書かないで。</li>
<li>マップ要素へのアクセスは (:property object-like-map) 、コレクションへは (collection-like-map key) を使う。もしくは get を使う。<strong>(追加)</strong></li>
<li>分配束縛はよく用いられる。しかし渡された値の一部を使いたいときには引数書式の所での使用にどめるべきだ。もしくはletの最初の行で。でも
<a href="http://www.google.com/url?sa=D&amp;q=http://github.com/stuarthalloway/programming-clojure/commit/7758eac3b0434654902835fde47c854708538864&amp;usg=AFQjCNF-_3aY28hS6PNBuTyEfrsPjaCpxg">Programming Clojureに載せたのスネークゲームのコード</a>
はこれに反しているんだけどね。</li>
<li>（トランザクション系の話）セットよりも更新を使おう。理由はたくさんある。統一されたupdateモデルは簡潔で標準的であるので、交換可能な処理を発見しやすくなる。それにより更新しようとしている処理の衝突を少なくできる。</li>
<li>想定していないコレクション型をサポートしてはいけない。アルゴリズムがランダムアクセスを用いるのであれば、受け取る型はランダムアクセスできるものでなければならない。</li>
<li>&#42;earmuffs&#42; は再束縛を意図するものにのみ使用する。</li>
<li>bang! はSTMトランザクションで安全でないものにのみ使用する。</li>
<li>loop/recurよりもシーケンス・ライブラリの組み合わせを用いる。 </li>
<li>varの再束縛にはスコープ系マクロをいっしょに。例）&#42;in&#42; と with-in-str</li>
<li>遅延シーケンスは最小限の状態を持つ関数として書く。つまり「頭をかかえない」こと。どの程度の規模で現実化するかは呼び出し側にまかせること。</li>
<li>interop は (Klass/static) , (Klass.) , (.instance obj) の型式で。
例外はコードを生成するコード中で(. blah)の方が簡単な場合のみ。</li>
<li>引数の順序はよく考えて。ライブラリのなかでは一貫性を持たせること。</li>
</ul>

<p>【和訳ここまで】</p>

<p><strong>加筆</strong></p>

<p>【2010.2.4 &#8211; 10:30】<br />
・『マップ要素へのアクセスは (:property object-like-map)〜』を追加<br />
・bang! の項：「安全でないSTMトランザクション」 &rArr; 「STMトランザクションで安全でないもの」<br />
@athos0220さん、ご指摘ありがとうございました。</p>

]]></content:encoded>
			<wfw:commentRss>http://manjilab.com/2010/02/04/clojure-lib-coding-standards/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Clojureコードバトンに参加してみた。</title>
		<link>http://manjilab.com/2010/01/30/clojure-code-baton/</link>
		<comments>http://manjilab.com/2010/01/30/clojure-code-baton/#comments</comments>
		<pubDate>Sat, 30 Jan 2010 00:38:01 +0000</pubDate>
		<dc:creator>研究所大佐</dc:creator>
				<category><![CDATA[Clojure]]></category>

		<guid isPermaLink="false">http://manjilab.com/?p=381</guid>
		<description><![CDATA[Clojureコードバトンを受け取ったので挑戦してみた。]]></description>
			<content:encoded><![CDATA[
<p>Clojureコードバトンが回ってきたので挑戦してみたよ。</p>

<p>数日前もにいちど
<a href="http://twitter.com/nitro_idiot/status/8178478985">@nitro_idiotさんから打診されてた</a>
のですが渡航中だったのでパスさせていただいてました。</p>

<p>帰国後に
<a href="http://twitter.com/pokarim/status/8363322965">@pokarimさんが回してくださった</a>
のでありがたく参加させていただくことに。</p>

<p>とはいえgithubもgistも他の人のソースをforkしたことがないんだよね。なんか不安。いいのか？</p>

<p>forkは実際にやってみると簡単でした。gistにログインしてforkボタンを押してあとはweb上で編集するだけ。</p>

<p>渡航中にチェックしたときは僕にもリファクタリングできそうな箇所が2つほどあったので安心してたのですが、先ほど見てみるとキレイに修正済でした。しまった。</p>

<p>いきなりハードルがあがってしまいましたがすでに受けてしまったので、機能追加の方向でなんとかします。</p>

<p><a href="http://gist.github.com/290231">このようになりました。</a></p>

<p>実行環境が Mac OS X 上の場合のみ、出題時に英単語を音声で出力するようにしました。<br />
speak-osx と osx? が追加部分です。</p>

<p>これを読んだ方で興味をもたれた方は是非バトンを受け取って(forkして)参加してください。おまちしております。</p>

<hr />

<p><strong>追記</strong></p>

<p>【2010.1.31】<br />
<a href="http://twitter.com/deltam/status/8417250802">@deltamさんが受け取ってくれました</a> ありがとうございま〜す。</p>

<p>【2010.2.1】<br />
<a href="http://twitter.com/deltam/status/8500054942">@omasanoriさんにバトンが無事に渡ったようです。</a>
ほっ。</p>

]]></content:encoded>
			<wfw:commentRss>http://manjilab.com/2010/01/30/clojure-code-baton/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Project Euler #022 – 名前のスコア</title>
		<link>http://manjilab.com/2010/01/16/project-euler-022/</link>
		<comments>http://manjilab.com/2010/01/16/project-euler-022/#comments</comments>
		<pubDate>Fri, 15 Jan 2010 23:04:26 +0000</pubDate>
		<dc:creator>研究所大佐</dc:creator>
				<category><![CDATA[Project Euler]]></category>
		<category><![CDATA[Clojure]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://manjilab.com/?p=377</guid>
		<description><![CDATA[Project EulerをClojureでおさらいシリーズ。<br />
Problem 22
外部ファイルからデータを読み込む最初の問題。]]></description>
			<content:encoded><![CDATA[
<p>Project EulerをClojureでおさらいシリーズ。<br />
Problem 22</p>

<p><a href="http://projecteuler.net/index.php?section=problems&amp;id=22">オリジナルはこちら</a></p>

<p>日本語訳：</p>

<blockquote>
  <p>5000個以上の名前を含む46Kのテキストファイル name.txt を用いる。
  まずアルファベット順にソートすること。
  そしてそれぞれの名前のについてアルファベットの数値とリスト内での順番を掛けて名前のスコアを計算する。</p>
  
  <p>たとえばアルファベット順にソートされたリストの938番目に
  COLIN があるとすると、COLINは 3 + 15 + 12 + 9 + 14 = 53 であるので
  938 × 53 = 49714 がスコアとなる。</p>
  
  <p>ファイルに含まれるすべての名前のスコアの合計を求めよ。</p>
</blockquote>

<p>外部ファイルからデータを読み込む最初の問題。</p>

<p>以前Rubyで解いたもの：</p>


<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;">#!/usr/bin/env ruby</span>
&nbsp;
f = <span style="color:#CC0066; font-weight:bold;">open</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">'names.txt'</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  names_orig = f.<span style="color:#9900CC;">read</span>
f.<span style="color:#9900CC;">close</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">def</span> score_base<span style="color:#006600; font-weight:bold;">&#40;</span>name<span style="color:#006600; font-weight:bold;">&#41;</span>
  name.<span style="color:#9900CC;">unpack</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;C*&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">inject</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">|</span>s,x<span style="color:#006600; font-weight:bold;">|</span> s <span style="color:#006600; font-weight:bold;">+</span> x <span style="color:#006600; font-weight:bold;">-</span> <span style="color:#006666;">64</span><span style="color:#006600; font-weight:bold;">&#125;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
names = names_orig.<span style="color:#CC0066; font-weight:bold;">split</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">','</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">map</span><span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">|</span>name<span style="color:#006600; font-weight:bold;">|</span> name.<span style="color:#9900CC;">tr</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">'&quot;'</span>,<span style="color:#996600;">''</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#125;</span>.<span style="color:#9900CC;">sort</span>
&nbsp;
<span style="color:#CC0066; font-weight:bold;">p</span> names.<span style="color:#9900CC;">enum_for</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:each_with_index</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">map</span><span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">|</span>name,i<span style="color:#006600; font-weight:bold;">|</span> score_base<span style="color:#006600; font-weight:bold;">&#40;</span>name<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">*</span> <span style="color:#006600; font-weight:bold;">&#40;</span>i<span style="color:#006600; font-weight:bold;">+</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#125;</span>.<span style="color:#9900CC;">inject</span><span style="color:#006600; font-weight:bold;">&#40;</span>:<span style="color:#006600; font-weight:bold;">+</span><span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>


<p>Clojureではこのように：</p>


<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>ns euler<span style="color: #66cc66;">.</span>p022<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>def names <span style="color: #66cc66;">&#40;</span>slurp <span style="color: #ff0000;">&quot;names.txt&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>defn name-score
  <span style="color: #ff0000;">&quot;Return name score.
   ex) COLIN at 938th in list
       -&gt; 938 * (3 + 15 + 12 + 9 + 14) = 49714&quot;</span>
  <span style="color: #66cc66;">&#91;</span>pos <span style="color: #b1b100;">name</span><span style="color: #66cc66;">&#93;</span>
  <span style="color: #66cc66;">&#40;</span>* pos
     <span style="color: #66cc66;">&#40;</span>reduce<span style="color: #66cc66;"> + </span><span style="color: #66cc66;">&#40;</span>map #<span style="color: #66cc66;">&#40;</span>-<span style="color: #66cc66;">&gt;</span> <span style="color: #66cc66;">%</span> int <span style="color: #66cc66;">&#40;</span>- <span style="color: #cc66cc;">64</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">name</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>println <span style="color: #ff0000;">&quot;Anster : &quot;</span>
 <span style="color: #66cc66;">&#40;</span>reduce<span style="color: #66cc66;"> + </span><span style="color: #66cc66;">&#40;</span>map name-score
		<span style="color: #66cc66;">&#40;</span>iterate inc <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>
		<span style="color: #66cc66;">&#40;</span>sort <span style="color: #66cc66;">&#40;</span>re-seq #<span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\w</span>+&quot;</span> names<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>


<p>mapが使える言語だととっても楽チン。</p>

]]></content:encoded>
			<wfw:commentRss>http://manjilab.com/2010/01/16/project-euler-022/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Project Euler #021 – 友愛数</title>
		<link>http://manjilab.com/2010/01/15/project-euler-021/</link>
		<comments>http://manjilab.com/2010/01/15/project-euler-021/#comments</comments>
		<pubDate>Fri, 15 Jan 2010 09:06:27 +0000</pubDate>
		<dc:creator>研究所大佐</dc:creator>
				<category><![CDATA[Project Euler]]></category>
		<category><![CDATA[Clojure]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://manjilab.com/?p=363</guid>
		<description><![CDATA[Project EulerをClojureでおさらいシリーズ。<br />
Problem 21
友愛数を見つける問題。]]></description>
			<content:encoded><![CDATA[
<p>Project EulerをClojureでおさらいシリーズ。<br />
Problem 21</p>

<p><a href="http://projecteuler.net/index.php?section=problems&amp;id=21">オリジナルはこちら</a></p>

<p>日本語訳：</p>

<blockquote>
  <p>n の真の約数の合計を d(n) と定義する。<br />
  （真の約数とは整数 n の約数で n 以外のものである）</p>
  
  <p>もし d(a) = b かつ d(b) = a が a &ne; b で成立するならば
  a と b は 友愛数と呼ばれる。</p>
  
  <p>たとえば220の真の約数は 1,2,4,5,10,11,20,22,44,55,110 で<br />
  d(220) = 284 であり、284の真の約数は 1,2,4,71,142 なので<br />
  d(284) = 220 となる。</p>
  
  <p>10000未満の友愛数の合計を求めよ。</p>
</blockquote>

<p>以前Rubyで解いたもの：</p>


<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;">#!/usr/bin/env ruby</span>
&nbsp;
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'mathn'</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">def</span> divisor<span style="color:#006600; font-weight:bold;">&#40;</span>n<span style="color:#006600; font-weight:bold;">&#41;</span>
  result=<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#93;</span>
  n.<span style="color:#9900CC;">prime_division</span>.<span style="color:#9900CC;">each</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>i<span style="color:#006600; font-weight:bold;">|</span>
    result = result <span style="color:#006600; font-weight:bold;">+</span> result.<span style="color:#9900CC;">map</span> <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">|</span>x<span style="color:#006600; font-weight:bold;">|</span> <span style="color:#006600; font-weight:bold;">&#40;</span>1..<span style="color:#9900CC;">i</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">map</span><span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">|</span>n<span style="color:#006600; font-weight:bold;">|</span> x<span style="color:#006600; font-weight:bold;">*</span><span style="color:#006600; font-weight:bold;">&#40;</span>i<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">**</span>n<span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#125;</span>.<span style="color:#9900CC;">flatten</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
  result.<span style="color:#9900CC;">flatten</span>.<span style="color:#9900CC;">sort</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">def</span> sum_of_divisors<span style="color:#006600; font-weight:bold;">&#40;</span>n<span style="color:#006600; font-weight:bold;">&#41;</span>
  divisor<span style="color:#006600; font-weight:bold;">&#40;</span>n<span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#91;</span>0..<span style="color:#006600; font-weight:bold;">-</span><span style="color:#006666;">2</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">inject</span><span style="color:#006600; font-weight:bold;">&#40;</span>:<span style="color:#006600; font-weight:bold;">+</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
sum = <span style="color:#006666;">0</span>
&nbsp;
<span style="color:#006600; font-weight:bold;">&#40;</span>1...10000<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">each</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>n<span style="color:#006600; font-weight:bold;">|</span>
  sod = sum_of_divisors<span style="color:#006600; font-weight:bold;">&#40;</span>n<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">next</span> <span style="color:#9966CC; font-weight:bold;">if</span> sod.<span style="color:#0000FF; font-weight:bold;">nil</span>?
  <span style="color:#9966CC; font-weight:bold;">next</span> <span style="color:#9966CC; font-weight:bold;">if</span> n == sod
  sum <span style="color:#006600; font-weight:bold;">+</span>= n <span style="color:#9966CC; font-weight:bold;">if</span> n == sum_of_divisors<span style="color:#006600; font-weight:bold;">&#40;</span>sum_of_divisors<span style="color:#006600; font-weight:bold;">&#40;</span>n<span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#CC0066; font-weight:bold;">p</span> sum</pre></div></div>


<p>約数の和は prime_division で素因数分解したものから約数リストを生成して、最後の要素を除いたものを inject で合計してます。</p>

<p>さてClojureでは：</p>


<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>ns euler<span style="color: #66cc66;">.</span>p021
  <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">use</span> clojure<span style="color: #66cc66;">.</span>contrib<span style="color: #66cc66;">.</span>seq-utils<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>defn prime-division
  <span style="color: #ff0000;">&quot;Return prime factors of N.&quot;</span>
  <span style="color: #66cc66;">&#91;</span>number<span style="color: #66cc66;">&#93;</span>
  <span style="color: #66cc66;">&#40;</span>loop <span style="color: #66cc66;">&#91;</span>n number d <span style="color: #cc66cc;">2</span> factors <span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#93;</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cond</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&lt;=</span> n d<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>frequencies <span style="color: #66cc66;">&#40;</span>conj factors d<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
	  <span style="color: #66cc66;">&#40;</span>zero? <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">rem</span> n d<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>recur <span style="color: #66cc66;">&#40;</span>/ n d<span style="color: #66cc66;">&#41;</span> d <span style="color: #66cc66;">&#40;</span>conj factors d<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
	  <span style="color: #66cc66;">:</span><span style="color: #555;">else</span> <span style="color: #66cc66;">&#40;</span>recur n <span style="color: #66cc66;">&#40;</span>inc d<span style="color: #66cc66;">&#41;</span> factors<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>defn exp-prime-factor
  <span style="color: #ff0000;">&quot;Expand prime factor exponentially.
   Usage: (exp-prime-factor prime-factor index)
   Example: (exp-prime-factor 3 4) -&gt; [1 3 9 27 81]&quot;</span>
  <span style="color: #66cc66;">&#91;</span>pf idx<span style="color: #66cc66;">&#93;</span>
  <span style="color: #66cc66;">&#40;</span>map #<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">apply</span><span style="color: #66cc66;"> * </span><span style="color: #66cc66;">&#40;</span>replicate <span style="color: #66cc66;">%</span> pf<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>range <span style="color: #66cc66;">&#40;</span>inc idx<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>defn composite-factors
  <span style="color: #ff0000;">&quot;Composite factors collection.
   Usage: (composite-factors coll [prime-factor index])
   Example: (composite-factors [1 2 4] [5 2])
            -&gt; (1 2 4 5 10 20 25 50 100)&quot;</span>
  <span style="color: #66cc66;">&#91;</span>last-coll coll<span style="color: #66cc66;">&#93;</span>
  <span style="color: #66cc66;">&#40;</span>for <span style="color: #66cc66;">&#91;</span>x <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">apply</span> exp-prime-factor coll<span style="color: #66cc66;">&#41;</span>
	y last-coll<span style="color: #66cc66;">&#93;</span>
    <span style="color: #66cc66;">&#40;</span>* x y<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>defn sum-of-proper-divisors
  <span style="color: #ff0000;">&quot;Return sum of proper divisor of N.&quot;</span>
  <span style="color: #66cc66;">&#91;</span>n<span style="color: #66cc66;">&#93;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">apply</span><span style="color: #66cc66;"> + </span><span style="color: #66cc66;">&#40;</span>drop-<span style="color: #b1b100;">last</span>
	    <span style="color: #66cc66;">&#40;</span>reduce composite-factors <span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">&#40;</span>prime-division n<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>def sum-of-proper-divisors <span style="color: #66cc66;">&#40;</span>memoize sum-of-proper-divisors<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>defn amicable?
  <span style="color: #ff0000;">&quot;Return true if N has amicable pair.&quot;</span>
  <span style="color: #66cc66;">&#91;</span>n<span style="color: #66cc66;">&#93;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#91;</span>candidate <span style="color: #66cc66;">&#40;</span>sum-of-proper-divisors n<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">not</span><span style="color: #66cc66;">=</span> candidate n<span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">=</span> n <span style="color: #66cc66;">&#40;</span>sum-of-proper-divisors candidate<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>println <span style="color: #ff0000;">&quot;Answer : &quot;</span>
	 <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">apply</span><span style="color: #66cc66;"> + </span><span style="color: #66cc66;">&#40;</span>filter amicable? <span style="color: #66cc66;">&#40;</span>range <span style="color: #cc66cc;">10000</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>


<p>うわー、なんか長くなった。</p>

<p><a href="http://manjilab.com/2009/11/10/clojure-coding-guideline/">Clojureコーディング規約・訳</a>
より</p>

<blockquote>
  <p>匿名関数は1行で収まる簡単な定義のみに使う。</p>
</blockquote>

<p>ということで、素因数分解から約数のリストを生成する工程を幾つかの関数に
切り分けたのが原因。</p>

<p>そして関数の名付けがむずかしくてドキュメントで補足するハメに・・。<br />
まだまだ未熟よのう。</p>

<p>ためしに1関数にまとめてみたらこうなった。</p>


<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>ns euler<span style="color: #66cc66;">.</span>p021
  <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">use</span> clojure<span style="color: #66cc66;">.</span>contrib<span style="color: #66cc66;">.</span>seq-utils<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>defn prime-division
  <span style="color: #ff0000;">&quot;Return prime factors of N.&quot;</span>
  <span style="color: #66cc66;">&#91;</span>number<span style="color: #66cc66;">&#93;</span>
  <span style="color: #66cc66;">&#40;</span>loop <span style="color: #66cc66;">&#91;</span>n number d <span style="color: #cc66cc;">2</span> factors <span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#93;</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cond</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&lt;=</span> n d<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>frequencies <span style="color: #66cc66;">&#40;</span>conj factors d<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
	  <span style="color: #66cc66;">&#40;</span>zero? <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">rem</span> n d<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>recur <span style="color: #66cc66;">&#40;</span>/ n d<span style="color: #66cc66;">&#41;</span> d <span style="color: #66cc66;">&#40;</span>conj factors d<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
	  <span style="color: #66cc66;">:</span><span style="color: #555;">else</span> <span style="color: #66cc66;">&#40;</span>recur n <span style="color: #66cc66;">&#40;</span>inc d<span style="color: #66cc66;">&#41;</span> factors<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>defn sum-of-proper-divisors
  <span style="color: #ff0000;">&quot;Return sum of proper divisor of N.&quot;</span>
  <span style="color: #66cc66;">&#91;</span>n<span style="color: #66cc66;">&#93;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">apply</span><span style="color: #66cc66;"> + </span><span style="color: #66cc66;">&#40;</span>drop-<span style="color: #b1b100;">last</span>
	    <span style="color: #66cc66;">&#40;</span>reduce <span style="color: #66cc66;">&#40;</span>fn <span style="color: #66cc66;">&#91;</span>m-coll coll<span style="color: #66cc66;">&#93;</span>
	       <span style="color: #66cc66;">&#40;</span>mapcat <span style="color: #66cc66;">&#40;</span>fn <span style="color: #66cc66;">&#91;</span>m-factor<span style="color: #66cc66;">&#93;</span>
		  <span style="color: #66cc66;">&#40;</span>map <span style="color: #66cc66;">&#40;</span>fn <span style="color: #66cc66;">&#91;</span>idx<span style="color: #66cc66;">&#93;</span>
		     <span style="color: #66cc66;">&#40;</span>* m-factor <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">.</span> <span style="color: #66cc66;">&#40;</span>bigint <span style="color: #66cc66;">&#40;</span>first coll<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> pow idx<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
		   <span style="color: #66cc66;">&#40;</span>range <span style="color: #66cc66;">&#40;</span>inc <span style="color: #66cc66;">&#40;</span>second coll<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
		m-coll<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
	     <span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">&#40;</span>prime-division n<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>def sum-of-proper-divisors <span style="color: #66cc66;">&#40;</span>memoize sum-of-proper-divisors<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>defn amicable?
  <span style="color: #ff0000;">&quot;Return true if N has amicable pair.&quot;</span>
  <span style="color: #66cc66;">&#91;</span>n<span style="color: #66cc66;">&#93;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#91;</span>candidate <span style="color: #66cc66;">&#40;</span>sum-of-proper-divisors n<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">not</span><span style="color: #66cc66;">=</span> candidate n<span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">=</span> n <span style="color: #66cc66;">&#40;</span>sum-of-proper-divisors candidate<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>println <span style="color: #ff0000;">&quot;Answer : &quot;</span>
	 <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">apply</span><span style="color: #66cc66;"> + </span><span style="color: #66cc66;">&#40;</span>filter amicable? <span style="color: #66cc66;">&#40;</span>range <span style="color: #cc66cc;">10000</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>


<p>累乗はJava側の関数にやらせてみた。
やっぱりこっちの方がいいかな。</p>

]]></content:encoded>
			<wfw:commentRss>http://manjilab.com/2010/01/15/project-euler-021/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Project Euler #020 – 100の階乗</title>
		<link>http://manjilab.com/2010/01/14/project-euler-020/</link>
		<comments>http://manjilab.com/2010/01/14/project-euler-020/#comments</comments>
		<pubDate>Wed, 13 Jan 2010 23:12:13 +0000</pubDate>
		<dc:creator>研究所大佐</dc:creator>
				<category><![CDATA[Project Euler]]></category>
		<category><![CDATA[Clojure]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://manjilab.com/?p=358</guid>
		<description><![CDATA[Project EulerをClojureでおさらいシリーズ。<br />
Problem 20
瞬殺の予感。]]></description>
			<content:encoded><![CDATA[
<p>Project EulerをClojureでおさらいシリーズ。<br />
Problem 20</p>

<p><a href="http://projecteuler.net/index.php?section=problems&amp;id=20">オリジナルはこちら</a></p>

<p>日本語訳：</p>

<blockquote>
  <p>n! は n × (n-1) × ・・・ × 3 × 2 × 1 を表す。</p>
  
  <p>1000! の各桁の数字の和を求めよ。</p>
</blockquote>

<p>瞬殺の予感。</p>

<p>以前Rubyで解いたもの：</p>


<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;">#!/usr/bin/env ruby</span>
&nbsp;
<span style="color:#CC0066; font-weight:bold;">p</span> 1.<span style="color:#9900CC;">upto</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">100</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">inject</span><span style="color:#006600; font-weight:bold;">&#40;</span>:<span style="color:#006600; font-weight:bold;">*</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">to_s</span>.<span style="color:#CC0066; font-weight:bold;">split</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">''</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">inject</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">|</span>s,x<span style="color:#006600; font-weight:bold;">|</span> s <span style="color:#006600; font-weight:bold;">+</span> x.<span style="color:#9900CC;">to_i</span><span style="color:#006600; font-weight:bold;">&#125;</span></pre></div></div>


<p>Rubyステキ。</p>

<p>Clojureでは：</p>


<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>ns euler<span style="color: #66cc66;">.</span>p020<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>defn fact
  <span style="color: #ff0000;">&quot;Return factorial of N.&quot;</span>
  <span style="color: #66cc66;">&#91;</span>n<span style="color: #66cc66;">&#93;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">apply</span><span style="color: #66cc66;"> * </span><span style="color: #66cc66;">&#40;</span>range <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">&#40;</span>inc n<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>defn sum-of-digits
  <span style="color: #ff0000;">&quot;Return the sum of each digits of N.&quot;</span>
  <span style="color: #66cc66;">&#91;</span>n<span style="color: #66cc66;">&#93;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">apply</span><span style="color: #66cc66;"> + </span><span style="color: #66cc66;">&#40;</span>map #<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">Integer</span><span style="color: #66cc66;">.</span> <span style="color: #66cc66;">&#40;</span>str <span style="color: #66cc66;">%</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>str n<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>println <span style="color: #ff0000;">&quot;Answer : &quot;</span> <span style="color: #66cc66;">&#40;</span>sum-of-digits <span style="color: #66cc66;">&#40;</span>fact <span style="color: #cc66cc;">100</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>


<p>ほとんどいままでの使い回し。</p>

]]></content:encoded>
			<wfw:commentRss>http://manjilab.com/2010/01/14/project-euler-020/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Project Euler #019 – 日曜日で始まる月</title>
		<link>http://manjilab.com/2010/01/13/project-euler-019/</link>
		<comments>http://manjilab.com/2010/01/13/project-euler-019/#comments</comments>
		<pubDate>Tue, 12 Jan 2010 23:04:14 +0000</pubDate>
		<dc:creator>研究所大佐</dc:creator>
				<category><![CDATA[Project Euler]]></category>
		<category><![CDATA[Clojure]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://manjilab.com/?p=352</guid>
		<description><![CDATA[Project EulerをClojureでおさらいシリーズ。<br />
Problem 19
グレゴリオ暦を扱う問題。]]></description>
			<content:encoded><![CDATA[
<p>Project EulerをClojureでおさらいシリーズ。<br />
Problem 19</p>

<p><a href="http://projecteuler.net/index.php?section=problems&amp;id=19">オリジナルはこちら</a></p>

<p>日本語訳：</p>

<blockquote>
  <p>まず次の情報を与えておこう。（自分自身で確認してみるのもよいだろう）</p>
  
  <ul>
  <li>1900年1月1日は月曜日</li>
  <li>4月、6月、9月、11月は30日まで、<br />
  それ以外と2月を除く月は31日まである。<br />
  2月は28日までだが、閏年には29日までとなる。</li>
  <li>閏年は西暦の数字が4で割り切れる年におこる。<br />
  ただし400で割り切れず100で割り切れる場合は除く。</li>
  </ul>
  
  <p>20世紀（1901年1月1日〜2000年12月31日）には月の始めにくる日曜日がいくつあるか求めよ。</p>
</blockquote>

<p>グレゴリオ暦を扱う問題。</p>

<p>以前Rubyで解いたもの：</p>


<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;">#!/usr/bin/env ruby</span>
&nbsp;
days_of_month = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">31</span>,<span style="color:#006666;">28</span>,<span style="color:#006666;">31</span>,<span style="color:#006666;">30</span>,<span style="color:#006666;">31</span>,<span style="color:#006666;">30</span>,<span style="color:#006666;">31</span>,<span style="color:#006666;">31</span>,<span style="color:#006666;">30</span>,<span style="color:#006666;">31</span>,<span style="color:#006666;">30</span>,<span style="color:#006666;">31</span><span style="color:#006600; font-weight:bold;">&#93;</span>,
                 <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">31</span>,<span style="color:#006666;">29</span>,<span style="color:#006666;">31</span>,<span style="color:#006666;">30</span>,<span style="color:#006666;">31</span>,<span style="color:#006666;">30</span>,<span style="color:#006666;">31</span>,<span style="color:#006666;">31</span>,<span style="color:#006666;">30</span>,<span style="color:#006666;">31</span>,<span style="color:#006666;">30</span>,<span style="color:#006666;">31</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
&nbsp;
Monday = <span style="color:#006666;">1</span>
Sunday = <span style="color:#006666;">0</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">def</span> is_leap<span style="color:#006600; font-weight:bold;">&#40;</span>year<span style="color:#006600; font-weight:bold;">&#41;</span>
  year <span style="color:#006600; font-weight:bold;">%</span> <span style="color:#006666;">4</span> == <span style="color:#006666;">0</span> <span style="color:#006600; font-weight:bold;">&amp;&amp;</span> year <span style="color:#006600; font-weight:bold;">%</span> <span style="color:#006666;">100</span> != <span style="color:#006666;">0</span> <span style="color:#006600; font-weight:bold;">||</span> year <span style="color:#006600; font-weight:bold;">%</span> <span style="color:#006666;">400</span> == <span style="color:#006666;">0</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
count = <span style="color:#006666;">0</span>
days_total = Monday <span style="color:#006600; font-weight:bold;">+</span> <span style="color:#006666;">365</span> <span style="color:#008000; font-style:italic;"># 1900 is not leap</span>
<span style="color:#006600; font-weight:bold;">&#40;</span>1901..2000<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">each</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>year<span style="color:#006600; font-weight:bold;">|</span>
  leap = is_leap<span style="color:#006600; font-weight:bold;">&#40;</span>year<span style="color:#006600; font-weight:bold;">&#41;</span> ? <span style="color:#006666;">1</span> : <span style="color:#006666;">0</span>
  <span style="color:#006600; font-weight:bold;">&#40;</span>1..12<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">each</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>month<span style="color:#006600; font-weight:bold;">|</span>
    count <span style="color:#006600; font-weight:bold;">+</span>= <span style="color:#006666;">1</span> <span style="color:#9966CC; font-weight:bold;">if</span> days_total <span style="color:#006600; font-weight:bold;">%</span> <span style="color:#006666;">7</span> == <span style="color:#006666;">0</span>
    days_total <span style="color:#006600; font-weight:bold;">+</span>= days_of_month<span style="color:#006600; font-weight:bold;">&#91;</span>leap<span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#91;</span>month<span style="color:#006600; font-weight:bold;">-</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#93;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#CC0066; font-weight:bold;">p</span> count</pre></div></div>


<p>おもいっきり手続き型ですね。</p>

<p>今回のClojureでは：</p>


<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>ns euler<span style="color: #66cc66;">.</span>p019<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>def days-of-month
     <span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">31</span> <span style="color: #cc66cc;">28</span> <span style="color: #cc66cc;">31</span> <span style="color: #cc66cc;">30</span> <span style="color: #cc66cc;">31</span> <span style="color: #cc66cc;">30</span> <span style="color: #cc66cc;">31</span> <span style="color: #cc66cc;">31</span> <span style="color: #cc66cc;">30</span> <span style="color: #cc66cc;">31</span> <span style="color: #cc66cc;">30</span> <span style="color: #cc66cc;">31</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>defn leap-year?
  <span style="color: #ff0000;">&quot;Return true if leap year.&quot;</span>
  <span style="color: #66cc66;">&#91;</span>year<span style="color: #66cc66;">&#93;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cond</span>
    <span style="color: #66cc66;">&#40;</span>zero? <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">rem</span> year <span style="color: #cc66cc;">400</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> true
    <span style="color: #66cc66;">&#40;</span>zero? <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">rem</span> year <span style="color: #cc66cc;">100</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> false
    <span style="color: #66cc66;">&#40;</span>zero? <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">rem</span> year <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> true
    <span style="color: #66cc66;">:</span><span style="color: #555;">else</span> false<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>defn leaps-from-origin
  <span style="color: #ff0000;">&quot;Return number of leap days form Jan-0 0000.&quot;</span>
  <span style="color: #66cc66;">&#91;</span>year month day<span style="color: #66cc66;">&#93;</span>
  <span style="color: #66cc66;">&#40;</span>+ <span style="color: #66cc66;">&#40;</span>quot year <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#40;</span>- <span style="color: #66cc66;">&#40;</span>quot year <span style="color: #cc66cc;">100</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#40;</span>quot year <span style="color: #cc66cc;">400</span><span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>leap-year? year<span style="color: #66cc66;">&#41;</span>
       <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&lt;</span> month <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">&#41;</span> -<span style="color: #cc66cc;">1</span> <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span>
       <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>defn days-total-from-origin
  <span style="color: #ff0000;">&quot;Return number of days from Jan-0 0000.&quot;</span>
  <span style="color: #66cc66;">&#91;</span>year month day<span style="color: #66cc66;">&#93;</span>
  <span style="color: #66cc66;">&#40;</span>+ <span style="color: #66cc66;">&#40;</span>* <span style="color: #cc66cc;">365</span> year<span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">apply</span><span style="color: #66cc66;"> + </span><span style="color: #66cc66;">&#40;</span>take <span style="color: #66cc66;">&#40;</span>dec month<span style="color: #66cc66;">&#41;</span> days-of-month<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
     day
     <span style="color: #66cc66;">&#40;</span>leaps-from-origin year month day<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>defn sunday?
  <span style="color: #ff0000;">&quot;Return true if date is sunday.&quot;</span>
  <span style="color: #66cc66;">&#91;</span>year month day<span style="color: #66cc66;">&#93;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#91;</span>sunday <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">rem</span> <span style="color: #66cc66;">&#40;</span>dec <span style="color: #66cc66;">&#40;</span>days-total-from-origin <span style="color: #cc66cc;">1900</span> <span style="color: #cc66cc;">1</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #cc66cc;">7</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span>
       <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">=</span> sunday
	  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">rem</span> <span style="color: #66cc66;">&#40;</span>days-total-from-origin year month day<span style="color: #66cc66;">&#41;</span> <span style="color: #cc66cc;">7</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>println <span style="color: #ff0000;">&quot;Answer : &quot;</span>
	 <span style="color: #66cc66;">&#40;</span>count
	  <span style="color: #66cc66;">&#40;</span>filter #<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">apply</span> sunday? <span style="color: #66cc66;">%</span><span style="color: #66cc66;">&#41;</span>
		  <span style="color: #66cc66;">&#40;</span>for <span style="color: #66cc66;">&#91;</span>year <span style="color: #66cc66;">&#40;</span>range <span style="color: #cc66cc;">1901</span> <span style="color: #cc66cc;">2001</span><span style="color: #66cc66;">&#41;</span>
			month <span style="color: #66cc66;">&#40;</span>range <span style="color: #cc66cc;">1</span> <span style="color: #cc66cc;">13</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span>
		    <span style="color: #66cc66;">&#91;</span>year month <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>


<p>月初の日付を生成して、日曜日の判定を別関数にしました。</p>

<p>さてひととおり書いた後に
「Clojureにも日付を扱うライブラリくらいあるだろ」
と思い探してみましましたが見当たりませんでした。</p>

<p>こういうときはJavaを探すというお約束。→
<a href="http://java.sun.com/javase/6/docs/api/java/util/GregorianCalendar.html">ありました</a><br />
グレゴリオ暦のほうじゃないと閏年の修正が異なるので注意。</p>

<p>これを使って書き直すと：</p>


<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>ns euler<span style="color: #66cc66;">.</span>p019
  <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">import</span> <span style="color: #66cc66;">&#40;</span>java<span style="color: #66cc66;">.</span>util GregorianCalendar<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>defn sunday?
  <span style="color: #ff0000;">&quot;Return true if date is sunday.&quot;</span>
  <span style="color: #66cc66;">&#91;</span>year month day<span style="color: #66cc66;">&#93;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#91;</span>date <span style="color: #66cc66;">&#40;</span>doto <span style="color: #66cc66;">&#40;</span>GregorianCalendar<span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">.</span><span style="color: #b1b100;">set</span> year <span style="color: #66cc66;">&#40;</span>dec month<span style="color: #66cc66;">&#41;</span> day<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">.</span> date <span style="color: #b1b100;">get</span> GregorianCalendar/DAY_OF_WEEK<span style="color: #66cc66;">&#41;</span>
       GregorianCalendar/SUNDAY<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>println <span style="color: #ff0000;">&quot;Answer : &quot;</span>
	 <span style="color: #66cc66;">&#40;</span>count
	  <span style="color: #66cc66;">&#40;</span>filter #<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">apply</span> sunday? <span style="color: #66cc66;">%</span><span style="color: #66cc66;">&#41;</span>
		  <span style="color: #66cc66;">&#40;</span>for <span style="color: #66cc66;">&#91;</span>year <span style="color: #66cc66;">&#40;</span>range <span style="color: #cc66cc;">1901</span> <span style="color: #cc66cc;">2001</span><span style="color: #66cc66;">&#41;</span>
			month <span style="color: #66cc66;">&#40;</span>range <span style="color: #cc66cc;">1</span> <span style="color: #cc66cc;">13</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span>
		    <span style="color: #66cc66;">&#91;</span>year month <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>


<p>かなりスッキリしました。</p>

]]></content:encoded>
			<wfw:commentRss>http://manjilab.com/2010/01/13/project-euler-019/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Project Euler #018 – 和が最大となる経路</title>
		<link>http://manjilab.com/2010/01/12/project-euler-018/</link>
		<comments>http://manjilab.com/2010/01/12/project-euler-018/#comments</comments>
		<pubDate>Mon, 11 Jan 2010 21:56:53 +0000</pubDate>
		<dc:creator>研究所大佐</dc:creator>
				<category><![CDATA[Project Euler]]></category>
		<category><![CDATA[Clojure]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://manjilab.com/?p=346</guid>
		<description><![CDATA[Project EulerをClojureでおさらいシリーズ。<br />
Problem 18
選択肢の枝をどのように切り落としていくかが問題。
"Programming Clojure" の "5.3 Lazier Than Lazy" が参考になりました。]]></description>
			<content:encoded><![CDATA[
<p>Project EulerをClojureでおさらいシリーズ。<br />
Problem 18</p>

<p><a href="http://projecteuler.net/index.php?section=problems&amp;id=18">オリジナルはこちら</a></p>

<p>日本語訳：</p>

<blockquote>
<p>下の三角形の頂点から隣接する数字を下まで辿っていくと、その数値の和の最大数は23となる。</p>

<pre style="text-align:center;">
<span style="color:red">3</span>
<span style="color:red">7</span> 4
2 <span style="color:red">4</span> 6
8 5 <span style="color:red">9</span> 3
</pre>

<p>この例の場合、3 + 7 + 4 + 9 = 23 である。</p>

<p>以下の三角形において、同様に和の最大数を求めよ。</p>

<pre style="text-align:center;">
75
95 64
17 47 82
18 35 87 10
20 04 82 47 65
19 01 23 75 03 34
88 02 77 73 07 63 67
99 65 04 28 06 16 70 92
41 41 26 56 83 40 80 70 33
41 48 72 33 47 32 37 16 94 29
53 71 44 65 25 43 91 52 97 51 14
70 11 33 28 77 73 17 78 39 68 17 57
91 71 52 38 17 14 91 43 58 50 27 29 48
63 66 04 68 89 53 67 30 73 16 69 87 40 31
04 62 98 27 23 09 70 98 73 93 38 53 60 04 23
</pre> 

<p>注意：この例では16384通りのルートしかないのですべての経路を調べることもできる。しかし Problem 67 では同様の問題でも三角形が100行からなるので総当たりで解くのは不可能である。もっと賢い方法が求められる。</p>
</blockquote>

<p>選択肢の枝をどのように切り落としていくかが問題。</p>

<p>以前Rubyで解いたもの：</p>


<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;">#!/usr/bin/env ruby</span>
&nbsp;
Rows = <span style="color:#006666;">15</span>
tri = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
tri <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> <span style="color:#006600; font-weight:bold;">%</span>w<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">75</span><span style="color:#006600; font-weight:bold;">&#41;</span>
tri <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> <span style="color:#006600; font-weight:bold;">%</span>w<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">95</span> <span style="color:#006666;">64</span><span style="color:#006600; font-weight:bold;">&#41;</span>
tri <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> <span style="color:#006600; font-weight:bold;">%</span>w<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">17</span> <span style="color:#006666;">47</span> <span style="color:#006666;">82</span><span style="color:#006600; font-weight:bold;">&#41;</span>
tri <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> <span style="color:#006600; font-weight:bold;">%</span>w<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">18</span> <span style="color:#006666;">35</span> <span style="color:#006666;">87</span> <span style="color:#006666;">10</span><span style="color:#006600; font-weight:bold;">&#41;</span>
tri <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> <span style="color:#006600; font-weight:bold;">%</span>w<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">20</span> 04 <span style="color:#006666;">82</span> <span style="color:#006666;">47</span> <span style="color:#006666;">65</span><span style="color:#006600; font-weight:bold;">&#41;</span>
tri <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> <span style="color:#006600; font-weight:bold;">%</span>w<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">19</span> 01 <span style="color:#006666;">23</span> <span style="color:#006666;">75</span> 03 <span style="color:#006666;">34</span><span style="color:#006600; font-weight:bold;">&#41;</span>
tri <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> <span style="color:#006600; font-weight:bold;">%</span>w<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">88</span> 02 <span style="color:#006666;">77</span> <span style="color:#006666;">73</span> 07 <span style="color:#006666;">63</span> <span style="color:#006666;">67</span><span style="color:#006600; font-weight:bold;">&#41;</span>
tri <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> <span style="color:#006600; font-weight:bold;">%</span>w<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">99</span> <span style="color:#006666;">65</span> 04 <span style="color:#006666;">28</span> 06 <span style="color:#006666;">16</span> <span style="color:#006666;">70</span> <span style="color:#006666;">92</span><span style="color:#006600; font-weight:bold;">&#41;</span>
tri <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> <span style="color:#006600; font-weight:bold;">%</span>w<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">41</span> <span style="color:#006666;">41</span> <span style="color:#006666;">26</span> <span style="color:#006666;">56</span> <span style="color:#006666;">83</span> <span style="color:#006666;">40</span> <span style="color:#006666;">80</span> <span style="color:#006666;">70</span> <span style="color:#006666;">33</span><span style="color:#006600; font-weight:bold;">&#41;</span>
tri <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> <span style="color:#006600; font-weight:bold;">%</span>w<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">41</span> <span style="color:#006666;">48</span> <span style="color:#006666;">72</span> <span style="color:#006666;">33</span> <span style="color:#006666;">47</span> <span style="color:#006666;">32</span> <span style="color:#006666;">37</span> <span style="color:#006666;">16</span> <span style="color:#006666;">94</span> <span style="color:#006666;">29</span><span style="color:#006600; font-weight:bold;">&#41;</span>
tri <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> <span style="color:#006600; font-weight:bold;">%</span>w<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">53</span> <span style="color:#006666;">71</span> <span style="color:#006666;">44</span> <span style="color:#006666;">65</span> <span style="color:#006666;">25</span> <span style="color:#006666;">43</span> <span style="color:#006666;">91</span> <span style="color:#006666;">52</span> <span style="color:#006666;">97</span> <span style="color:#006666;">51</span> <span style="color:#006666;">14</span><span style="color:#006600; font-weight:bold;">&#41;</span>
tri <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> <span style="color:#006600; font-weight:bold;">%</span>w<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">70</span> <span style="color:#006666;">11</span> <span style="color:#006666;">33</span> <span style="color:#006666;">28</span> <span style="color:#006666;">77</span> <span style="color:#006666;">73</span> <span style="color:#006666;">17</span> <span style="color:#006666;">78</span> <span style="color:#006666;">39</span> <span style="color:#006666;">68</span> <span style="color:#006666;">17</span> <span style="color:#006666;">57</span><span style="color:#006600; font-weight:bold;">&#41;</span>
tri <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> <span style="color:#006600; font-weight:bold;">%</span>w<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">91</span> <span style="color:#006666;">71</span> <span style="color:#006666;">52</span> <span style="color:#006666;">38</span> <span style="color:#006666;">17</span> <span style="color:#006666;">14</span> <span style="color:#006666;">91</span> <span style="color:#006666;">43</span> <span style="color:#006666;">58</span> <span style="color:#006666;">50</span> <span style="color:#006666;">27</span> <span style="color:#006666;">29</span> <span style="color:#006666;">48</span><span style="color:#006600; font-weight:bold;">&#41;</span>
tri <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> <span style="color:#006600; font-weight:bold;">%</span>w<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">63</span> <span style="color:#006666;">66</span> 04 <span style="color:#006666;">68</span> <span style="color:#006666;">89</span> <span style="color:#006666;">53</span> <span style="color:#006666;">67</span> <span style="color:#006666;">30</span> <span style="color:#006666;">73</span> <span style="color:#006666;">16</span> <span style="color:#006666;">69</span> <span style="color:#006666;">87</span> <span style="color:#006666;">40</span> <span style="color:#006666;">31</span><span style="color:#006600; font-weight:bold;">&#41;</span>
tri <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> <span style="color:#006600; font-weight:bold;">%</span>w<span style="color:#006600; font-weight:bold;">&#40;</span>04 <span style="color:#006666;">62</span> <span style="color:#006666;">98</span> <span style="color:#006666;">27</span> <span style="color:#006666;">23</span> 09 <span style="color:#006666;">70</span> <span style="color:#006666;">98</span> <span style="color:#006666;">73</span> <span style="color:#006666;">93</span> <span style="color:#006666;">38</span> <span style="color:#006666;">53</span> <span style="color:#006666;">60</span> 04 <span style="color:#006666;">23</span><span style="color:#006600; font-weight:bold;">&#41;</span>
Tri = tri.<span style="color:#9900CC;">map</span><span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">|</span>line<span style="color:#006600; font-weight:bold;">|</span> line.<span style="color:#9900CC;">map</span><span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">|</span>num<span style="color:#006600; font-weight:bold;">|</span> num.<span style="color:#9900CC;">to_i</span><span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#125;</span>
<span style="color:#ff6633; font-weight:bold;">$cache</span> = tri.<span style="color:#9900CC;">map</span><span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">|</span>line<span style="color:#006600; font-weight:bold;">|</span> line.<span style="color:#9900CC;">map</span><span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">|</span>num<span style="color:#006600; font-weight:bold;">|</span> <span style="color:#0000FF; font-weight:bold;">nil</span><span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#125;</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">def</span> pick_grater<span style="color:#006600; font-weight:bold;">&#40;</span>depth, pos<span style="color:#006600; font-weight:bold;">&#41;</span>
  current = Tri<span style="color:#006600; font-weight:bold;">&#91;</span>depth<span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#91;</span>pos<span style="color:#006600; font-weight:bold;">&#93;</span>
  <span style="color:#0000FF; font-weight:bold;">return</span> current <span style="color:#9966CC; font-weight:bold;">if</span> depth == Rows <span style="color:#006600; font-weight:bold;">-</span> <span style="color:#006666;">1</span>
  <span style="color:#ff6633; font-weight:bold;">$cache</span><span style="color:#006600; font-weight:bold;">&#91;</span>depth<span style="color:#006600; font-weight:bold;">+</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#91;</span>pos<span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#006600; font-weight:bold;">||</span>= pick_grater<span style="color:#006600; font-weight:bold;">&#40;</span>depth <span style="color:#006600; font-weight:bold;">+</span> <span style="color:#006666;">1</span>, pos<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#ff6633; font-weight:bold;">$cache</span><span style="color:#006600; font-weight:bold;">&#91;</span>depth<span style="color:#006600; font-weight:bold;">+</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#91;</span>pos<span style="color:#006600; font-weight:bold;">+</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#006600; font-weight:bold;">||</span>= pick_grater<span style="color:#006600; font-weight:bold;">&#40;</span>depth <span style="color:#006600; font-weight:bold;">+</span> <span style="color:#006666;">1</span>, pos <span style="color:#006600; font-weight:bold;">+</span> <span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  left  = <span style="color:#ff6633; font-weight:bold;">$cache</span><span style="color:#006600; font-weight:bold;">&#91;</span>depth<span style="color:#006600; font-weight:bold;">+</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#91;</span>pos<span style="color:#006600; font-weight:bold;">&#93;</span>
  right = <span style="color:#ff6633; font-weight:bold;">$cache</span><span style="color:#006600; font-weight:bold;">&#91;</span>depth<span style="color:#006600; font-weight:bold;">+</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#91;</span>pos<span style="color:#006600; font-weight:bold;">+</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#93;</span>
  <span style="color:#006600; font-weight:bold;">&#40;</span>left <span style="color:#006600; font-weight:bold;">&gt;</span> right <span style="color:#006600; font-weight:bold;">&#41;</span> ? <span style="color:#006600; font-weight:bold;">&#40;</span>left <span style="color:#006600; font-weight:bold;">+</span> current<span style="color:#006600; font-weight:bold;">&#41;</span> : <span style="color:#006600; font-weight:bold;">&#40;</span>right <span style="color:#006600; font-weight:bold;">+</span> current<span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#CC0066; font-weight:bold;">p</span> pick_grater<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">0</span>, <span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>


<p>再帰＆キャッシュです。</p>

<p>頂点からスタートして<br />
最大数 ＝（左右の選択肢が持つ和の大きいほう）＋（自分の数字）<br />
で、あとは再帰。</p>

<p>さて、次はClojureで書いてみます。</p>

<p>書籍 &#8220;Programming Clojure&#8221; より &#8220;Six Rules of Clojure FP&#8221; の5つめ：</p>

<blockquote>
  <p>Know the sequence library. You can often write code without using
  recur or the lazy APIs at all.</p>
</blockquote>

<p>最近はこれを心がけています。</p>

<p>Ruby版のは再帰ですが実際の処理としては枝の最下部から切り落とされていきます。</p>

<p>だったら最下層から折りたたんでいけば再帰を使わなくてもいけそうです。</p>


<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>ns euler<span style="color: #66cc66;">.</span>p018<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>def triangle-text
  <span style="color: #ff0000;">&quot;75
   95 64
   17 47 82
   18 35 87 10
   20 04 82 47 65
   19 01 23 75 03 34
   88 02 77 73 07 63 67
   99 65 04 28 06 16 70 92
   41 41 26 56 83 40 80 70 33
   41 48 72 33 47 32 37 16 94 29
   53 71 44 65 25 43 91 52 97 51 14
   70 11 33 28 77 73 17 78 39 68 17 57
   91 71 52 38 17 14 91 43 58 50 27 29 48
   63 66 04 68 89 53 67 30 73 16 69 87 40 31
   04 62 98 27 23 09 70 98 73 93 38 53 60 04 23&quot;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>def triangle
     <span style="color: #66cc66;">&#40;</span>for <span style="color: #66cc66;">&#91;</span>row <span style="color: #66cc66;">&#40;</span>map #<span style="color: #66cc66;">&#40;</span>re-seq #<span style="color: #ff0000;">&quot;[0-9]+&quot;</span> <span style="color: #66cc66;">%</span><span style="color: #66cc66;">&#41;</span>
		     <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">.</span>split triangle-text <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span>
       <span style="color: #66cc66;">&#40;</span>map #<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">Integer</span><span style="color: #66cc66;">.</span> <span style="color: #66cc66;">%</span><span style="color: #66cc66;">&#41;</span> row<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>defn merge-rows
  <span style="color: #ff0000;">&quot;Return maximum values for upper row.&quot;</span>
  <span style="color: #66cc66;">&#91;</span>last-row current-row<span style="color: #66cc66;">&#93;</span>
  <span style="color: #66cc66;">&#40;</span>map +
       current-row
       <span style="color: #66cc66;">&#40;</span>map #<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">apply</span> <span style="color: #b1b100;">max</span> <span style="color: #66cc66;">%</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>partition <span style="color: #cc66cc;">2</span> <span style="color: #cc66cc;">1</span> last-row<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>println <span style="color: #ff0000;">&quot;Answer : &quot;</span>
	 <span style="color: #66cc66;">&#40;</span>first <span style="color: #66cc66;">&#40;</span>reduce merge-rows <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">reverse</span> triangle<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>


<p>partition 関数の使い方がミソですね。<br />
&#8220;Programming Clojure&#8221; の &#8220;5.3 Lazier Than Lazy&#8221; が参考になりました。</p>

<p>merge-row では左右の和の最大数を比較して、上の階層に渡す和を求めています。あとはreduceで繰り返し。</p>

]]></content:encoded>
			<wfw:commentRss>http://manjilab.com/2010/01/12/project-euler-018/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Project Euler #017 – 数字を英単語で</title>
		<link>http://manjilab.com/2010/01/11/project-euler-017/</link>
		<comments>http://manjilab.com/2010/01/11/project-euler-017/#comments</comments>
		<pubDate>Sun, 10 Jan 2010 21:26:36 +0000</pubDate>
		<dc:creator>研究所大佐</dc:creator>
				<category><![CDATA[Project Euler]]></category>
		<category><![CDATA[Clojure]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://manjilab.com/?p=343</guid>
		<description><![CDATA[Project EulerをClojureでおさらいシリーズ。<br />
Problem 17
fourteen と forty の綴りには注意。あとはそんなに難しくない。]]></description>
			<content:encoded><![CDATA[
<p>Project EulerをClojureでおさらいシリーズ。<br />
Problem 17</p>

<p><a href="http://projecteuler.net/index.php?section=problems&amp;id=17">オリジナルはこちら</a></p>

<p>日本語訳：</p>

<blockquote>
  <p>1から5までを英単語で表すと one, two, three, four, five となり、
  文字数の合計は 3 + 3 + 5 + 4 + 4 = 19 となる。</p>
  
  <p>1から1000までを英単語で表すと文字数の合計はいくらになるか。</p>
  
  <p>注意：スペースとハイフンはカウントしない。例えば 342 (three hundred and forty-two)
  は23文字となり、115 (one hundred and fifteen) は20文字となる。
  英単語での表記の&#8221;and&#8221;の使い方はイギリス英語のそれに準じることとする。</p>
</blockquote>

<p>fourteen と forty の綴りには注意。あとはそんなに難しくない。</p>

<p>以前Rubyで解いたもの：</p>


<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;">#!/usr/bin/env ruby</span>
&nbsp;
One_to_Nine = <span style="color:#006600; font-weight:bold;">%</span>W<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#008000; font-style:italic;">#{} one two three four five six seven eight nine)</span>
Teen = <span style="color:#006600; font-weight:bold;">%</span>W<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#008000; font-style:italic;">#{} #{} #{} thir four fif six seven eigh nine)</span>
Ty = <span style="color:#006600; font-weight:bold;">%</span>W<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#008000; font-style:italic;">#{} #{} twen thir for fif six seven eigh nine)</span>
Ten_to_Twelve = <span style="color:#006600; font-weight:bold;">%</span>w<span style="color:#006600; font-weight:bold;">&#40;</span>ten eleven twelve<span style="color:#006600; font-weight:bold;">&#41;</span>
Handred = <span style="color:#996600;">&quot; handred&quot;</span>
Thousand = <span style="color:#996600;">&quot; thousand&quot;</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">def</span> spell<span style="color:#006600; font-weight:bold;">&#40;</span>num<span style="color:#006600; font-weight:bold;">&#41;</span>
  r = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
  d = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
  <span style="color:#006600; font-weight:bold;">&#40;</span>0..3<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">each</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>digit<span style="color:#006600; font-weight:bold;">|</span>
    d<span style="color:#006600; font-weight:bold;">&#91;</span>digit<span style="color:#006600; font-weight:bold;">&#93;</span> = num <span style="color:#006600; font-weight:bold;">%</span> <span style="color:#006666;">10</span><span style="color:#006600; font-weight:bold;">**</span><span style="color:#006600; font-weight:bold;">&#40;</span>digit<span style="color:#006600; font-weight:bold;">+</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">/</span> <span style="color:#006666;">10</span><span style="color:#006600; font-weight:bold;">**</span>digit
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  r <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> One_to_Nine<span style="color:#006600; font-weight:bold;">&#91;</span>d<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">3</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#006600; font-weight:bold;">+</span> Thousand <span style="color:#9966CC; font-weight:bold;">if</span> d<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">3</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#006600; font-weight:bold;">&gt;</span> <span style="color:#006666;">0</span>
  r <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> One_to_Nine<span style="color:#006600; font-weight:bold;">&#91;</span>d<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">2</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#006600; font-weight:bold;">+</span> Handred  <span style="color:#9966CC; font-weight:bold;">if</span> d<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">2</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#006600; font-weight:bold;">&gt;</span> <span style="color:#006666;">0</span>
  r <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> <span style="color:#996600;">&quot;and&quot;</span> <span style="color:#9966CC; font-weight:bold;">if</span> <span style="color:#006600; font-weight:bold;">&#40;</span>d<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">3</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#006600; font-weight:bold;">+</span> d<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">2</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">*</span> <span style="color:#006600; font-weight:bold;">&#40;</span>d<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#006600; font-weight:bold;">+</span> d<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&gt;</span> <span style="color:#006666;">0</span>
  <span style="color:#9966CC; font-weight:bold;">if</span> d<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#93;</span> == <span style="color:#006666;">1</span>
    r <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> Teen<span style="color:#006600; font-weight:bold;">&#91;</span>d<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#006600; font-weight:bold;">+</span> <span style="color:#996600;">&quot;teen&quot;</span> <span style="color:#9966CC; font-weight:bold;">if</span> d<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#006600; font-weight:bold;">&gt;</span> <span style="color:#006666;">2</span>
    r <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> Ten_to_Twelve<span style="color:#006600; font-weight:bold;">&#91;</span>d<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#9966CC; font-weight:bold;">if</span> d<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#006600; font-weight:bold;">&lt;</span>= <span style="color:#006666;">2</span>
  <span style="color:#9966CC; font-weight:bold;">else</span>
    r <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> Ty<span style="color:#006600; font-weight:bold;">&#91;</span>d<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#006600; font-weight:bold;">+</span> <span style="color:#996600;">&quot;ty&quot;</span> <span style="color:#9966CC; font-weight:bold;">if</span> d<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#006600; font-weight:bold;">&gt;</span> <span style="color:#006666;">1</span>
    r <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> One_to_Nine<span style="color:#006600; font-weight:bold;">&#91;</span>d<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#9966CC; font-weight:bold;">if</span> d<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#006600; font-weight:bold;">&gt;</span> <span style="color:#006666;">0</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
 r.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot; &quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#CC0066; font-weight:bold;">sub</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;ty &quot;</span>, <span style="color:#996600;">&quot;ty-&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">def</span> count_letter<span style="color:#006600; font-weight:bold;">&#40;</span>num<span style="color:#006600; font-weight:bold;">&#41;</span>
  spell<span style="color:#006600; font-weight:bold;">&#40;</span>num<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">tr</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot; -&quot;</span>, <span style="color:#996600;">&quot;&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">size</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#CC0066; font-weight:bold;">p</span> 1.<span style="color:#9900CC;">upto</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">1000</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">inject</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">|</span>s,n<span style="color:#006600; font-weight:bold;">|</span> s <span style="color:#006600; font-weight:bold;">+</span> count_letter<span style="color:#006600; font-weight:bold;">&#40;</span>n<span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#125;</span></pre></div></div>


<p>効率化しようとしてムダに力が入っているな・・。</p>

<p>今回はClojureで：</p>


<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>ns euler<span style="color: #66cc66;">.</span>p017<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>def one-to-nineteen
     <span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">&quot;&quot;</span> <span style="color: #ff0000;">&quot;one&quot;</span> <span style="color: #ff0000;">&quot;two&quot;</span> <span style="color: #ff0000;">&quot;three&quot;</span> <span style="color: #ff0000;">&quot;four&quot;</span> <span style="color: #ff0000;">&quot;five&quot;</span> <span style="color: #ff0000;">&quot;six&quot;</span> <span style="color: #ff0000;">&quot;seven&quot;</span> <span style="color: #ff0000;">&quot;eight&quot;</span> <span style="color: #ff0000;">&quot;nine&quot;</span>
      <span style="color: #ff0000;">&quot;ten&quot;</span> <span style="color: #ff0000;">&quot;eleven&quot;</span> <span style="color: #ff0000;">&quot;twelve&quot;</span> <span style="color: #ff0000;">&quot;thirteen&quot;</span> <span style="color: #ff0000;">&quot;fourteen&quot;</span> <span style="color: #ff0000;">&quot;fifteen&quot;</span>
      <span style="color: #ff0000;">&quot;sixteen&quot;</span> <span style="color: #ff0000;">&quot;seventeen&quot;</span> <span style="color: #ff0000;">&quot;eighteen&quot;</span> <span style="color: #ff0000;">&quot;nineteen&quot;</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>def twenty-to-ninety
     <span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">&quot;twenty&quot;</span> <span style="color: #ff0000;">&quot;thirty&quot;</span> <span style="color: #ff0000;">&quot;forty&quot;</span> <span style="color: #ff0000;">&quot;fifty&quot;</span> <span style="color: #ff0000;">&quot;sixty&quot;</span> <span style="color: #ff0000;">&quot;seventy&quot;</span> <span style="color: #ff0000;">&quot;eighty&quot;</span> <span style="color: #ff0000;">&quot;ninety&quot;</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>defn spell-num
  <span style="color: #ff0000;">&quot;Return number as english-word.&quot;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#91;</span>n<span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">&#40;</span>spell-num n <span style="color: #ff0000;">&quot;&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#91;</span>n preword<span style="color: #66cc66;">&#93;</span>
     <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cond</span>
       <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">=</span> n <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span> <span style="color: #ff0000;">&quot;&quot;</span>
       <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&lt;</span> n <span style="color: #cc66cc;">20</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>str preword <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">nth</span> one-to-nineteen n<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
       <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&lt;</span> n <span style="color: #cc66cc;">100</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>str preword
		      <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">nth</span> twenty-to-ninety <span style="color: #66cc66;">&#40;</span>/ <span style="color: #66cc66;">&#40;</span>- n <span style="color: #cc66cc;">20</span><span style="color: #66cc66;">&#41;</span> <span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
		      <span style="color: #66cc66;">&#40;</span>spell-num <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">rem</span> n <span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span> <span style="color: #ff0000;">&quot;-&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
       <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&lt;</span> n <span style="color: #cc66cc;">1000</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>str preword
		       <span style="color: #66cc66;">&#40;</span>spell-num <span style="color: #66cc66;">&#40;</span>/ n <span style="color: #cc66cc;">100</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #ff0000;">&quot; hundred&quot;</span>
		       <span style="color: #66cc66;">&#40;</span>spell-num <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">rem</span> n <span style="color: #cc66cc;">100</span><span style="color: #66cc66;">&#41;</span> <span style="color: #ff0000;">&quot; and &quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
       <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&lt;</span> n <span style="color: #cc66cc;">10000</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>str <span style="color: #66cc66;">&#40;</span>spell-num <span style="color: #66cc66;">&#40;</span>/ n <span style="color: #cc66cc;">1000</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #ff0000;">&quot; thousand&quot;</span>
			<span style="color: #66cc66;">&#40;</span>spell-num <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">rem</span> n <span style="color: #cc66cc;">1000</span><span style="color: #66cc66;">&#41;</span> <span style="color: #ff0000;">&quot; &quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>defn remove-spaces-and-hyphens
  <span style="color: #66cc66;">&#91;</span>word<span style="color: #66cc66;">&#93;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">apply</span> str <span style="color: #66cc66;">&#40;</span>re-seq #<span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\w</span>+&quot;</span> word<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>println <span style="color: #ff0000;">&quot;Answer : &quot;</span>
	 <span style="color: #66cc66;">&#40;</span>count
	  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">apply</span> str
		 <span style="color: #66cc66;">&#40;</span>map #<span style="color: #66cc66;">&#40;</span>remove-spaces-and-hyphens <span style="color: #66cc66;">&#40;</span>spell-num <span style="color: #66cc66;">%</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
		      <span style="color: #66cc66;">&#40;</span>range <span style="color: #cc66cc;">1</span> <span style="color: #cc66cc;">1001</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>


<p>再帰を中心に考えてみた。</p>

<p>spell-num の中に繰り返しパターンがあるのがちょっと気になる。うーむ。</p>

]]></content:encoded>
			<wfw:commentRss>http://manjilab.com/2010/01/11/project-euler-017/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
