<?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>マンジラボ &#187; Ruby</title>
	<atom:link href="http://manjilab.com/tag/ruby/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>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[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%3A%2F%2Fmanjilab.com%2F2010%2F01%2F16%2Fproject-euler-022%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Project%20Euler%20%23022%20%E2%80%93%20%E5%90%8D%E5%89%8D%E3%81%AE%E3%82%B9%E3%82%B3%E3%82%A2%22%20%7D);"></div>
<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[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%3A%2F%2Fmanjilab.com%2F2010%2F01%2F15%2Fproject-euler-021%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Project%20Euler%20%23021%20%E2%80%93%20%E5%8F%8B%E6%84%9B%E6%95%B0%22%20%7D);"></div>
<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[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%3A%2F%2Fmanjilab.com%2F2010%2F01%2F14%2Fproject-euler-020%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Project%20Euler%20%23020%20%E2%80%93%20100%E3%81%AE%E9%9A%8E%E4%B9%97%22%20%7D);"></div>
<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[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%3A%2F%2Fmanjilab.com%2F2010%2F01%2F13%2Fproject-euler-019%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Project%20Euler%20%23019%20%E2%80%93%20%E6%97%A5%E6%9B%9C%E6%97%A5%E3%81%A7%E5%A7%8B%E3%81%BE%E3%82%8B%E6%9C%88%22%20%7D);"></div>
<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[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%3A%2F%2Fmanjilab.com%2F2010%2F01%2F12%2Fproject-euler-018%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Project%20Euler%20%23018%20%E2%80%93%20%E5%92%8C%E3%81%8C%E6%9C%80%E5%A4%A7%E3%81%A8%E3%81%AA%E3%82%8B%E7%B5%8C%E8%B7%AF%22%20%7D);"></div>
<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[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%3A%2F%2Fmanjilab.com%2F2010%2F01%2F11%2Fproject-euler-017%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Project%20Euler%20%23017%20%E2%80%93%20%E6%95%B0%E5%AD%97%E3%82%92%E8%8B%B1%E5%8D%98%E8%AA%9E%E3%81%A7%22%20%7D);"></div>
<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>
		<item>
		<title>Project Euler #016 – 2の1000乗</title>
		<link>http://manjilab.com/2010/01/09/project-euler-016-%e2%80%93-2%e3%81%ae1000%e4%b9%97/</link>
		<comments>http://manjilab.com/2010/01/09/project-euler-016-%e2%80%93-2%e3%81%ae1000%e4%b9%97/#comments</comments>
		<pubDate>Sat, 09 Jan 2010 03:03:22 +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=338</guid>
		<description><![CDATA[Project EulerをClojureでおさらいシリーズ。<br />
Problem 16
こういうときのRubyの記述力は異常。]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%3A%2F%2Fmanjilab.com%2F2010%2F01%2F09%2Fproject-euler-016-%25e2%2580%2593-2%25e3%2581%25ae1000%25e4%25b9%2597%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Project%20Euler%20%23016%20%E2%80%93%202%E3%81%AE1000%E4%B9%97%22%20%7D);"></div>
<p>Project EulerをClojureでおさらいシリーズ。<br />
Problem 16</p>

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

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

<blockquote>
  <p>2<sup>15</sup> = 32768 の各桁の数字の和は 3 + 2 + 7 + 6 + 8 = 26 である。</p>
  
  <p>2<sup>1000</sup> の各桁の数字の和を求めよ。</p>
</blockquote>

<p>何の問題もない。big-integerバンザイ。</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> <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">2</span><span style="color:#006600; font-weight:bold;">**</span><span style="color:#006666;">1000</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>p016<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>defn pow
  <span style="color: #ff0000;">&quot;Return the N-th power of A.&quot;</span>
  <span style="color: #66cc66;">&#91;</span>a 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>replicate n a<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>pow <span style="color: #cc66cc;">2</span> <span style="color: #cc66cc;">1000</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>


<p>Project Euler では各桁を合計する処理がたびたび必要になるので sum-of-digits はライブラリ化したほうがいいのかも。</p>

]]></content:encoded>
			<wfw:commentRss>http://manjilab.com/2010/01/09/project-euler-016-%e2%80%93-2%e3%81%ae1000%e4%b9%97/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Project Euler #015 – 道順の組合せ</title>
		<link>http://manjilab.com/2010/01/09/project-euler-015/</link>
		<comments>http://manjilab.com/2010/01/09/project-euler-015/#comments</comments>
		<pubDate>Fri, 08 Jan 2010 17:58:09 +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=331</guid>
		<description><![CDATA[Project EulerをClojureでおさらいシリーズ。<br />
Problem 15
久々に紙と鉛筆でもいける問題。]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%3A%2F%2Fmanjilab.com%2F2010%2F01%2F09%2Fproject-euler-015%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Project%20Euler%20%23015%20%E2%80%93%20%E9%81%93%E9%A0%86%E3%81%AE%E7%B5%84%E5%90%88%E3%81%9B%22%20%7D);"></div>
<p>Project EulerをClojureでおさらいシリーズ。<br />
Problem 15</p>

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

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

<blockquote>
  <p>2×2のマス目の左上よりスタートして右下にたどり着く道順は6通りである。
  （ただし逆方向に引き返さないこととする）</p>
  
  <p><img src="http://projecteuler.net/project/images/p_015.gif" /></p>
  
  <p>20×20のマス目では何通りの道順が存在するかを求めよ。</p>
</blockquote>

<p><sub>40</sub>C<sub>20</sub> ですね。以上。</p>

<p>久々に紙と鉛筆でもいける問題。<br />
こういうのも嫌いじゃない。</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:#008000; font-style:italic;"># 40C20</span>
<span style="color:#CC0066; font-weight:bold;">p</span> 21.<span style="color:#9900CC;">upto</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">40</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;">1</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;">&#125;</span> <span style="color:#006600; font-weight:bold;">/</span> 1.<span style="color:#9900CC;">upto</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">20</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;">1</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;">&#125;</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>p015<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 comb
  <span style="color: #ff0000;">&quot;Return number of combinations from N choose M.&quot;</span>
  <span style="color: #66cc66;">&#91;</span>n m<span style="color: #66cc66;">&#93;</span>
  <span style="color: #66cc66;">&#40;</span>/ <span style="color: #66cc66;">&#40;</span>fact n<span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#40;</span>fact m<span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#40;</span>fact <span style="color: #66cc66;">&#40;</span>- n m<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>comb <span style="color: #66cc66;">&#40;</span>* <span style="color: #cc66cc;">20</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span> <span style="color: #cc66cc;">20</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/09/project-euler-015/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Project Euler #014 – コラッツの問題</title>
		<link>http://manjilab.com/2010/01/09/project-euler-014/</link>
		<comments>http://manjilab.com/2010/01/09/project-euler-014/#comments</comments>
		<pubDate>Fri, 08 Jan 2010 17:06:18 +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=327</guid>
		<description><![CDATA[Project EulerをClojureでおさらいシリーズ。<br />
Problem 14
計算の重複によるムダをいかに少なくするかがカギ。]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%3A%2F%2Fmanjilab.com%2F2010%2F01%2F09%2Fproject-euler-014%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Project%20Euler%20%23014%20%E2%80%93%20%E3%82%B3%E3%83%A9%E3%83%83%E3%83%84%E3%81%AE%E5%95%8F%E9%A1%8C%22%20%7D);"></div>
<p>Project EulerをClojureでおさらいシリーズ。<br />
Problem 14</p>

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

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

<blockquote>
  <p>正の整数に対して次のように繰り返す数列を定義する。</p>
  
  <p>n &rarr; n/2 （nが偶空の場合）
  n &rarr; 3n + 1 （nが奇数の場合）</p>
  
  <p>この規則に沿って 13からはじめると、次の数列を生成する。</p>
  
  <p>13 &rarr; 40 &rarr; 20 &rarr; 10 &rarr; 5 &rarr; 16 &rarr; 8 &rarr;
  4 &rarr; 2 &rarr; 1</p>
  
  <p>13からはじまり1でおわる10項の数列とみることができる。<br />
  どの数からはじめても最終的には１になると考えられているがまだ証明
  はされていない。（コラッツの問題）</p>
  
  <p>100万未満のどの数からスタートすれば最も長い数列を得られるかを求めよ。</p>
  
  <p>注意： 途中の項の数字が100万を越えてもかまわない。</p>
</blockquote>

<p>計算の重複によるムダをいかに少なくするかがカギかな。</p>

<p>Nに対する数列の長さは再帰的に求めて、その値をキャッシュするのがよさげ。</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:#9966CC; font-weight:bold;">def</span> next_collatz<span style="color:#006600; font-weight:bold;">&#40;</span>n<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#0000FF; font-weight:bold;">return</span> <span style="color:#006666;">1</span> <span style="color:#9966CC; font-weight:bold;">if</span> n == <span style="color:#006666;">1</span>
  <span style="color:#0000FF; font-weight:bold;">return</span> n <span style="color:#006600; font-weight:bold;">/</span> <span style="color:#006666;">2</span> <span style="color:#9966CC; font-weight:bold;">if</span> n.<span style="color:#9900CC;">even</span>?
  <span style="color:#006666;">3</span> <span style="color:#006600; font-weight:bold;">*</span> n <span style="color:#006600; font-weight:bold;">+</span> <span style="color:#006666;">1</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">def</span> get_chains_num<span style="color:#006600; font-weight:bold;">&#40;</span>n<span style="color:#006600; font-weight:bold;">&#41;</span>
  c = <span style="color:#006666;">1</span>
  <span style="color:#9966CC; font-weight:bold;">until</span> n == <span style="color:#006666;">1</span>
    n = next_collatz<span style="color:#006600; font-weight:bold;">&#40;</span>n<span style="color:#006600; font-weight:bold;">&#41;</span>
    c <span style="color:#006600; font-weight:bold;">+</span>= <span style="color:#006666;">1</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
  c
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#006600; font-weight:bold;">&#40;</span>Chains = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">0</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:#006600; font-weight:bold;">&#91;</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#40;</span>n<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#0000FF; font-weight:bold;">return</span> <span style="color:#9966CC; font-weight:bold;">super</span> <span style="color:#9966CC; font-weight:bold;">if</span> <span style="color:#9966CC; font-weight:bold;">super</span>
  <span style="color:#9966CC; font-weight:bold;">if</span> n <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#006666;">2</span>_000_000
    <span style="color:#0000FF; font-weight:bold;">return</span> Chains<span style="color:#006600; font-weight:bold;">&#91;</span>n<span style="color:#006600; font-weight:bold;">&#93;</span> = Chains<span style="color:#006600; font-weight:bold;">&#91;</span>next_collatz<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;">&#93;</span> <span style="color:#006600; font-weight:bold;">+</span> <span style="color:#006666;">1</span>
  <span style="color:#9966CC; font-weight:bold;">else</span> 
    <span style="color:#0000FF; font-weight:bold;">return</span> get_chains_num<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;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
max = <span style="color:#006666;">0</span>
point = <span style="color:#006666;">1</span>
1.<span style="color:#9900CC;">upto</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">1</span>_000_000 <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:#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>
  val = Chains<span style="color:#006600; font-weight:bold;">&#91;</span>n<span style="color:#006600; font-weight:bold;">&#93;</span>
  <span style="color:#9966CC; font-weight:bold;">if</span> val <span style="color:#006600; font-weight:bold;">&gt;</span> max
    max = val 
    point = n
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#CC0066; font-weight:bold;">p</span> <span style="color:#996600;">&quot;At #{point} : chain length = #{max}&quot;</span></pre></div></div>


<p><a href="http://manjilab.com/2009/11/11/project-euler-002/">Project Euler #002</a>
のときと同様に配列の特異メソッドとして定義することで、Nに対するコラッツ数の長さ
の値をキャッシュしています。</p>

<p>これが意外と速い。<br />
ruby1.9系だと20秒かかりませんでした。</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>p014<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>defn collatz-<span style="color: #b1b100;">length</span>
  <span style="color: #ff0000;">&quot;Return chain length of Collatz sequence 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;">cond</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">=</span> n <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span> <span style="color: #cc66cc;">1</span>
	<span style="color: #66cc66;">&#40;</span>even? n<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>inc <span style="color: #66cc66;">&#40;</span>collatz-<span style="color: #b1b100;">length</span> <span style="color: #66cc66;">&#40;</span>/ n <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span><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>inc <span style="color: #66cc66;">&#40;</span>collatz-<span style="color: #b1b100;">length</span> <span style="color: #66cc66;">&#40;</span>inc <span style="color: #66cc66;">&#40;</span>* <span style="color: #cc66cc;">3</span> 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><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>defn memoize-under
  <span style="color: #ff0000;">&quot;Apply memoize when arg is under limit.&quot;</span>
  <span style="color: #66cc66;">&#91;</span>limit f<span style="color: #66cc66;">&#93;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#91;</span>mem <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">atom</span> <span style="color: #66cc66;">&#123;</span><span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span>
    <span style="color: #66cc66;">&#40;</span>fn <span style="color: #66cc66;">&#91;</span>arg<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: #66cc66;">&gt;</span> arg limit<span style="color: #66cc66;">&#41;</span>
	<span style="color: #66cc66;">&#40;</span>f arg<span style="color: #66cc66;">&#41;</span>
	<span style="color: #66cc66;">&#40;</span>if-<span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#91;</span>e <span style="color: #66cc66;">&#40;</span>find @mem arg<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span>
	  <span style="color: #66cc66;">&#40;</span>val e<span style="color: #66cc66;">&#41;</span>
	  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#91;</span>ret <span style="color: #66cc66;">&#40;</span>f arg<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span>
	    <span style="color: #66cc66;">&#40;</span>swap<span style="color: #66cc66;">!</span> mem <span style="color: #b1b100;">assoc</span> arg ret<span style="color: #66cc66;">&#41;</span>
	    ret<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><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>def collatz-<span style="color: #b1b100;">length</span> <span style="color: #66cc66;">&#40;</span>memoize-under <span style="color: #cc66cc;">400000</span> collatz-<span style="color: #b1b100;">length</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>defn pick-grater-<span style="color: #b1b100;">last</span>
  <span style="color: #ff0000;">&quot;Pick coll of which last value is greater.&quot;</span>
  <span style="color: #66cc66;">&#91;</span>coll-<span style="color: #cc66cc;">1</span> coll-<span style="color: #cc66cc;">2</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: #66cc66;">&gt;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">last</span> coll-<span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>
	 <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">last</span> coll-<span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    coll-<span style="color: #cc66cc;">1</span>
    coll-<span style="color: #cc66cc;">2</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 pick-grater-<span style="color: #b1b100;">last</span>
		  <span style="color: #66cc66;">&#40;</span>map #<span style="color: #66cc66;">&#40;</span>vector <span style="color: #66cc66;">%</span> <span style="color: #66cc66;">&#40;</span>collatz-<span style="color: #b1b100;">length</span> <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;">1000000</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>キャッシュなしだと60秒を越えてしまったのでmemoizeを使うことに。</p>

<p>ところがmemoizeをそのまま使うとヒープの上限を越えてしまいました。</p>

<p>Javaのヒープを増やすという解決策は美しくないので、memoizeのソースを参考にして「ある数値以下の時だけmemoizeする関数」を定義することにしました。(memoize-under)</p>

<ul>
<li>キャッシュがヒットする頻度の分布は下の方に偏向しているはず</li>
<li>memoizeはハッシュなのでヒットする回数の少ないものはかえってキャッシュ
検索の効率を下げる</li>
</ul>

<p>との考えから40万をキャッシュする値の上限にしてあります。</p>

<p>この方法だと20秒かからずに計算が終了しました。</p>

]]></content:encoded>
			<wfw:commentRss>http://manjilab.com/2010/01/09/project-euler-014/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Clojureでメソッドチェイン風に記述するマクロ</title>
		<link>http://manjilab.com/2009/12/26/method-chain-on-clojur/</link>
		<comments>http://manjilab.com/2009/12/26/method-chain-on-clojur/#comments</comments>
		<pubDate>Fri, 25 Dec 2009 15:42:08 +0000</pubDate>
		<dc:creator>研究所大佐</dc:creator>
				<category><![CDATA[Clojure]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://manjilab.com/?p=321</guid>
		<description><![CDATA[ClojureのAPIリストを眺めていたら面白いマクロがありました。
-> と ->> です。
Rubyのメソッドチェインのようなことができます。]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%3A%2F%2Fmanjilab.com%2F2009%2F12%2F26%2Fmethod-chain-on-clojur%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Clojure%E3%81%A7%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%83%81%E3%82%A7%E3%82%A4%E3%83%B3%E9%A2%A8%E3%81%AB%E8%A8%98%E8%BF%B0%E3%81%99%E3%82%8B%E3%83%9E%E3%82%AF%E3%83%AD%22%20%7D);"></div>
<p>ClojureのAPIリストを眺めていたら面白いマクロがありました。
-> と ->> です。</p>

<p>Rubyのメソッドチェインのようなことができます。<br />
例えば次のようなRubyでの処理は</p>


<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">123456789.<span style="color:#9900CC;">to_s</span>.<span style="color:#9900CC;">length</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006666;">9</span></pre></div></div>


<p>ClojureでもJavaのメソッドを直接使う場合は
.. でチェインできます。</p>


<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;">user<span style="color: #66cc66;">&gt;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">..</span> <span style="color: #cc66cc;">123456789</span> toString <span style="color: #b1b100;">length</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">=&gt;</span> <span style="color: #cc66cc;">9</span></pre></div></div>


<p>-> を使えばこれをClojure上の関数で実現できます。</p>


<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;">user<span style="color: #66cc66;">&gt;</span> <span style="color: #66cc66;">&#40;</span>-<span style="color: #66cc66;">&gt;</span> <span style="color: #cc66cc;">123456789</span> str count<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">=&gt;</span> <span style="color: #cc66cc;">9</span></pre></div></div>


<p>123を文字化して逆順にする場合</p>


<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;">user<span style="color: #66cc66;">&gt;</span> <span style="color: #66cc66;">&#40;</span>-<span style="color: #66cc66;">&gt;</span> <span style="color: #cc66cc;">123</span> str <span style="color: #b1b100;">reverse</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">=&gt;</span> <span style="color: #66cc66;">&#40;</span>\<span style="color: #cc66cc;">3</span> \<span style="color: #cc66cc;">2</span> \<span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span></pre></div></div>


<p>reverseは文字のシーケンスを返すので</p>


<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;">user<span style="color: #66cc66;">&gt;</span> <span style="color: #66cc66;">&#40;</span>-<span style="color: #66cc66;">&gt;&gt;</span> <span style="color: #cc66cc;">123</span> str <span style="color: #b1b100;">reverse</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">apply</span> str<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">=&gt;</span> <span style="color: #ff0000;">&quot;321&quot;</span></pre></div></div>


<p>のようにします。今回は -> ではなく ->> をつかいました。</p>

<p>この -> と ->> の違いはなんでしょう。</p>

<p>簡単な例で検証してみます。</p>

<p>例）2に3を足してから4倍する</p>


<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;">user<span style="color: #66cc66;">&gt;</span> <span style="color: #66cc66;">&#40;</span>-<span style="color: #66cc66;">&gt;</span> <span style="color: #cc66cc;">2</span> <span style="color: #66cc66;">&#40;</span>+ <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>* <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">=&gt;</span> <span style="color: #cc66cc;">20</span>
&nbsp;
user<span style="color: #66cc66;">&gt;</span> <span style="color: #66cc66;">&#40;</span>-<span style="color: #66cc66;">&gt;&gt;</span> <span style="color: #cc66cc;">2</span> <span style="color: #66cc66;">&#40;</span>+ <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>* <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">=&gt;</span> <span style="color: #cc66cc;">20</span></pre></div></div>


<p>この例では同じ結果ですね。<br />
次の場合はどうでしょう。</p>


<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;">user<span style="color: #66cc66;">&gt;</span> <span style="color: #66cc66;">&#40;</span>-<span style="color: #66cc66;">&gt;</span> <span style="color: #cc66cc;">8</span> <span style="color: #66cc66;">&#40;</span>* <span style="color: #cc66cc;">6</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>/ <span style="color: #cc66cc;">2</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">=&gt;</span> <span style="color: #cc66cc;">8</span>
&nbsp;
user<span style="color: #66cc66;">&gt;</span> <span style="color: #66cc66;">&#40;</span>-<span style="color: #66cc66;">&gt;&gt;</span> <span style="color: #cc66cc;">8</span> <span style="color: #66cc66;">&#40;</span>* <span style="color: #cc66cc;">6</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>/ <span style="color: #cc66cc;">2</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">=&gt;</span> <span style="color: #cc66cc;">1</span>/<span style="color: #cc66cc;">72</span></pre></div></div>


<p>ここで違いがでました。</p>

<p>それぞれのマクロを展開してみます。</p>


<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>-<span style="color: #66cc66;">&gt;</span> <span style="color: #cc66cc;">8</span> <span style="color: #66cc66;">&#40;</span>* <span style="color: #cc66cc;">6</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>/ <span style="color: #cc66cc;">2</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> → <span style="color: #66cc66;">&#40;</span>/ <span style="color: #66cc66;">&#40;</span>* <span style="color: #cc66cc;">8</span> <span style="color: #cc66cc;">6</span><span style="color: #66cc66;">&#41;</span> <span style="color: #cc66cc;">2</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>-<span style="color: #66cc66;">&gt;&gt;</span> <span style="color: #cc66cc;">8</span> <span style="color: #66cc66;">&#40;</span>* <span style="color: #cc66cc;">6</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>/ <span style="color: #cc66cc;">2</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> → <span style="color: #66cc66;">&#40;</span>/ <span style="color: #cc66cc;">2</span> <span style="color: #cc66cc;">3</span> <span style="color: #66cc66;">&#40;</span>* <span style="color: #cc66cc;">6</span> <span style="color: #cc66cc;">8</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>


<p>引数を複数とる関数を対して関数名の次に展開するのが -><br />
末尾に展開するが ->> という違いでした。</p>

<p>先の例では (apply str (文字のシーケンス)) という処理をしたいので ->> を
使うことになります。</p>

]]></content:encoded>
			<wfw:commentRss>http://manjilab.com/2009/12/26/method-chain-on-clojur/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
