<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/2.0.6" -->
<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/"
	>

<channel>
	<title>David Tran's blog</title>
	<link>http://davidtran.doublegifts.com/blog</link>
	<description></description>
	<pubDate>Mon, 19 Jul 2010 01:24:37 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.0.6</generator>
	<language>en</language>
			<item>
		<title>Prime numbers</title>
		<link>http://davidtran.doublegifts.com/blog/?p=156</link>
		<comments>http://davidtran.doublegifts.com/blog/?p=156#comments</comments>
		<pubDate>Sun, 18 Jul 2010 02:07:10 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category>Haskell</category>

		<guid isPermaLink="false">http://davidtran.doublegifts.com/blog/?p=156</guid>
		<description><![CDATA[
{-
    Program : Prime.hs
    Author  : David Tran
    Date    : 2010-07-17

    Below references show many ways to construct prime numbers:
    * http://www.haskell.org/haskellwiki/Prime_numbers
    * Melissa E. O’Neill, The Genuine Sieve of Eratosthenes
   [...]]]></description>
			<content:encoded><![CDATA[<pre>
{-
    Program : Prime.hs
    Author  : David Tran
    Date    : 2010-07-17

    Below references show many ways to construct prime numbers:
    * http://www.haskell.org/haskellwiki/Prime_numbers
    * Melissa E. O’Neill, The Genuine Sieve of Eratosthenes
      http://www.cs.hmc.edu/~oneill/papers/Sieve-JFP.pdf
      http://lambda-the-ultimate.org/node/3127

    The classic one-liner is very elegant:
    primes = sieve [2..] where sieve (p:xs) = p : sieve [x | x <- xs, x `mod` p > 0]
    However, it may be also the slowest&#8230;

    The reason that I wrote my own version is because, after read yen3&#8217;s blog
    (Chinese) http://yen3rc.blogspot.com/2010/03/haskell-practice-prime-2.html
    I like to try the idea of list 6n+1 and 6n+5.

-}

module Prime (isPrime, primes) where

primes :: [Integer]
primes = 2:3:5: filter isPrime&#39; ns
  where ns = foldr (&#92;n acc -> 6*n+1 : 6*n+5 : acc) [] [1..]
-&#45;      ns = concat $ zipWith (&#92;x y -> [x,y]) [7, 13..] [11, 17..]

isPrime&#39; :: Integer -> Bool
isPrime&#39; n = check primes
  where check (p:ps) | p < n'    = if (n `mod` p == 0) then False else check ps
                     | otherwise = True
        n' = truncate (sqrt $ fromIntegral n) + 1

isPrime :: Integer -> Bool
isPrime n | n < 2     = False
          | otherwise = isPrime' n

{-
isPrime :: Integer -> Bool
isPrime n = n `elem` takeWhile (<=n) primes
-}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://davidtran.doublegifts.com/blog/?feed=rss2&amp;p=156</wfw:commentRss>
		</item>
		<item>
		<title>SOE ex.5.9 (2)</title>
		<link>http://davidtran.doublegifts.com/blog/?p=153</link>
		<comments>http://davidtran.doublegifts.com/blog/?p=153#comments</comments>
		<pubDate>Sun, 22 Nov 2009 02:23:53 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category>Haskell - SOE</category>

		<guid isPermaLink="false">http://davidtran.doublegifts.com/blog/?p=153</guid>
		<description><![CDATA[
{-

&#160;&#160;&#160;&#160;Program&#160;:&#160;make_change.hs
&#160;&#160;&#160;&#160;Author&#160;&#160;:&#160;David&#160;Tran
&#160;&#160;&#160;&#160;Date&#160;&#160;&#160;&#160;:&#160;2008-10-25

&#160;&#160;&#160;&#160;On&#160;the&#160;SOE&#160;exercise&#160;5.9&#160;(http://davidtran.doublegifts.com/blog/?p=37)
&#160;&#160;&#160;&#160;I&#160;said&#160;that&#160;I&#160;will&#160;find&#160;a&#160;solution&#160;for&#160;it.&#160;Here&#160;it&#160;is.
&#160;&#160;&#160;&#160;The&#160;make&#160;change&#160;question&#160;could&#160;be&#160;considered&#160;as&#160;partitions&#160;of&#160;integers
&#160;&#160;&#160;&#160;problem.&#160;(http://davidtran.doublegifts.com/blog/?p=152)
&#160;&#160;&#160;&#160;The&#160;amount&#160;money&#160;is&#160;the&#160;interger&#160;to&#160;be&#160;partition.
&#160;&#160;&#160;&#160;The&#160;coins&#160;are&#160;the&#160;generating&#160;functions;&#160;only&#160;select&#160;functions&#160;matchs&#160;coins&#39; value.

&#160;&#160;&#160;&#160;Examples:
&#160;&#160;&#160;&#160;makeChange&#160;99&#160;[5,&#160;1]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ==&#62;&#160;[19,4]
&#160;&#160;&#160;&#160;makeChange&#160;18&#160;[10,&#160;9,&#160;3,&#160;1]&#160;&#160;==&#62;&#160;[0,2,0,0]

-}
import&#160;Data.List
import&#160;Data.Maybe

type&#160;Constant&#160;=&#160;(Int,&#160;Int)&#160;&#160;&#160;&#160;&#160;&#160; -&#45; &#34;Constant&#34; at &#34;Position&#34;
type&#160;Coefficient&#160;=&#160;[&#160;Constant&#160;]&#160;&#160;-&#45; &#34;Sum&#34; of Constant
type&#160;Exponent&#160;=&#160;Int
type&#160;Term&#160;=&#160;(Coefficient,&#160;Exponent)
type&#160;Polynomial&#160;=&#160;[&#160;Term&#160;]&#160;&#160;&#160;&#160;&#160;&#160; -&#45; &#34;Sum&#34; of Term

term&#160;::&#160;Int&#160;-&#62;&#160;Int&#160;-&#62;&#160;Polynomial
term&#160;max&#160;n&#160;=&#160;([],0)&#160;:&#160;[&#160;([(n,i)],&#160;n&#160;*&#160;i)&#160;&#124;&#160;i&#160;&#60;-&#160;[1..&#160;max&#160;`div`&#160;n&#160;]&#160;]

mult&#160;::&#160;Int&#160;-&#62;&#160;Polynomial&#160;-&#62;&#160;Polynomial&#160;-&#62;&#160;Polynomial
mult&#160;max&#160;p1&#160;p2&#160;=&#160;[&#160;(c1++c2,&#160;e1+e2)&#160;&#124;&#160;(c1,e1)&#160;&#60;-&#160;p1,&#160;(c2,e2)&#160;&#60;-&#160;p2,&#160;e1+e2&#160;&#60;=&#160;max&#160;]

makeChange&#160;::&#160;Int&#160;-&#62;&#160;[Int]&#160;-&#62;&#160;[Int]
makeChange&#160;n&#160;cs&#160;=&#160;to_solution&#160;$&#160;min_change&#160;$&#160;only_coeff&#160;$&#160;filter_terms&#160;$&#160;generate_terms&#160;
&#160;&#160;where
&#160;&#160;generate_terms&#160;=&#160;foldr1&#160;(mult&#160;n)&#160;(map&#160;(term&#160;n)&#160;cs)
&#160;&#160;filter_terms&#160;&#160; =&#160;filter&#160;(&#92;(c,&#160;e)&#160;-&#62;&#160;e&#160;==&#160;n)
&#160;&#160;only_coeff&#160;&#160;&#160;&#160; =&#160;map&#160;(&#92;(c,&#160;e)&#160;-&#62;&#160;c)
&#160;&#160;min_change&#160;&#160;&#160;&#160; =&#160;minimumBy&#160;(&#92;x&#160;y&#160;-&#62;&#160;compare&#160;(countCoin&#160;x)&#160;(countCoin&#160;y))
&#160;&#160;countCoin&#160;&#160;&#160;&#160;&#160;&#160;=&#160;foldr&#160;(&#92;(c,t)&#160;sum&#160;-&#62;&#160;sum&#160;+&#160;t)&#160;0
&#160;&#160;to_solution&#160;xs&#160;=&#160;map&#160;(&#92;c&#160;-&#62;&#160;fromMaybe&#160;0&#160;(lookup&#160;c&#160;xs))&#160;cs
&#160;&#160;



]]></description>
			<content:encoded><![CDATA[<pre><code><font face="monospace">
<font color="#0000ff">{-</font>

&nbsp;&nbsp;&nbsp;&nbsp;Program&nbsp;<font color="#804040"><b>:</b></font>&nbsp;make_change<font color="#804040"><b>.</b></font>hs
&nbsp;&nbsp;&nbsp;&nbsp;Author&nbsp;&nbsp;<font color="#804040"><b>:</b></font>&nbsp;David&nbsp;Tran
&nbsp;&nbsp;&nbsp;&nbsp;Date&nbsp;&nbsp;&nbsp;&nbsp;<font color="#804040"><b>:</b></font>&nbsp;<font color="#ff00ff">2008</font><font color="#804040"><b>-</b></font><font color="#ff00ff">10</font><font color="#804040"><b>-</b></font><font color="#ff00ff">25</font>

&nbsp;&nbsp;&nbsp;&nbsp;On&nbsp;the&nbsp;SOE&nbsp;exercise&nbsp;<font color="#ff00ff">5.9</font>&nbsp;(http<font color="#804040"><b>://</b></font>davidtran<font color="#804040"><b>.</b></font>doublegifts<font color="#804040"><b>.</b></font>com<font color="#804040"><b>/</b></font>blog<font color="#804040"><b>/?</b></font>p<font color="#804040"><b>=</b></font><font color="#ff00ff">37</font>)
&nbsp;&nbsp;&nbsp;&nbsp;I&nbsp;said&nbsp;that&nbsp;I&nbsp;will&nbsp;find&nbsp;a&nbsp;solution&nbsp;for&nbsp;it<font color="#804040"><b>.</b></font>&nbsp;Here&nbsp;it&nbsp;is<font color="#804040"><b>.</b></font>
&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;make&nbsp;change&nbsp;question&nbsp;could&nbsp;be&nbsp;considered&nbsp;as&nbsp;partitions&nbsp;<font color="#804040"><b>of</b></font>&nbsp;integers
&nbsp;&nbsp;&nbsp;&nbsp;problem<font color="#804040"><b>.</b></font>&nbsp;(http<font color="#804040"><b>://</b></font>davidtran<font color="#804040"><b>.</b></font>doublegifts<font color="#804040"><b>.</b></font>com<font color="#804040"><b>/</b></font>blog<font color="#804040"><b>/?</b></font>p<font color="#804040"><b>=</b></font><font color="#ff00ff">152</font>)
&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;amount&nbsp;money&nbsp;is&nbsp;the&nbsp;interger&nbsp;to&nbsp;be&nbsp;partition<font color="#804040"><b>.</b></font>
&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;coins&nbsp;are&nbsp;the&nbsp;generating&nbsp;functions;&nbsp;only&nbsp;select&nbsp;functions&nbsp;matchs&nbsp;coins&#39; value<font color="#804040"><b>.</b></font>

&nbsp;&nbsp;&nbsp;&nbsp;Examples<font color="#804040"><b>:</b></font>
&nbsp;&nbsp;&nbsp;&nbsp;makeChange&nbsp;<font color="#ff00ff">99</font>&nbsp;[<font color="#ff00ff">5</font>,&nbsp;<font color="#ff00ff">1</font>]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#804040"><b>==&gt;</b></font>&nbsp;[<font color="#ff00ff">19</font>,<font color="#ff00ff">4</font>]
&nbsp;&nbsp;&nbsp;&nbsp;makeChange&nbsp;<font color="#ff00ff">18</font>&nbsp;[<font color="#ff00ff">10</font>,&nbsp;<font color="#ff00ff">9</font>,&nbsp;<font color="#ff00ff">3</font>,&nbsp;<font color="#ff00ff">1</font>]&nbsp;&nbsp;<font color="#804040"><b>==&gt;</b></font>&nbsp;[<font color="#ff00ff">0</font>,<font color="#ff00ff">2</font>,<font color="#ff00ff">0</font>,<font color="#ff00ff">0</font>]

<font color="#804040"><b>-</b></font>}
<font color="#a020f0">import</font>&nbsp;Data.List
<font color="#a020f0">import</font>&nbsp;Data.Maybe

<font color="#2e8b57"><b>type</b></font>&nbsp;Constant&nbsp;<font color="#804040"><b>=</b></font>&nbsp;(Int,&nbsp;Int)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#0000ff">-&#45; &quot;Constant&quot; at &quot;Position&quot;</font>
<font color="#2e8b57"><b>type</b></font>&nbsp;Coefficient&nbsp;<font color="#804040"><b>=</b></font>&nbsp;[&nbsp;Constant&nbsp;]&nbsp;&nbsp;<font color="#0000ff">-&#45; &quot;Sum&quot; of Constant</font>
<font color="#2e8b57"><b>type</b></font>&nbsp;Exponent&nbsp;<font color="#804040"><b>=</b></font>&nbsp;Int
<font color="#2e8b57"><b>type</b></font>&nbsp;Term&nbsp;<font color="#804040"><b>=</b></font>&nbsp;(Coefficient,&nbsp;Exponent)
<font color="#2e8b57"><b>type</b></font>&nbsp;Polynomial&nbsp;<font color="#804040"><b>=</b></font>&nbsp;[&nbsp;Term&nbsp;]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#0000ff">-&#45; &quot;Sum&quot; of Term</font>

term&nbsp;<font color="#804040"><b>::</b></font>&nbsp;Int&nbsp;<font color="#804040"><b>-&gt;</b></font>&nbsp;Int&nbsp;<font color="#804040"><b>-&gt;</b></font>&nbsp;Polynomial
term&nbsp;max&nbsp;n&nbsp;<font color="#804040"><b>=</b></font>&nbsp;([],<font color="#ff00ff">0</font>)&nbsp;<font color="#804040"><b>:</b></font>&nbsp;[&nbsp;([(n,i)],&nbsp;n&nbsp;<font color="#804040"><b>*</b></font>&nbsp;i)&nbsp;<font color="#804040"><b>|</b></font>&nbsp;i&nbsp;<font color="#804040"><b>&lt;-</b></font>&nbsp;[<font color="#ff00ff">1</font><font color="#804040"><b>..</b></font>&nbsp;max&nbsp;<font color="#804040"><b>`div`</b></font>&nbsp;n&nbsp;]&nbsp;]

mult&nbsp;<font color="#804040"><b>::</b></font>&nbsp;Int&nbsp;<font color="#804040"><b>-&gt;</b></font>&nbsp;Polynomial&nbsp;<font color="#804040"><b>-&gt;</b></font>&nbsp;Polynomial&nbsp;<font color="#804040"><b>-&gt;</b></font>&nbsp;Polynomial
mult&nbsp;max&nbsp;p1&nbsp;p2&nbsp;<font color="#804040"><b>=</b></font>&nbsp;[&nbsp;(c1<font color="#804040"><b>++</b></font>c2,&nbsp;e1<font color="#804040"><b>+</b></font>e2)&nbsp;<font color="#804040"><b>|</b></font>&nbsp;(c1,e1)&nbsp;<font color="#804040"><b>&lt;-</b></font>&nbsp;p1,&nbsp;(c2,e2)&nbsp;<font color="#804040"><b>&lt;-</b></font>&nbsp;p2,&nbsp;e1<font color="#804040"><b>+</b></font>e2&nbsp;<font color="#804040"><b>&lt;=</b></font>&nbsp;max&nbsp;]

makeChange&nbsp;<font color="#804040"><b>::</b></font>&nbsp;Int&nbsp;<font color="#804040"><b>-&gt;</b></font>&nbsp;[Int]&nbsp;<font color="#804040"><b>-&gt;</b></font>&nbsp;[Int]
makeChange&nbsp;n&nbsp;cs&nbsp;<font color="#804040"><b>=</b></font>&nbsp;to_solution&nbsp;<font color="#804040"><b>$</b></font>&nbsp;min_change&nbsp;<font color="#804040"><b>$</b></font>&nbsp;only_coeff&nbsp;<font color="#804040"><b>$</b></font>&nbsp;filter_terms&nbsp;<font color="#804040"><b>$</b></font>&nbsp;generate_terms&nbsp;
&nbsp;&nbsp;<font color="#2e8b57"><b>where</b></font>
&nbsp;&nbsp;generate_terms&nbsp;<font color="#804040"><b>=</b></font>&nbsp;foldr1&nbsp;(mult&nbsp;n)&nbsp;(map&nbsp;(term&nbsp;n)&nbsp;cs)
&nbsp;&nbsp;filter_terms&nbsp;&nbsp; <font color="#804040"><b>=</b></font>&nbsp;filter&nbsp;(<font color="#804040"><b>&#92;</b></font>(c,&nbsp;e)&nbsp;<font color="#804040"><b>-&gt;</b></font>&nbsp;e&nbsp;<font color="#804040"><b>==</b></font>&nbsp;n)
&nbsp;&nbsp;only_coeff&nbsp;&nbsp;&nbsp;&nbsp; <font color="#804040"><b>=</b></font>&nbsp;map&nbsp;(<font color="#804040"><b>&#92;</b></font>(c,&nbsp;e)&nbsp;<font color="#804040"><b>-&gt;</b></font>&nbsp;c)
&nbsp;&nbsp;min_change&nbsp;&nbsp;&nbsp;&nbsp; <font color="#804040"><b>=</b></font>&nbsp;minimumBy&nbsp;(<font color="#804040"><b>&#92;</b></font>x&nbsp;y&nbsp;<font color="#804040"><b>-&gt;</b></font>&nbsp;compare&nbsp;(countCoin&nbsp;x)&nbsp;(countCoin&nbsp;y))
&nbsp;&nbsp;countCoin&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#804040"><b>=</b></font>&nbsp;foldr&nbsp;(<font color="#804040"><b>&#92;</b></font>(c,t)&nbsp;sum&nbsp;<font color="#804040"><b>-&gt;</b></font>&nbsp;sum&nbsp;<font color="#804040"><b>+</b></font>&nbsp;t)&nbsp;<font color="#ff00ff">0</font>
&nbsp;&nbsp;to_solution&nbsp;xs&nbsp;<font color="#804040"><b>=</b></font>&nbsp;map&nbsp;(<font color="#804040"><b>&#92;</b></font>c&nbsp;<font color="#804040"><b>-&gt;</b></font>&nbsp;fromMaybe&nbsp;<font color="#ff00ff">0</font>&nbsp;(lookup&nbsp;c&nbsp;xs))&nbsp;cs
&nbsp;&nbsp;

</font>
</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://davidtran.doublegifts.com/blog/?feed=rss2&amp;p=153</wfw:commentRss>
		</item>
		<item>
		<title>Partitions of Integers</title>
		<link>http://davidtran.doublegifts.com/blog/?p=152</link>
		<comments>http://davidtran.doublegifts.com/blog/?p=152#comments</comments>
		<pubDate>Sat, 21 Nov 2009 13:16:42 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category>Haskell</category>

		<guid isPermaLink="false">http://davidtran.doublegifts.com/blog/?p=152</guid>
		<description><![CDATA[
{-
&#160;
&#160;&#160;Program ..&#46;..&#46; : partition.hs (Partitions of Integers)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Partitions of Integers using generating function
&#160;&#160;Author ..&#46;..&#46;. : David Tran
&#160;&#160;Date ..&#46;..&#46;..&#46; : 2008-10-25
&#160;&#160;References ..&#46; : http://en.wikipedia.org/wiki/Partition_%28number_theory%29
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; http://chowkafat.net/Enumeration15.html 

&#160;&#160;========================================================================
&#160;&#160;
&#160;&#160;Here&#160;shows&#160;example&#160;for&#160;n&#160;==&#160;3
&#160;&#160;*&#160;To&#160;simply&#160;the&#160;calculation,&#160;the&#160;coefficient&#160;of&#160;term&#160;x^0&#160;is&#160;always&#160;([],0)
&#160;&#160;*&#160;most&#160;time&#160;we&#160;are&#160;interested&#160;only&#160;on&#160;term&#160;&#34;n&#34;&#160;(limited&#160;constant).&#160;
&#160;&#160;&#160;&#160;So&#160;any&#160;term&#160;&#62;&#160;n&#160;is&#160;no&#160;need&#160;to&#160;calculate;
&#160;&#160;&#160;&#160;that&#39;s&#160;the&#160;&#34;max&#34;&#160;for;&#160;so&#160;we&#160;will&#160;not&#160;have&#160;an&#160;infinity&#160;of&#160;terms&#160;Polynomial.

&#160;&#160;term&#160;3&#160;1&#160;=&#160;[&#160;([],0),&#160;([(1,1)],1),&#160;([(1,2)],2),&#160;([(1,3)],&#160;3)&#160;]
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; =&#160;(&#160;1&#160;x^0&#160;+&#160;(N1&#160;x)^1&#160;+&#160;(N1&#160;x)^2&#160;+&#160;(N1&#160;x)^3&#160;)
&#160;&#160;term&#160;3&#160;2&#160;=&#160;[&#160;([],0),&#160;([(2,1)],2)&#160;]
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; =&#160;(&#160;1&#160;x^0&#160;+&#160;(N2&#160;x)^1&#160;)
&#160;&#160;term&#160;3&#160;3&#160;=&#160;[&#160;([],0),&#160;([(3,1)],3)&#160;]
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; =&#160;(&#160;1&#160;x^0&#160;+&#160;(N3&#160;x)^1&#160;)

&#160;&#160;multiple&#160;the&#160;3&#160;terms&#160;=&#160;(term&#160;3&#160;1)&#160;*&#160;(term&#160;3&#160;2)&#160;*&#160;(term&#160;3&#160;3)
&#160;&#160;mult&#160;3&#160;(term&#160;3&#160;3)&#160;$&#160;mult&#160;3&#160;(term&#160;3&#160;1)&#160;(term&#160;3&#160;2)
&#160;&#160;=&#160;[&#160;([],0),&#160;([(2,1)],2),&#160;([(1,1)],1),&#160;([(1,1),(2,1)],3),
&#160;&#160;&#160;&#160;&#160;&#160;([(1,2)],2),&#160;([(1,3)],3),&#160;([(3,1)],3)&#160;]

&#160;&#160;([(1,1),1)&#160;is&#160;for&#160;term&#160;x^1&#160;=&#62;&#160;(1,1)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; =&#62;&#160;1&#160;=&#160;1
&#160;&#160;for&#160;term&#160;x^2,&#160;we&#160;got&#160;[(2,1)]&#160;and&#160;[(1,2)]&#160;&#160;&#160;&#160;&#160;&#160;=&#62;&#160;2&#160;=&#160;2&#160;=&#160;1+1
&#160;&#160;for&#160;term&#160;x^3,&#160;[(1,1),(2,1)],&#160;[(1,3)],&#160;[(3,1)]&#160;=&#62;&#160;3&#160;=&#160;1&#160;+&#160;2
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; =&#160;1&#160;+&#160;1&#160;+&#160;1
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; =&#160;3
&#160;&#160;
&#160;&#160;========================================================================

&#160;&#160;Example&#160;Usage:

&#160;&#160;*Main&#62;&#160;partition&#160;5
&#160;&#160;[[(5,1)],[(2,1),(3,1)],[(1,1),(4,1)],[(1,1),(2,2)],[(1,2),(3,1)],[(1,3),(2,1)],[(1,5)]]

&#160;&#160;*Main&#62;&#160;pp_partition&#160;5
&#160;&#160;5=5
&#160;&#160;5=2+3
&#160;&#160;5=1+4
&#160;&#160;5=1+2+2
&#160;&#160;5=1+1+3
&#160;&#160;5=1+1+1+2
&#160;&#160;5=1+1+1+1+1

&#160;&#160;*Main&#62;&#160;countPartition&#160;5
&#160;&#160;7

-}

type&#160;Constant&#160;=&#160;(Int,&#160;Int)&#160;&#160;&#160;&#160;&#160;&#160; -&#45; &#34;Constant&#34; at &#34;Position&#34;
type&#160;Coefficient&#160;=&#160;[&#160;Constant&#160;]&#160;&#160;-&#45; &#34;Sum&#34; of Constant
type&#160;Exponent&#160;=&#160;Int
type&#160;Term&#160;=&#160;(Coefficient,&#160;Exponent)
type&#160;Polynomial&#160;=&#160;[&#160;Term&#160;]&#160;&#160;&#160;&#160;&#160;&#160; -&#45; &#34;Sum&#34; of Term

term&#160;::&#160;Int&#160;-&#62;&#160;Int&#160;-&#62;&#160;Polynomial
term&#160;max&#160;n&#160;=&#160;([],0)&#160;:&#160;[&#160;([(n,i)],&#160;n&#160;*&#160;i)&#160;&#124;&#160;i&#160;&#60;-&#160;[1..&#160;max&#160;`div`&#160;n&#160;]&#160;]

mult&#160;::&#160;Int&#160;-&#62;&#160;Polynomial&#160;-&#62;&#160;Polynomial&#160;-&#62;&#160;Polynomial
mult&#160;max&#160;p1&#160;p2&#160;=&#160;[&#160;(c1++c2,&#160;e1+e2)&#160;&#124;&#160;(c1,e1)&#160;&#60;-&#160;p1,&#160;(c2,e2)&#160;&#60;-&#160;p2,&#160;e1+e2&#160;&#60;=&#160;max&#160;]

partition&#160;::&#160;Int&#160;-&#62;&#160;[&#160;Coefficient&#160;]
partition&#160;n&#160;=&#160;only_coeff&#160;$&#160;filter_terms&#160;$&#160;generate_terms
&#160;&#160;where&#160;generate_terms&#160;=&#160;foldr1&#160;(mult&#160;n)&#160;(map&#160;(term&#160;n)&#160;[1..n])
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;filter_terms&#160;&#160; =&#160;filter&#160;(&#92;(c,&#160;e)&#160;-&#62;&#160;e&#160;==&#160;n)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;only_coeff&#160;&#160;&#160;&#160; =&#160;map&#160;(&#92;(c,&#160;e)&#160;-&#62;&#160;c)

countPartition&#160;::&#160;Int&#160;-&#62;&#160;Int
countPartition&#160;=&#160;length&#160;.&#160;partition

pp_partition&#160;::&#160;Int&#160;-&#62;&#160;IO()&#160;&#160; -&#45; pretty print partition
pp_partition&#160;n&#160;=&#160;sequence_&#160;$&#160;map&#160;showSum&#160;(partition&#160;n)
&#160;&#160;where&#160;showSum&#160;s&#160;=&#160;do&#160;putStr&#160;$&#160;(show&#160;n)&#160;++&#160;&#34;=&#34;&#160;++&#160;sumList&#160;(strList&#160;s)&#160;++&#160;&#34;&#92;n&#34;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;strList&#160;=&#160;foldl&#160;(&#92;acc&#160;(n,i)&#160;-&#62;&#160;acc&#160;++&#160;replicate&#160;i&#160;(show&#160;n))&#160;[]
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;sumList&#160;=&#160;foldl1&#160;(&#92;x&#160;y&#160;-&#62;&#160;x&#160;++&#160;&#34;+&#34;&#160;++&#160;y)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;





]]></description>
			<content:encoded><![CDATA[<pre><code><font face="monospace">
<font color="#0000ff">{-</font>
<font color="#0000ff">&nbsp;</font>
<font color="#0000ff">&nbsp;&nbsp;Program ..&#46;..&#46; : partition.hs (Partitions of Integers)</font>
<font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Partitions of Integers using generating function</font>
<font color="#0000ff">&nbsp;&nbsp;Author ..&#46;..&#46;. : David Tran</font>
<font color="#0000ff">&nbsp;&nbsp;Date ..&#46;..&#46;..&#46; : 2008-10-25</font>
<font color="#0000ff">&nbsp;&nbsp;References ..&#46; : <a href="http://en.wikipedia.org/wiki/Partition_%28number_theory%29">http://en.wikipedia.org/wiki/Partition_%28number_theory%29</a></font>
<font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://chowkafat.net/Enumeration15.html">http://chowkafat.net/Enumeration15.html</a> </font>

&nbsp;&nbsp;<font color="#804040"><b>========================================================================</b></font>
&nbsp;&nbsp;
&nbsp;&nbsp;Here&nbsp;shows&nbsp;example&nbsp;for&nbsp;n&nbsp;<font color="#804040"><b>==</b></font>&nbsp;<font color="#ff00ff">3</font>
&nbsp;&nbsp;<font color="#804040"><b>*</b></font>&nbsp;To&nbsp;simply&nbsp;the&nbsp;calculation,&nbsp;the&nbsp;coefficient&nbsp;<font color="#804040"><b>of</b></font>&nbsp;term&nbsp;x<font color="#804040"><b>^</b></font><font color="#ff00ff">0</font>&nbsp;is&nbsp;always&nbsp;([],<font color="#ff00ff">0</font>)
&nbsp;&nbsp;<font color="#804040"><b>*</b></font>&nbsp;most&nbsp;time&nbsp;we&nbsp;are&nbsp;interested&nbsp;only&nbsp;on&nbsp;term&nbsp;<font color="#ff00ff">&quot;n&quot;</font>&nbsp;(limited&nbsp;constant)<font color="#804040"><b>.</b></font>&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;So&nbsp;any&nbsp;term&nbsp;<font color="#804040"><b>&gt;</b></font>&nbsp;n&nbsp;is&nbsp;no&nbsp;need&nbsp;to&nbsp;calculate;
&nbsp;&nbsp;&nbsp;&nbsp;that&#39;s&nbsp;the&nbsp;<font color="#ff00ff">&quot;max&quot;</font>&nbsp;for;&nbsp;so&nbsp;we&nbsp;will&nbsp;not&nbsp;have&nbsp;an&nbsp;infinity&nbsp;<font color="#804040"><b>of</b></font>&nbsp;terms&nbsp;Polynomial<font color="#804040"><b>.</b></font>

&nbsp;&nbsp;term&nbsp;<font color="#ff00ff">3</font>&nbsp;<font color="#ff00ff">1</font>&nbsp;<font color="#804040"><b>=</b></font>&nbsp;[&nbsp;([],<font color="#ff00ff">0</font>),&nbsp;([(<font color="#ff00ff">1</font>,<font color="#ff00ff">1</font>)],<font color="#ff00ff">1</font>),&nbsp;([(<font color="#ff00ff">1</font>,<font color="#ff00ff">2</font>)],<font color="#ff00ff">2</font>),&nbsp;([(<font color="#ff00ff">1</font>,<font color="#ff00ff">3</font>)],&nbsp;<font color="#ff00ff">3</font>)&nbsp;]
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#804040"><b>=</b></font>&nbsp;(&nbsp;<font color="#ff00ff">1</font>&nbsp;x<font color="#804040"><b>^</b></font><font color="#ff00ff">0</font>&nbsp;<font color="#804040"><b>+</b></font>&nbsp;(N1&nbsp;x)<font color="#804040"><b>^</b></font><font color="#ff00ff">1</font>&nbsp;<font color="#804040"><b>+</b></font>&nbsp;(N1&nbsp;x)<font color="#804040"><b>^</b></font><font color="#ff00ff">2</font>&nbsp;<font color="#804040"><b>+</b></font>&nbsp;(N1&nbsp;x)<font color="#804040"><b>^</b></font><font color="#ff00ff">3</font>&nbsp;)
&nbsp;&nbsp;term&nbsp;<font color="#ff00ff">3</font>&nbsp;<font color="#ff00ff">2</font>&nbsp;<font color="#804040"><b>=</b></font>&nbsp;[&nbsp;([],<font color="#ff00ff">0</font>),&nbsp;([(<font color="#ff00ff">2</font>,<font color="#ff00ff">1</font>)],<font color="#ff00ff">2</font>)&nbsp;]
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#804040"><b>=</b></font>&nbsp;(&nbsp;<font color="#ff00ff">1</font>&nbsp;x<font color="#804040"><b>^</b></font><font color="#ff00ff">0</font>&nbsp;<font color="#804040"><b>+</b></font>&nbsp;(N2&nbsp;x)<font color="#804040"><b>^</b></font><font color="#ff00ff">1</font>&nbsp;)
&nbsp;&nbsp;term&nbsp;<font color="#ff00ff">3</font>&nbsp;<font color="#ff00ff">3</font>&nbsp;<font color="#804040"><b>=</b></font>&nbsp;[&nbsp;([],<font color="#ff00ff">0</font>),&nbsp;([(<font color="#ff00ff">3</font>,<font color="#ff00ff">1</font>)],<font color="#ff00ff">3</font>)&nbsp;]
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#804040"><b>=</b></font>&nbsp;(&nbsp;<font color="#ff00ff">1</font>&nbsp;x<font color="#804040"><b>^</b></font><font color="#ff00ff">0</font>&nbsp;<font color="#804040"><b>+</b></font>&nbsp;(N3&nbsp;x)<font color="#804040"><b>^</b></font><font color="#ff00ff">1</font>&nbsp;)

&nbsp;&nbsp;multiple&nbsp;the&nbsp;<font color="#ff00ff">3</font>&nbsp;terms&nbsp;<font color="#804040"><b>=</b></font>&nbsp;(term&nbsp;<font color="#ff00ff">3</font>&nbsp;<font color="#ff00ff">1</font>)&nbsp;<font color="#804040"><b>*</b></font>&nbsp;(term&nbsp;<font color="#ff00ff">3</font>&nbsp;<font color="#ff00ff">2</font>)&nbsp;<font color="#804040"><b>*</b></font>&nbsp;(term&nbsp;<font color="#ff00ff">3</font>&nbsp;<font color="#ff00ff">3</font>)
&nbsp;&nbsp;mult&nbsp;<font color="#ff00ff">3</font>&nbsp;(term&nbsp;<font color="#ff00ff">3</font>&nbsp;<font color="#ff00ff">3</font>)&nbsp;<font color="#804040"><b>$</b></font>&nbsp;mult&nbsp;<font color="#ff00ff">3</font>&nbsp;(term&nbsp;<font color="#ff00ff">3</font>&nbsp;<font color="#ff00ff">1</font>)&nbsp;(term&nbsp;<font color="#ff00ff">3</font>&nbsp;<font color="#ff00ff">2</font>)
&nbsp;&nbsp;<font color="#804040"><b>=</b></font>&nbsp;[&nbsp;([],<font color="#ff00ff">0</font>),&nbsp;([(<font color="#ff00ff">2</font>,<font color="#ff00ff">1</font>)],<font color="#ff00ff">2</font>),&nbsp;([(<font color="#ff00ff">1</font>,<font color="#ff00ff">1</font>)],<font color="#ff00ff">1</font>),&nbsp;([(<font color="#ff00ff">1</font>,<font color="#ff00ff">1</font>),(<font color="#ff00ff">2</font>,<font color="#ff00ff">1</font>)],<font color="#ff00ff">3</font>),
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;([(<font color="#ff00ff">1</font>,<font color="#ff00ff">2</font>)],<font color="#ff00ff">2</font>),&nbsp;([(<font color="#ff00ff">1</font>,<font color="#ff00ff">3</font>)],<font color="#ff00ff">3</font>),&nbsp;([(<font color="#ff00ff">3</font>,<font color="#ff00ff">1</font>)],<font color="#ff00ff">3</font>)&nbsp;]

&nbsp;&nbsp;([(<font color="#ff00ff">1</font>,<font color="#ff00ff">1</font>),<font color="#ff00ff">1</font>)&nbsp;is&nbsp;for&nbsp;term&nbsp;x<font color="#804040"><b>^</b></font><font color="#ff00ff">1</font>&nbsp;<font color="#804040"><b>=&gt;</b></font>&nbsp;(<font color="#ff00ff">1</font>,<font color="#ff00ff">1</font>)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#804040"><b>=&gt;</b></font>&nbsp;<font color="#ff00ff">1</font>&nbsp;<font color="#804040"><b>=</b></font>&nbsp;<font color="#ff00ff">1</font>
&nbsp;&nbsp;for&nbsp;term&nbsp;x<font color="#804040"><b>^</b></font><font color="#ff00ff">2</font>,&nbsp;we&nbsp;got&nbsp;[(<font color="#ff00ff">2</font>,<font color="#ff00ff">1</font>)]&nbsp;and&nbsp;[(<font color="#ff00ff">1</font>,<font color="#ff00ff">2</font>)]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#804040"><b>=&gt;</b></font>&nbsp;<font color="#ff00ff">2</font>&nbsp;<font color="#804040"><b>=</b></font>&nbsp;<font color="#ff00ff">2</font>&nbsp;<font color="#804040"><b>=</b></font>&nbsp;<font color="#ff00ff">1</font><font color="#804040"><b>+</b></font><font color="#ff00ff">1</font>
&nbsp;&nbsp;for&nbsp;term&nbsp;x<font color="#804040"><b>^</b></font><font color="#ff00ff">3</font>,&nbsp;[(<font color="#ff00ff">1</font>,<font color="#ff00ff">1</font>),(<font color="#ff00ff">2</font>,<font color="#ff00ff">1</font>)],&nbsp;[(<font color="#ff00ff">1</font>,<font color="#ff00ff">3</font>)],&nbsp;[(<font color="#ff00ff">3</font>,<font color="#ff00ff">1</font>)]&nbsp;<font color="#804040"><b>=&gt;</b></font>&nbsp;<font color="#ff00ff">3</font>&nbsp;<font color="#804040"><b>=</b></font>&nbsp;<font color="#ff00ff">1</font>&nbsp;<font color="#804040"><b>+</b></font>&nbsp;<font color="#ff00ff">2</font>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#804040"><b>=</b></font>&nbsp;<font color="#ff00ff">1</font>&nbsp;<font color="#804040"><b>+</b></font>&nbsp;<font color="#ff00ff">1</font>&nbsp;<font color="#804040"><b>+</b></font>&nbsp;<font color="#ff00ff">1</font>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#804040"><b>=</b></font>&nbsp;<font color="#ff00ff">3</font>
&nbsp;&nbsp;
&nbsp;&nbsp;<font color="#804040"><b>========================================================================</b></font>

&nbsp;&nbsp;Example&nbsp;Usage<font color="#804040"><b>:</b></font>

&nbsp;&nbsp;<font color="#804040"><b>*</b></font>Main<font color="#804040"><b>&gt;</b></font>&nbsp;partition&nbsp;<font color="#ff00ff">5</font>
&nbsp;&nbsp;[[(<font color="#ff00ff">5</font>,<font color="#ff00ff">1</font>)],[(<font color="#ff00ff">2</font>,<font color="#ff00ff">1</font>),(<font color="#ff00ff">3</font>,<font color="#ff00ff">1</font>)],[(<font color="#ff00ff">1</font>,<font color="#ff00ff">1</font>),(<font color="#ff00ff">4</font>,<font color="#ff00ff">1</font>)],[(<font color="#ff00ff">1</font>,<font color="#ff00ff">1</font>),(<font color="#ff00ff">2</font>,<font color="#ff00ff">2</font>)],[(<font color="#ff00ff">1</font>,<font color="#ff00ff">2</font>),(<font color="#ff00ff">3</font>,<font color="#ff00ff">1</font>)],[(<font color="#ff00ff">1</font>,<font color="#ff00ff">3</font>),(<font color="#ff00ff">2</font>,<font color="#ff00ff">1</font>)],[(<font color="#ff00ff">1</font>,<font color="#ff00ff">5</font>)]]

&nbsp;&nbsp;<font color="#804040"><b>*</b></font>Main<font color="#804040"><b>&gt;</b></font>&nbsp;pp_partition&nbsp;<font color="#ff00ff">5</font>
&nbsp;&nbsp;<font color="#ff00ff">5</font><font color="#804040"><b>=</b></font><font color="#ff00ff">5</font>
&nbsp;&nbsp;<font color="#ff00ff">5</font><font color="#804040"><b>=</b></font><font color="#ff00ff">2</font><font color="#804040"><b>+</b></font><font color="#ff00ff">3</font>
&nbsp;&nbsp;<font color="#ff00ff">5</font><font color="#804040"><b>=</b></font><font color="#ff00ff">1</font><font color="#804040"><b>+</b></font><font color="#ff00ff">4</font>
&nbsp;&nbsp;<font color="#ff00ff">5</font><font color="#804040"><b>=</b></font><font color="#ff00ff">1</font><font color="#804040"><b>+</b></font><font color="#ff00ff">2</font><font color="#804040"><b>+</b></font><font color="#ff00ff">2</font>
&nbsp;&nbsp;<font color="#ff00ff">5</font><font color="#804040"><b>=</b></font><font color="#ff00ff">1</font><font color="#804040"><b>+</b></font><font color="#ff00ff">1</font><font color="#804040"><b>+</b></font><font color="#ff00ff">3</font>
&nbsp;&nbsp;<font color="#ff00ff">5</font><font color="#804040"><b>=</b></font><font color="#ff00ff">1</font><font color="#804040"><b>+</b></font><font color="#ff00ff">1</font><font color="#804040"><b>+</b></font><font color="#ff00ff">1</font><font color="#804040"><b>+</b></font><font color="#ff00ff">2</font>
&nbsp;&nbsp;<font color="#ff00ff">5</font><font color="#804040"><b>=</b></font><font color="#ff00ff">1</font><font color="#804040"><b>+</b></font><font color="#ff00ff">1</font><font color="#804040"><b>+</b></font><font color="#ff00ff">1</font><font color="#804040"><b>+</b></font><font color="#ff00ff">1</font><font color="#804040"><b>+</b></font><font color="#ff00ff">1</font>

&nbsp;&nbsp;<font color="#804040"><b>*</b></font>Main<font color="#804040"><b>&gt;</b></font>&nbsp;countPartition&nbsp;<font color="#ff00ff">5</font>
&nbsp;&nbsp;<font color="#ff00ff">7</font>

<font color="#804040"><b>-</b></font>}

<font color="#2e8b57"><b>type</b></font>&nbsp;Constant&nbsp;<font color="#804040"><b>=</b></font>&nbsp;(Int,&nbsp;Int)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#0000ff">-&#45; &quot;Constant&quot; at &quot;Position&quot;</font>
<font color="#2e8b57"><b>type</b></font>&nbsp;Coefficient&nbsp;<font color="#804040"><b>=</b></font>&nbsp;[&nbsp;Constant&nbsp;]&nbsp;&nbsp;<font color="#0000ff">-&#45; &quot;Sum&quot; of Constant</font>
<font color="#2e8b57"><b>type</b></font>&nbsp;Exponent&nbsp;<font color="#804040"><b>=</b></font>&nbsp;Int
<font color="#2e8b57"><b>type</b></font>&nbsp;Term&nbsp;<font color="#804040"><b>=</b></font>&nbsp;(Coefficient,&nbsp;Exponent)
<font color="#2e8b57"><b>type</b></font>&nbsp;Polynomial&nbsp;<font color="#804040"><b>=</b></font>&nbsp;[&nbsp;Term&nbsp;]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#0000ff">-&#45; &quot;Sum&quot; of Term</font>

term&nbsp;<font color="#804040"><b>::</b></font>&nbsp;Int&nbsp;<font color="#804040"><b>-&gt;</b></font>&nbsp;Int&nbsp;<font color="#804040"><b>-&gt;</b></font>&nbsp;Polynomial
term&nbsp;max&nbsp;n&nbsp;<font color="#804040"><b>=</b></font>&nbsp;([],<font color="#ff00ff">0</font>)&nbsp;<font color="#804040"><b>:</b></font>&nbsp;[&nbsp;([(n,i)],&nbsp;n&nbsp;<font color="#804040"><b>*</b></font>&nbsp;i)&nbsp;<font color="#804040"><b>|</b></font>&nbsp;i&nbsp;<font color="#804040"><b>&lt;-</b></font>&nbsp;[<font color="#ff00ff">1</font><font color="#804040"><b>..</b></font>&nbsp;max&nbsp;<font color="#804040"><b>`div`</b></font>&nbsp;n&nbsp;]&nbsp;]

mult&nbsp;<font color="#804040"><b>::</b></font>&nbsp;Int&nbsp;<font color="#804040"><b>-&gt;</b></font>&nbsp;Polynomial&nbsp;<font color="#804040"><b>-&gt;</b></font>&nbsp;Polynomial&nbsp;<font color="#804040"><b>-&gt;</b></font>&nbsp;Polynomial
mult&nbsp;max&nbsp;p1&nbsp;p2&nbsp;<font color="#804040"><b>=</b></font>&nbsp;[&nbsp;(c1<font color="#804040"><b>++</b></font>c2,&nbsp;e1<font color="#804040"><b>+</b></font>e2)&nbsp;<font color="#804040"><b>|</b></font>&nbsp;(c1,e1)&nbsp;<font color="#804040"><b>&lt;-</b></font>&nbsp;p1,&nbsp;(c2,e2)&nbsp;<font color="#804040"><b>&lt;-</b></font>&nbsp;p2,&nbsp;e1<font color="#804040"><b>+</b></font>e2&nbsp;<font color="#804040"><b>&lt;=</b></font>&nbsp;max&nbsp;]

partition&nbsp;<font color="#804040"><b>::</b></font>&nbsp;Int&nbsp;<font color="#804040"><b>-&gt;</b></font>&nbsp;[&nbsp;Coefficient&nbsp;]
partition&nbsp;n&nbsp;<font color="#804040"><b>=</b></font>&nbsp;only_coeff&nbsp;<font color="#804040"><b>$</b></font>&nbsp;filter_terms&nbsp;<font color="#804040"><b>$</b></font>&nbsp;generate_terms
&nbsp;&nbsp;<font color="#2e8b57"><b>where</b></font>&nbsp;generate_terms&nbsp;<font color="#804040"><b>=</b></font>&nbsp;foldr1&nbsp;(mult&nbsp;n)&nbsp;(map&nbsp;(term&nbsp;n)&nbsp;[<font color="#ff00ff">1</font><font color="#804040"><b>..</b></font>n])
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filter_terms&nbsp;&nbsp; <font color="#804040"><b>=</b></font>&nbsp;filter&nbsp;(<font color="#804040"><b>&#92;</b></font>(c,&nbsp;e)&nbsp;<font color="#804040"><b>-&gt;</b></font>&nbsp;e&nbsp;<font color="#804040"><b>==</b></font>&nbsp;n)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;only_coeff&nbsp;&nbsp;&nbsp;&nbsp; <font color="#804040"><b>=</b></font>&nbsp;map&nbsp;(<font color="#804040"><b>&#92;</b></font>(c,&nbsp;e)&nbsp;<font color="#804040"><b>-&gt;</b></font>&nbsp;c)

countPartition&nbsp;<font color="#804040"><b>::</b></font>&nbsp;Int&nbsp;<font color="#804040"><b>-&gt;</b></font>&nbsp;Int
countPartition&nbsp;<font color="#804040"><b>=</b></font>&nbsp;length&nbsp;<font color="#804040"><b>.</b></font>&nbsp;partition

pp_partition&nbsp;<font color="#804040"><b>::</b></font>&nbsp;Int&nbsp;<font color="#804040"><b>-&gt;</b></font>&nbsp;IO()&nbsp;&nbsp; <font color="#0000ff">-&#45; pretty print partition</font>
pp_partition&nbsp;n&nbsp;<font color="#804040"><b>=</b></font>&nbsp;sequence_&nbsp;<font color="#804040"><b>$</b></font>&nbsp;map&nbsp;showSum&nbsp;(partition&nbsp;n)
&nbsp;&nbsp;<font color="#2e8b57"><b>where</b></font>&nbsp;showSum&nbsp;s&nbsp;<font color="#804040"><b>=</b></font>&nbsp;<font color="#804040"><b>do</b></font>&nbsp;putStr&nbsp;<font color="#804040"><b>$</b></font>&nbsp;(show&nbsp;n)&nbsp;<font color="#804040"><b>++</b></font>&nbsp;<font color="#ff00ff">&quot;=&quot;</font>&nbsp;<font color="#804040"><b>++</b></font>&nbsp;sumList&nbsp;(strList&nbsp;s)&nbsp;<font color="#804040"><b>++</b></font>&nbsp;<font color="#ff00ff">&quot;</font><font color="#6a5acd">&#92;n</font><font color="#ff00ff">&quot;</font>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strList&nbsp;<font color="#804040"><b>=</b></font>&nbsp;foldl&nbsp;(<font color="#804040"><b>&#92;</b></font>acc&nbsp;(n,i)&nbsp;<font color="#804040"><b>-&gt;</b></font>&nbsp;acc&nbsp;<font color="#804040"><b>++</b></font>&nbsp;replicate&nbsp;i&nbsp;(show&nbsp;n))&nbsp;[]
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sumList&nbsp;<font color="#804040"><b>=</b></font>&nbsp;foldl1&nbsp;(<font color="#804040"><b>&#92;</b></font>x&nbsp;y&nbsp;<font color="#804040"><b>-&gt;</b></font>&nbsp;x&nbsp;<font color="#804040"><b>++</b></font>&nbsp;<font color="#ff00ff">&quot;+&quot;</font>&nbsp;<font color="#804040"><b>++</b></font>&nbsp;y)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

</font>
</pre>
<p></code>
</p>
]]></content:encoded>
			<wfw:commentRss>http://davidtran.doublegifts.com/blog/?feed=rss2&amp;p=152</wfw:commentRss>
		</item>
		<item>
		<title>Depth-first search and Breath-first search</title>
		<link>http://davidtran.doublegifts.com/blog/?p=151</link>
		<comments>http://davidtran.doublegifts.com/blog/?p=151#comments</comments>
		<pubDate>Sun, 15 Nov 2009 13:51:59 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category>Haskell</category>

		<guid isPermaLink="false">http://davidtran.doublegifts.com/blog/?p=151</guid>
		<description><![CDATA[
{-

Author&#160;..&#46;..&#46;..&#46;..&#46;..&#46;..&#160;:&#160;David&#160;Tran
Date&#160;..&#46;..&#46;..&#46;..&#46;..&#46;..&#46;.&#160;:&#160;2009-11-13
Breadth-first&#160;search&#160;..&#46;&#160;:&#160;http://en.wikipedia.org/wiki/Breadth-first_search
Depth-first&#160;search&#160;..&#46;..&#160;:&#160;http://en.wikipedia.org/wiki/Depth-first_search

Beath-first&#160;Algorithm&#160;(informal)
1.&#160;Enqueue&#160;the&#160;root&#160;node.
2.&#160;Dequeue&#160;a&#160;node&#160;and&#160;enqueue&#160;the&#160;direct&#160;child&#160;nodes.
3.&#160;If&#160;the&#160;queue&#160;is&#160;empty,&#160;every&#160;node&#160;has&#160;been&#160;examined.&#160;Done.
4.&#160;Repeat&#160;from&#160;Step&#160;2.

Using&#160;a&#160;stack&#160;(put&#160;direct&#160;child&#160;nodes&#160;on&#160;the&#160;front&#160;instead&#160;of&#160;the&#160;back)
instead&#160;of&#160;a&#160;queue&#160;whould&#160;turn&#160;this&#160;algorithm&#160;into&#160;a&#160;depth-first&#160;search.

This&#160;program&#160;shows&#160;the&#160;similarity&#160;of&#160;breath-first&#160;and&#160;depth-first.
The&#160;&#34;travel&#34;&#160;function&#160;combines&#160;both&#160;into&#160;one!

-}

module&#160;Main&#160;where

-&#45; http://www.haskell.org/haskellwiki/Algebraic_data_type
-&#45; Rose Tree
data&#160;Tree&#160;a&#160;=&#160;Node&#160;a&#160;[Tree&#160;a]

df&#160;::&#160;Tree&#160;a&#160;-&#62;&#160;[a]
df&#160;(Node&#160;n&#160;st)&#160;=&#160;n&#160;:&#160;concat&#160;(map&#160;df&#160;st)
-&#45; df (Node n st) = n : concat [df t &#124; t &#60;- st]

depthFirst&#160;::&#160;Tree&#160;a&#160;-&#62;&#160;[a]
depthFirst&#160;t&#160;=&#160;depthFirst&#39; [t]
&#160;&#160;where
&#160;&#160;depthFirst&#39; []&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; =&#160;[]
&#160;&#160;depthFirst&#39; ((Node&#160;n&#160;subTrees)&#160;:&#160;ts)&#160;=&#160;n&#160;:&#160;depthFirst&#39; (subTrees&#160;++&#160;ts)

breadthFirst&#160;::&#160;Tree&#160;a&#160;-&#62;&#160;[a]
breadthFirst&#160;t&#160;=&#160;breadthFirst&#39; [t]
&#160;&#160;where
&#160;&#160;breadthFirst&#39; []&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; =&#160;[]
&#160;&#160;breadthFirst&#39; ((Node&#160;n&#160;subTrees)&#160;:&#160;ts)&#160;=&#160;n&#160;:&#160;breadthFirst&#39; (ts&#160;++&#160;subTrees)

travel&#160;::&#160;Tree&#160;a&#160;-&#62;&#160;Bool&#160;-&#62;&#160;[a]
travel&#160;t&#160;depthFirst&#160;=&#160;travel&#39; [t]
&#160;&#160;where&#160;
&#160;&#160;travel&#39; []&#160;=&#160;[]
&#160;&#160;travel&#39; ((Node&#160;n&#160;st)&#160;:&#160;ts)&#160;=&#160;n&#160;:&#160;travel&#39; nexts
&#160;&#160;&#160;&#160;where&#160;nexts&#160;=&#160;if&#160;depthFirst&#160;then&#160;st&#160;++&#160;ts&#160;else&#160;ts&#160;++&#160;st

tree&#160;::&#160;Tree&#160;Int
tree&#160;=&#160;&#160; -&#45; http://en.wikipedia.org/wiki/File:Depth-first-tree.svg
&#160;&#160;Node&#160;1&#160;[
&#160;&#160;&#160;&#160;Node&#160;2&#160;[
&#160;&#160;&#160;&#160;&#160;&#160;Node&#160;3&#160;[
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Node&#160;4&#160;[],&#160;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Node&#160;5&#160;[]
&#160;&#160;&#160;&#160;&#160;&#160;],
&#160;&#160;&#160;&#160;&#160;&#160;Node&#160;6&#160;[]
&#160;&#160;&#160;&#160;],
&#160;&#160;&#160;&#160;Node&#160;7&#160;[],
&#160;&#160;&#160;&#160;Node&#160;8&#160;[
&#160;&#160;&#160;&#160;&#160;&#160;Node&#160;9&#160;[
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Node&#160;10&#160;[],
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Node&#160;11&#160;[]
&#160;&#160;&#160;&#160;&#160;&#160;],
&#160;&#160;&#160;&#160;&#160;&#160;Node&#160;12&#160;[]
&#160;&#160;&#160;&#160;]
&#160;&#160;]

main&#160;::&#160;IO&#160;()
main&#160;=&#160;do&#160;
&#160;&#160;&#160;&#160;&#160;&#160; putStrLn&#160;$&#160;show&#160;$&#160;df&#160;tree
&#160;&#160;&#160;&#160;&#160;&#160; putStrLn&#160;$&#160;show&#160;$&#160;depthFirst&#160;tree
&#160;&#160;&#160;&#160;&#160;&#160; putStrLn&#160;$&#160;show&#160;$&#160;breadthFirst&#160;tree
&#160;&#160;&#160;&#160;&#160;&#160; putStrLn&#160;$&#160;show&#160;$&#160;travel&#160;tree&#160;True
&#160;&#160;&#160;&#160;&#160;&#160; putStrLn&#160;$&#160;show&#160;$&#160;travel&#160;tree&#160;False



]]></description>
			<content:encoded><![CDATA[<pre><code><font face="monospace">
<font color="#0000ff">{-</font>

Author&nbsp;<font color="#804040"><b>..&#46;..&#46;..&#46;..&#46;..&#46;..</b></font>&nbsp;<font color="#804040"><b>:</b></font>&nbsp;David&nbsp;Tran
Date&nbsp;<font color="#804040"><b>..&#46;..&#46;..&#46;..&#46;..&#46;..&#46;.</b></font>&nbsp;<font color="#804040"><b>:</b></font>&nbsp;<font color="#ff00ff">2009</font><font color="#804040"><b>-</b></font><font color="#ff00ff">11</font><font color="#804040"><b>-</b></font><font color="#ff00ff">13</font>
Breadth<font color="#804040"><b>-</b></font>first&nbsp;search&nbsp;<font color="#804040"><b>..&#46;</b></font>&nbsp;<font color="#804040"><b>:</b></font>&nbsp;http<font color="#804040"><b>://</b></font>en<font color="#804040"><b>.</b></font>wikipedia<font color="#804040"><b>.</b></font>org<font color="#804040"><b>/</b></font>wiki<font color="#804040"><b>/</b></font>Breadth<font color="#804040"><b>-</b></font>first_search
Depth<font color="#804040"><b>-</b></font>first&nbsp;search&nbsp;<font color="#804040"><b>..&#46;..</b></font>&nbsp;<font color="#804040"><b>:</b></font>&nbsp;http<font color="#804040"><b>://</b></font>en<font color="#804040"><b>.</b></font>wikipedia<font color="#804040"><b>.</b></font>org<font color="#804040"><b>/</b></font>wiki<font color="#804040"><b>/</b></font>Depth<font color="#804040"><b>-</b></font>first_search

Beath<font color="#804040"><b>-</b></font>first&nbsp;Algorithm&nbsp;(informal)
<font color="#ff00ff">1</font><font color="#804040"><b>.</b></font>&nbsp;Enqueue&nbsp;the&nbsp;root&nbsp;node<font color="#804040"><b>.</b></font>
<font color="#ff00ff">2</font><font color="#804040"><b>.</b></font>&nbsp;Dequeue&nbsp;a&nbsp;node&nbsp;and&nbsp;enqueue&nbsp;the&nbsp;direct&nbsp;child&nbsp;nodes<font color="#804040"><b>.</b></font>
<font color="#ff00ff">3</font><font color="#804040"><b>.</b></font>&nbsp;If&nbsp;the&nbsp;queue&nbsp;is&nbsp;empty,&nbsp;every&nbsp;node&nbsp;has&nbsp;been&nbsp;examined<font color="#804040"><b>.</b></font>&nbsp;Done<font color="#804040"><b>.</b></font>
<font color="#ff00ff">4</font><font color="#804040"><b>.</b></font>&nbsp;Repeat&nbsp;from&nbsp;Step&nbsp;<font color="#ff00ff">2</font><font color="#804040"><b>.</b></font>

Using&nbsp;a&nbsp;stack&nbsp;(put&nbsp;direct&nbsp;child&nbsp;nodes&nbsp;on&nbsp;the&nbsp;front&nbsp;instead&nbsp;<font color="#804040"><b>of</b></font>&nbsp;the&nbsp;back)
instead&nbsp;<font color="#804040"><b>of</b></font>&nbsp;a&nbsp;queue&nbsp;whould&nbsp;turn&nbsp;this&nbsp;algorithm&nbsp;into&nbsp;a&nbsp;depth<font color="#804040"><b>-</b></font>first&nbsp;search<font color="#804040"><b>.</b></font>

This&nbsp;program&nbsp;shows&nbsp;the&nbsp;similarity&nbsp;<font color="#804040"><b>of</b></font>&nbsp;breath<font color="#804040"><b>-</b></font>first&nbsp;and&nbsp;depth<font color="#804040"><b>-</b></font>first<font color="#804040"><b>.</b></font>
The&nbsp;<font color="#ff00ff">&quot;travel&quot;</font>&nbsp;function&nbsp;combines&nbsp;both&nbsp;into&nbsp;one<font color="#804040"><b>!</b></font>

<font color="#804040"><b>-</b></font>}

<font color="#2e8b57"><b>module</b></font>&nbsp;Main&nbsp;<font color="#2e8b57"><b>where</b></font>

<font color="#0000ff">-&#45; <a href="http://www.haskell.org/haskellwiki/Algebraic_data_type">http://www.haskell.org/haskellwiki/Algebraic_data_type</a></font>
<font color="#0000ff">-&#45; Rose Tree</font>
<font color="#2e8b57"><b>data</b></font>&nbsp;Tree&nbsp;a&nbsp;<font color="#804040"><b>=</b></font>&nbsp;Node&nbsp;a&nbsp;[Tree&nbsp;a]

df&nbsp;<font color="#804040"><b>::</b></font>&nbsp;Tree&nbsp;a&nbsp;<font color="#804040"><b>-&gt;</b></font>&nbsp;[a]
df&nbsp;(Node&nbsp;n&nbsp;st)&nbsp;<font color="#804040"><b>=</b></font>&nbsp;n&nbsp;<font color="#804040"><b>:</b></font>&nbsp;concat&nbsp;(map&nbsp;df&nbsp;st)
<font color="#0000ff">-&#45; df (Node n st) = n : concat [df t | t &lt;- st]</font>

depthFirst&nbsp;<font color="#804040"><b>::</b></font>&nbsp;Tree&nbsp;a&nbsp;<font color="#804040"><b>-&gt;</b></font>&nbsp;[a]
depthFirst&nbsp;t&nbsp;<font color="#804040"><b>=</b></font>&nbsp;depthFirst&#39; [t]
&nbsp;&nbsp;<font color="#2e8b57"><b>where</b></font>
&nbsp;&nbsp;depthFirst&#39; []&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#804040"><b>=</b></font>&nbsp;[]
&nbsp;&nbsp;depthFirst&#39; ((Node&nbsp;n&nbsp;subTrees)&nbsp;<font color="#804040"><b>:</b></font>&nbsp;ts)&nbsp;<font color="#804040"><b>=</b></font>&nbsp;n&nbsp;<font color="#804040"><b>:</b></font>&nbsp;depthFirst&#39; (subTrees&nbsp;<font color="#804040"><b>++</b></font>&nbsp;ts)

breadthFirst&nbsp;<font color="#804040"><b>::</b></font>&nbsp;Tree&nbsp;a&nbsp;<font color="#804040"><b>-&gt;</b></font>&nbsp;[a]
breadthFirst&nbsp;t&nbsp;<font color="#804040"><b>=</b></font>&nbsp;breadthFirst&#39; [t]
&nbsp;&nbsp;<font color="#2e8b57"><b>where</b></font>
&nbsp;&nbsp;breadthFirst&#39; []&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#804040"><b>=</b></font>&nbsp;[]
&nbsp;&nbsp;breadthFirst&#39; ((Node&nbsp;n&nbsp;subTrees)&nbsp;<font color="#804040"><b>:</b></font>&nbsp;ts)&nbsp;<font color="#804040"><b>=</b></font>&nbsp;n&nbsp;<font color="#804040"><b>:</b></font>&nbsp;breadthFirst&#39; (ts&nbsp;<font color="#804040"><b>++</b></font>&nbsp;subTrees)

travel&nbsp;<font color="#804040"><b>::</b></font>&nbsp;Tree&nbsp;a&nbsp;<font color="#804040"><b>-&gt;</b></font>&nbsp;Bool&nbsp;<font color="#804040"><b>-&gt;</b></font>&nbsp;[a]
travel&nbsp;t&nbsp;depthFirst&nbsp;<font color="#804040"><b>=</b></font>&nbsp;travel&#39; [t]
&nbsp;&nbsp;<font color="#2e8b57"><b>where</b></font>&nbsp;
&nbsp;&nbsp;travel&#39; []&nbsp;<font color="#804040"><b>=</b></font>&nbsp;[]
&nbsp;&nbsp;travel&#39; ((Node&nbsp;n&nbsp;st)&nbsp;<font color="#804040"><b>:</b></font>&nbsp;ts)&nbsp;<font color="#804040"><b>=</b></font>&nbsp;n&nbsp;<font color="#804040"><b>:</b></font>&nbsp;travel&#39; nexts
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#2e8b57"><b>where</b></font>&nbsp;nexts&nbsp;<font color="#804040"><b>=</b></font>&nbsp;<font color="#804040"><b>if</b></font>&nbsp;depthFirst&nbsp;<font color="#804040"><b>then</b></font>&nbsp;st&nbsp;<font color="#804040"><b>++</b></font>&nbsp;ts&nbsp;<font color="#804040"><b>else</b></font>&nbsp;ts&nbsp;<font color="#804040"><b>++</b></font>&nbsp;st

tree&nbsp;<font color="#804040"><b>::</b></font>&nbsp;Tree&nbsp;Int
tree&nbsp;<font color="#804040"><b>=</b></font>&nbsp;&nbsp; <font color="#0000ff">-&#45; <a href="http://en.wikipedia.org/wiki/File:Depth-first-tree.svg">http://en.wikipedia.org/wiki/File:Depth-first-tree.svg</a></font>
&nbsp;&nbsp;Node&nbsp;<font color="#ff00ff">1</font>&nbsp;[
&nbsp;&nbsp;&nbsp;&nbsp;Node&nbsp;<font color="#ff00ff">2</font>&nbsp;[
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Node&nbsp;<font color="#ff00ff">3</font>&nbsp;[
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Node&nbsp;<font color="#ff00ff">4</font>&nbsp;[],&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Node&nbsp;<font color="#ff00ff">5</font>&nbsp;[]
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;],
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Node&nbsp;<font color="#ff00ff">6</font>&nbsp;[]
&nbsp;&nbsp;&nbsp;&nbsp;],
&nbsp;&nbsp;&nbsp;&nbsp;Node&nbsp;<font color="#ff00ff">7</font>&nbsp;[],
&nbsp;&nbsp;&nbsp;&nbsp;Node&nbsp;<font color="#ff00ff">8</font>&nbsp;[
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Node&nbsp;<font color="#ff00ff">9</font>&nbsp;[
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Node&nbsp;<font color="#ff00ff">10</font>&nbsp;[],
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Node&nbsp;<font color="#ff00ff">11</font>&nbsp;[]
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;],
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Node&nbsp;<font color="#ff00ff">12</font>&nbsp;[]
&nbsp;&nbsp;&nbsp;&nbsp;]
&nbsp;&nbsp;]

main&nbsp;<font color="#804040"><b>::</b></font>&nbsp;IO&nbsp;()
main&nbsp;<font color="#804040"><b>=</b></font>&nbsp;<font color="#804040"><b>do</b></font>&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; putStrLn&nbsp;<font color="#804040"><b>$</b></font>&nbsp;show&nbsp;<font color="#804040"><b>$</b></font>&nbsp;df&nbsp;tree
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; putStrLn&nbsp;<font color="#804040"><b>$</b></font>&nbsp;show&nbsp;<font color="#804040"><b>$</b></font>&nbsp;depthFirst&nbsp;tree
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; putStrLn&nbsp;<font color="#804040"><b>$</b></font>&nbsp;show&nbsp;<font color="#804040"><b>$</b></font>&nbsp;breadthFirst&nbsp;tree
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; putStrLn&nbsp;<font color="#804040"><b>$</b></font>&nbsp;show&nbsp;<font color="#804040"><b>$</b></font>&nbsp;travel&nbsp;tree&nbsp;True
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; putStrLn&nbsp;<font color="#804040"><b>$</b></font>&nbsp;show&nbsp;<font color="#804040"><b>$</b></font>&nbsp;travel&nbsp;tree&nbsp;False

</font>
</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://davidtran.doublegifts.com/blog/?feed=rss2&amp;p=151</wfw:commentRss>
		</item>
		<item>
		<title>JavaScript: The Good Parts</title>
		<link>http://davidtran.doublegifts.com/blog/?p=150</link>
		<comments>http://davidtran.doublegifts.com/blog/?p=150#comments</comments>
		<pubDate>Wed, 05 Aug 2009 12:00:45 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category>JavaScript</category>

		<guid isPermaLink="false">http://davidtran.doublegifts.com/blog/?p=150</guid>
		<description><![CDATA[Finish the book &#8220;JavaScript: The Good Parts&#8221;; excellent book, learned a lot.
Book
Google Video
Yahoo Video
Blog

]]></description>
			<content:encoded><![CDATA[<p>Finish the book &#8220;JavaScript: The Good Parts&#8221;; excellent book, learned a lot.</p>
<p><a href="http://www.amazon.com/JavaScript-Good-Parts-Douglas-Crockford/dp/0596517742/ref=sr_1_2?ie=UTF8&#038;s=books&#038;qid=1249473136&#038;sr=1-2">Book</a><br />
<a href="http://www.youtube.com/watch?v=hQVTIJBZook">Google Video</a><br />
<a href="http://video.yahoo.com/watch/630959/2974197">Yahoo Video</a><br />
<a href="http://google-code-updates.blogspot.com/2009/03/doug-crockford-javascript-good-parts.html">Blog</a>
</p>
]]></content:encoded>
			<wfw:commentRss>http://davidtran.doublegifts.com/blog/?feed=rss2&amp;p=150</wfw:commentRss>
		</item>
		<item>
		<title>My second digital camera</title>
		<link>http://davidtran.doublegifts.com/blog/?p=149</link>
		<comments>http://davidtran.doublegifts.com/blog/?p=149#comments</comments>
		<pubDate>Thu, 16 Jul 2009 20:56:52 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category>Life</category>

		<guid isPermaLink="false">http://davidtran.doublegifts.com/blog/?p=149</guid>
		<description><![CDATA[Today (2009-07-16), I finally received my new camera!
It is Panasonic DMC-G1R and also got the DMW-BLB13 extra battery.
I ordered DMC-G1R camera, H-FS045200 lens, and DMW-BLB13 extra battery on 2007-07-10.
I also called Panasonic Customer Support today, because I found out that they forgot to take my promotion coupon discount and over charged me. 
Hope this problem [...]]]></description>
			<content:encoded><![CDATA[<p>Today (2009-07-16), I finally received my new camera!</p>
<p>It is Panasonic DMC-G1R and also got the DMW-BLB13 extra battery.<br />
I ordered DMC-G1R camera, H-FS045200 lens, and DMW-BLB13 extra battery on 2007-07-10.</p>
<p>I also called Panasonic Customer Support today, because I found out that they forgot to take my promotion coupon discount and over charged me. <img src='http://davidtran.doublegifts.com/blog/wp-includes/images/smilies/icon_sad.gif' alt=':-(' class='wp-smiley' /><br />
Hope this problem will fix soon.</p>
<p>This is my second digital camera; my first one is still working, but it is very very old now.<br />
It is Nikon coolpix 4300.</p>
<p>Olympus E-P1 just came out and expensive; and because I can get discount and promotion coupon, so it is time to upgrade to DMC-G1R.</p>
]]></content:encoded>
			<wfw:commentRss>http://davidtran.doublegifts.com/blog/?feed=rss2&amp;p=149</wfw:commentRss>
		</item>
		<item>
		<title>Flex in a week</title>
		<link>http://davidtran.doublegifts.com/blog/?p=145</link>
		<comments>http://davidtran.doublegifts.com/blog/?p=145#comments</comments>
		<pubDate>Sun, 26 Apr 2009 01:21:22 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category>Flex / ActionScript</category>

		<guid isPermaLink="false">http://davidtran.doublegifts.com/blog/?p=145</guid>
		<description><![CDATA[Good Flex Tutorial on Adobe Web Site: Flex in a week
Day 1 : done. (2009-04-25)
Day 2 : done. (2009-04-27)
Day 3 : done. (2009-04-29)
Day 4 : done. (2009-05-05)
Day 5 : done. (2009-05-08)
Book &#8220;Getting Started with Flex 3&#8243; can be downloaded from the &#8220;Flex in a week&#8221; training page : done. (2009-05-10)

]]></description>
			<content:encoded><![CDATA[<p>Good Flex Tutorial on Adobe Web Site: <a href="http://www.adobe.com/devnet/flex/videotraining/">Flex in a week</a></p>
<p>Day 1 : done. (2009-04-25)<br />
Day 2 : done. (2009-04-27)<br />
Day 3 : done. (2009-04-29)<br />
Day 4 : done. (2009-05-05)<br />
Day 5 : done. (2009-05-08)</p>
<p>Book &#8220;Getting Started with Flex 3&#8243; can be downloaded from the &#8220;Flex in a week&#8221; training page : done. (2009-05-10)
</p>
]]></content:encoded>
			<wfw:commentRss>http://davidtran.doublegifts.com/blog/?feed=rss2&amp;p=145</wfw:commentRss>
		</item>
		<item>
		<title>Power Set #2</title>
		<link>http://davidtran.doublegifts.com/blog/?p=144</link>
		<comments>http://davidtran.doublegifts.com/blog/?p=144#comments</comments>
		<pubDate>Fri, 22 Aug 2008 20:36:10 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category>Haskell</category>

		<guid isPermaLink="false">http://davidtran.doublegifts.com/blog/?p=144</guid>
		<description><![CDATA[My power set solution is defined.
I just found there is challenge question about get the power set in &#8220;order&#8221; without using sort.
For example:

subsets [] = [[]]
subsets [1,2,3] = [[],[1],[2],[3],[1,2],[1,3],[2,3],[1,2,3]]

My solution for this challenge is simply reuse my combination function.

combination :: [a] -> Int -> [[a]]
combination _   0    = [[]]
combination [] [...]]]></description>
			<content:encoded><![CDATA[<p>My power set solution is <a href="http://davidtran.doublegifts.com/blog/?p=7">defined</a>.<br />
I just found there is challenge question about get the power set in &#8220;order&#8221; without using sort.<br />
For example:
<pre><code>
subsets [] = [[]]
subsets [1,2,3] = [[],[1],[2],[3],[1,2],[1,3],[2,3],[1,2,3]]
</code></pre>
<p>My solution for this challenge is simply reuse my <a href="http://davidtran.doublegifts.com/blog/?p=8">combination function</a>.</p>
<pre><code>
combination :: [a] -> Int -> [[a]]
combination _   0    = [[]]
combination []  _    = []
combination (x:xs) n = map (x:) (combination xs (n-1)) ++ combination xs n

subset :: [a] -> [[a]]
subset xs = concat [combination xs k | k <- [0..n]] where n = length xs
</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://davidtran.doublegifts.com/blog/?feed=rss2&amp;p=144</wfw:commentRss>
		</item>
		<item>
		<title>Quiz: Count the ways to find a word by walking on a grid (5)</title>
		<link>http://davidtran.doublegifts.com/blog/?p=143</link>
		<comments>http://davidtran.doublegifts.com/blog/?p=143#comments</comments>
		<pubDate>Thu, 03 Apr 2008 15:32:33 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category>Java</category>

		<guid isPermaLink="false">http://davidtran.doublegifts.com/blog/?p=143</guid>
		<description><![CDATA[/*
&#160;* Author : David Tran
&#160;* Date&#160;&#160; : 2008-04-03
&#160;* Quiz&#160;&#160; : CountPaths
&#160;*/

import&#160;java.math.BigInteger;
import&#160;java.util.ArrayList;
import&#160;java.util.HashMap;
import&#160;java.util.List;
import&#160;java.util.Map;

public&#160;class&#160;Quiz4 {
&#160;&#160;&#160;&#160;
&#160;&#160;&#160;&#160;public&#160;static&#160;void&#160;main(String[]&#160;args)&#160;throws&#160;Exception {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;new&#160;Quiz4().solve();
&#160;&#160;&#160;&#160;}

&#160;&#160;&#160;&#160;public&#160;void&#160;solve()&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;long&#160;start = System.currentTimeMillis();
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;loadProblem();
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;BigInteger solutions = BigInteger.ZERO;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;for&#160;(int&#160;index : starts)&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;solutions = solutions.add(findSolution(index / cols, index % cols, 0));
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;System.out.println(&#34;Total Solution = &#34;&#160;+ solutions);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;System.out.println(&#34;Total time (msec) to solve = &#34;&#160;+ (System.currentTimeMillis()&#160;- start));
&#160;&#160;&#160;&#160;}
&#160;&#160;&#160;&#160;
&#160;&#160;&#160;&#160;public&#160;Quiz4()&#160;throws&#160;Exception {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;rows = 50;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;cols = 50;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;cellLength = 1;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;goal = &#34;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA&#34;; // 50x&#34;A&#34;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;gridData = new&#160;String[rows][cols];&#160;&#160;// 50&#215;50x&#34;A&#34;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;for&#160;(int&#160;i = [...]]]></description>
			<content:encoded><![CDATA[<pre><code><font face="monospace"><font color="#0000ff">/*</font>
<font color="#0000ff">&nbsp;* Author : David Tran</font>
<font color="#0000ff">&nbsp;* Date&nbsp;&nbsp; : 2008-04-03</font>
<font color="#0000ff">&nbsp;* Quiz&nbsp;&nbsp; : CountPaths</font>
<font color="#0000ff">&nbsp;*/</font>

<font color="#a020f0">import</font>&nbsp;java.math.BigInteger;
<font color="#a020f0">import</font>&nbsp;java.util.ArrayList;
<font color="#a020f0">import</font>&nbsp;java.util.HashMap;
<font color="#a020f0">import</font>&nbsp;java.util.List;
<font color="#a020f0">import</font>&nbsp;java.util.Map;

<font color="#2e8b57"><b>public</b></font>&nbsp;<font color="#2e8b57"><b>class</b></font>&nbsp;Quiz4 {
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#2e8b57"><b>public</b></font>&nbsp;<font color="#2e8b57"><b>static</b></font>&nbsp;<font color="#2e8b57"><b>void</b></font>&nbsp;main(String[]&nbsp;args)&nbsp;<font color="#2e8b57"><b>throws</b></font>&nbsp;Exception {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#804040"><b>new</b></font>&nbsp;Quiz4().solve();
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;<font color="#2e8b57"><b>public</b></font>&nbsp;<font color="#2e8b57"><b>void</b></font>&nbsp;solve()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#2e8b57"><b>long</b></font>&nbsp;start = System.currentTimeMillis();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loadProblem();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BigInteger solutions = BigInteger.ZERO;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#804040"><b>for</b></font>&nbsp;(<font color="#2e8b57"><b>int</b></font>&nbsp;index : starts)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;solutions = solutions.add(findSolution(index / cols, index % cols, <font color="#ff00ff">0</font>));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<font color="#ff00ff">&quot;Total Solution = &quot;</font>&nbsp;+ solutions);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<font color="#ff00ff">&quot;Total time (msec) to solve = &quot;</font>&nbsp;+ (System.currentTimeMillis()&nbsp;- start));
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#2e8b57"><b>public</b></font>&nbsp;Quiz4()&nbsp;<font color="#2e8b57"><b>throws</b></font>&nbsp;Exception {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rows = <font color="#ff00ff">50</font>;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cols = <font color="#ff00ff">50</font>;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cellLength = <font color="#ff00ff">1</font>;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;goal = <font color="#ff00ff">&quot;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA&quot;</font>; <font color="#0000ff">// 50x&quot;A&quot;</font>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gridData = <font color="#804040"><b>new</b></font>&nbsp;String[rows][cols];&nbsp;&nbsp;<font color="#0000ff">// 50&#215;50x&quot;A&quot;</font>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#804040"><b>for</b></font>&nbsp;(<font color="#2e8b57"><b>int</b></font>&nbsp;i = <font color="#ff00ff">0</font>; i &lt; rows; i++)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#804040"><b>for</b></font>&nbsp;(<font color="#2e8b57"><b>int</b></font>&nbsp;j = <font color="#ff00ff">0</font>; j &lt; cols; j++)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gridData[i][j]&nbsp;= <font color="#ff00ff">&quot;A&quot;</font>;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#2e8b57"><b>private</b></font>&nbsp;<font color="#2e8b57"><b>int</b></font>&nbsp;rows;
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#2e8b57"><b>private</b></font>&nbsp;<font color="#2e8b57"><b>int</b></font>&nbsp;cols;
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#2e8b57"><b>private</b></font>&nbsp;<font color="#2e8b57"><b>int</b></font>&nbsp;lastNumber;
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#2e8b57"><b>private</b></font>&nbsp;List&lt;Integer&gt; starts;
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#2e8b57"><b>private</b></font>&nbsp;Map&lt;Integer, BigInteger&gt;[][]&nbsp;grid;

&nbsp;&nbsp;&nbsp;&nbsp;<font color="#2e8b57"><b>private</b></font>&nbsp;<font color="#2e8b57"><b>int</b></font>&nbsp;cellLength;
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#2e8b57"><b>private</b></font>&nbsp;String goal;
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#2e8b57"><b>private</b></font>&nbsp;String[][]&nbsp;gridData;
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#a020f0">@SuppressWarnings</font>(<font color="#ff00ff">&quot;unchecked&quot;</font>)
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#2e8b57"><b>private</b></font>&nbsp;<font color="#2e8b57"><b>void</b></font>&nbsp;loadProblem()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">// split goal string to build up dictionary</font>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map&lt;String, List&lt;Integer&gt;&gt; dictionary = <font color="#804040"><b>new</b></font>&nbsp;HashMap&lt;String, List&lt;Integer&gt;&gt;();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#804040"><b>for</b></font>&nbsp;(<font color="#2e8b57"><b>int</b></font>&nbsp;nb = <font color="#ff00ff">0</font>, position = <font color="#ff00ff">0</font>, length = goal.length(); position &lt; length; nb++, position += cellLength)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String substring = goal.substring(position, position + cellLength);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#804040"><b>if</b></font>&nbsp;(dictionary.containsKey(substring))&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dictionary.get(substring).add(nb);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <font color="#804040"><b>else</b></font>&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&lt;Integer&gt; values = <font color="#804040"><b>new</b></font>&nbsp;ArrayList&lt;Integer&gt;();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;values.add(nb);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dictionary.put(substring, values);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#804040"><b>if</b></font>&nbsp;(dictionary.size()&nbsp;&lt;= <font color="#ff00ff">0</font>)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#804040"><b>throw</b></font>&nbsp;<font color="#804040"><b>new</b></font>&nbsp;IllegalArgumentException(<font color="#ff00ff">&quot;No input data ?!&quot;</font>);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lastNumber = (goal.length()&nbsp;/ cellLength)&nbsp;- <font color="#ff00ff">1</font>;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;starts = <font color="#804040"><b>new</b></font>&nbsp;ArrayList&lt;Integer&gt;();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;grid = (Map&lt;Integer, BigInteger&gt; [][])&nbsp;<font color="#804040"><b>new</b></font>&nbsp;Map[rows][cols];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#804040"><b>for</b></font>&nbsp;(<font color="#2e8b57"><b>int</b></font>&nbsp;i = <font color="#ff00ff">0</font>; i &lt; rows; i++)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#804040"><b>for</b></font>&nbsp;(<font color="#2e8b57"><b>int</b></font>&nbsp;j = <font color="#ff00ff">0</font>; j &lt; cols; j++)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String key = gridData[i][j];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#804040"><b>if</b></font>&nbsp;(dictionary.containsKey(key))&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map&lt;Integer, BigInteger&gt; map = <font color="#804040"><b>new</b></font>&nbsp;HashMap&lt;Integer, BigInteger&gt;();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#804040"><b>for</b></font>&nbsp;(<font color="#2e8b57"><b>int</b></font>&nbsp;nb : dictionary.get(key))&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.put(nb, <font color="#ff00ff">null</font>);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#804040"><b>if</b></font>&nbsp;(nb == <font color="#ff00ff">0</font>)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;starts.add(i * cols + j);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;grid[i][j]&nbsp;= map;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#2e8b57"><b>private</b></font>&nbsp;BigInteger findSolution(<font color="#2e8b57"><b>int</b></font>&nbsp;i, <font color="#2e8b57"><b>int</b></font>&nbsp;j, <font color="#2e8b57"><b>int</b></font>&nbsp;nb)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#804040"><b>if</b></font>&nbsp;(nb == lastNumber)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#804040"><b>return</b></font>&nbsp;BigInteger.ONE;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <font color="#804040"><b>else</b></font>&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BigInteger solutions = grid[i][j].get(nb);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#804040"><b>if</b></font>&nbsp;(solutions == <font color="#ff00ff">null</font>)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;solutions = BigInteger.ZERO;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#804040"><b>for</b></font>&nbsp;(<font color="#2e8b57"><b>int</b></font>&nbsp;index : findNeighbors(i, j, nb))&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;solutions = solutions.add(findSolution(index / cols, index % cols, nb + <font color="#ff00ff">1</font>));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;grid[i][j].put(nb, solutions);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#804040"><b>return</b></font>&nbsp;solutions;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#2e8b57"><b>private</b></font>&nbsp;List&lt;Integer&gt; findNeighbors(<font color="#2e8b57"><b>int</b></font>&nbsp;i, <font color="#2e8b57"><b>int</b></font>&nbsp;j, <font color="#2e8b57"><b>int</b></font>&nbsp;nb)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#2e8b57"><b>int</b></font>&nbsp;nextNb = nb + <font color="#ff00ff">1</font>;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&lt;Integer&gt; neighbors = <font color="#804040"><b>new</b></font>&nbsp;ArrayList&lt;Integer&gt;();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addNeighbor(i - <font color="#ff00ff">1</font>, j - <font color="#ff00ff">1</font>, nextNb, neighbors);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addNeighbor(i - <font color="#ff00ff">1</font>, j&nbsp;&nbsp;&nbsp;&nbsp;, nextNb, neighbors);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addNeighbor(i - <font color="#ff00ff">1</font>, j + <font color="#ff00ff">1</font>, nextNb, neighbors);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addNeighbor(i&nbsp;&nbsp;&nbsp;&nbsp;, j - <font color="#ff00ff">1</font>, nextNb, neighbors);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addNeighbor(i&nbsp;&nbsp;&nbsp;&nbsp;, j + <font color="#ff00ff">1</font>, nextNb, neighbors);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addNeighbor(i + <font color="#ff00ff">1</font>, j - <font color="#ff00ff">1</font>, nextNb, neighbors);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addNeighbor(i + <font color="#ff00ff">1</font>, j&nbsp;&nbsp;&nbsp;&nbsp;, nextNb, neighbors);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addNeighbor(i + <font color="#ff00ff">1</font>, j + <font color="#ff00ff">1</font>, nextNb, neighbors);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#804040"><b>return</b></font>&nbsp;neighbors;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#2e8b57"><b>private</b></font>&nbsp;<font color="#2e8b57"><b>void</b></font>&nbsp;addNeighbor(<font color="#2e8b57"><b>int</b></font>&nbsp;i, <font color="#2e8b57"><b>int</b></font>&nbsp;j, <font color="#2e8b57"><b>int</b></font>&nbsp;nb, List&lt;Integer&gt; list)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#804040"><b>if</b></font>&nbsp;(i &gt;= <font color="#ff00ff">0</font>&nbsp;&amp;&amp; i &lt; rows &amp;&amp; j &gt;= <font color="#ff00ff">0</font>&nbsp;&amp;&amp; j &lt; cols &amp;&amp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;grid[i][j]&nbsp;!= <font color="#ff00ff">null</font>&nbsp;&amp;&amp; grid[i][j].containsKey(nb))&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.add(i * cols + j);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
}
</font></code></pre>
<p>Result on my machine:</p>
<pre><code>
A:>java Quiz4
Total Solution = 303835410591851117616135618108340196903254429200
Total time (msec) to solve = 562
</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://davidtran.doublegifts.com/blog/?feed=rss2&amp;p=143</wfw:commentRss>
		</item>
		<item>
		<title>Quiz: Count the ways to find a word by walking on a grid (4)</title>
		<link>http://davidtran.doublegifts.com/blog/?p=142</link>
		<comments>http://davidtran.doublegifts.com/blog/?p=142#comments</comments>
		<pubDate>Wed, 02 Apr 2008 21:22:33 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category>Ruby</category>

		<guid isPermaLink="false">http://davidtran.doublegifts.com/blog/?p=142</guid>
		<description><![CDATA[# Author : David Tran
# Date&#160;&#160; : 2008-04-02
# Quiz&#160;&#160; : http://davidtran.doublegifts.com/blog/?p=139
# File&#160;&#160; : quiz.rb

class&#160;Quiz

&#160;&#160;def&#160;initialize(grid_file, goal_file)
&#160;&#160;&#160;&#160;grid_data = IO.readlines(grid_file).map {&#124;e&#124;&#160;e.chomp}.map {&#124;e&#124;&#160;e.split(/&#92;s+/)}
&#160;&#160;&#160;&#160;goal = IO.read(goal_file).chomp
&#160;&#160;
&#160;&#160;&#160;&#160;@rows&#160;= grid_data.size
&#160;&#160;&#160;&#160;@cols&#160;= grid_data[0].size
&#160;&#160;&#160;&#160;cell_size = grid_data[0][0].size
&#160;&#160;
&#160;&#160;&#160;&#160;# split goal string to build up dictionary
&#160;&#160;&#160;&#160;dictionary = Hash.new {&#124;h, e&#124;&#160;h[e] = []}
&#160;&#160;&#160;&#160;index = 0
&#160;&#160;&#160;&#160;goal.scan(/#{&#39;.&#39;&#160;* cell_size}/).each do&#160;&#124;w&#124;
&#160;&#160;&#160;&#160;&#160;&#160;dictionary[w] &#60;&#60; index
&#160;&#160;&#160;&#160;&#160;&#160;index += 1
&#160;&#160;&#160;&#160;end
&#160;&#160;
&#160;&#160;&#160;&#160;@last_nb&#160;= (goal.size / cell_size) - 1
&#160;&#160;&#160;&#160;@grid&#160;= Array.new(@rows) { Array.new(@cols) { [...]]]></description>
			<content:encoded><![CDATA[<pre><code><font face="monospace"><font color="#0000ff"># Author : David Tran</font>
<font color="#0000ff"># Date&nbsp;&nbsp; : 2008-04-02</font>
<font color="#0000ff"># Quiz&nbsp;&nbsp; : <a href="http://davidtran.doublegifts.com/blog/?p=139">http://davidtran.doublegifts.com/blog/?p=139</a></font>
<font color="#0000ff"># File&nbsp;&nbsp; : quiz.rb</font>

<font color="#a020f0">class</font>&nbsp;<font color="#2e8b57"><b>Quiz</b></font>

&nbsp;&nbsp;<font color="#a020f0">def</font>&nbsp;<font color="#008080">initialize</font>(grid_file, goal_file)
&nbsp;&nbsp;&nbsp;&nbsp;grid_data = <font color="#2e8b57"><b>IO</b></font>.readlines(grid_file).map {|<font color="#008080">e</font>|&nbsp;e.chomp}.map {|<font color="#008080">e</font>|&nbsp;e.split(<font color="#6a5acd">/</font><font color="#6a5acd">&#92;s</font><font color="#ff00ff">+</font><font color="#6a5acd">/</font>)}
&nbsp;&nbsp;&nbsp;&nbsp;goal = <font color="#2e8b57"><b>IO</b></font>.read(goal_file).chomp
&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008080">@rows</font>&nbsp;= grid_data.size
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008080">@cols</font>&nbsp;= grid_data[<font color="#ff00ff">0</font>].size
&nbsp;&nbsp;&nbsp;&nbsp;cell_size = grid_data[<font color="#ff00ff">0</font>][<font color="#ff00ff">0</font>].size
&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff"># split goal string to build up dictionary</font>
&nbsp;&nbsp;&nbsp;&nbsp;dictionary = <font color="#2e8b57"><b>Hash</b></font>.new {|<font color="#008080">h</font>, <font color="#008080">e</font>|&nbsp;h[e] = []}
&nbsp;&nbsp;&nbsp;&nbsp;index = <font color="#ff00ff">0</font>
&nbsp;&nbsp;&nbsp;&nbsp;goal.scan(<font color="#6a5acd">/</font><font color="#6a5acd">#{</font><font color="#6a5acd">&#39;</font><font color="#ff00ff">.</font><font color="#6a5acd">&#39;</font>&nbsp;* cell_size<font color="#6a5acd">}</font><font color="#6a5acd">/</font>).each <font color="#804040"><b>do</b></font>&nbsp;|<font color="#008080">w</font>|
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dictionary[w] &lt;&lt; index
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;index += <font color="#ff00ff">1</font>
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#804040"><b>end</b></font>
&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008080">@last_nb</font>&nbsp;= (goal.size / cell_size) - <font color="#ff00ff">1</font>
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008080">@grid</font>&nbsp;= <font color="#2e8b57"><b>Array</b></font>.new(<font color="#008080">@rows</font>) { <font color="#2e8b57"><b>Array</b></font>.new(<font color="#008080">@cols</font>) { <font color="#2e8b57"><b>Hash</b></font>.new } }
&nbsp;&nbsp;&nbsp;&nbsp;starts = []
&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008080">@rows</font>.times <font color="#804040"><b>do</b></font>&nbsp;|<font color="#008080">r</font>|
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008080">@cols</font>.times <font color="#804040"><b>do</b></font>&nbsp;|<font color="#008080">c</font>|
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dictionary[grid_data[r][c]].each <font color="#804040"><b>do</b></font>&nbsp;|<font color="#008080">v</font>|
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008080">@grid</font>[r][c][v] = -<font color="#ff00ff">1</font>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;starts &lt;&lt; [r,c]&nbsp;<font color="#804040"><b>if</b></font>&nbsp;v == <font color="#ff00ff">0</font>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#804040"><b>end</b></font>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#804040"><b>end</b></font>
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#804040"><b>end</b></font>

&nbsp;&nbsp;&nbsp;&nbsp;solutions = starts.inject(<font color="#ff00ff">0</font>) { |<font color="#008080">s</font>, (<font color="#008080">i</font>,<font color="#008080">j</font>)|&nbsp;s += find_solution(i, j, <font color="#ff00ff">0</font>) }
&nbsp;&nbsp;&nbsp;&nbsp;puts <font color="#6a5acd">&quot;</font><font color="#ff00ff">Total Solution = </font><font color="#6a5acd">#{</font>solutions<font color="#6a5acd">}</font><font color="#6a5acd">&quot;</font>
&nbsp;&nbsp;<font color="#a020f0">end</font>
&nbsp;&nbsp;
&nbsp;&nbsp;<font color="#a020f0">def</font>&nbsp;<font color="#008080">find_solution</font>(i, j, nb)
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#804040"><b>return</b></font>&nbsp;<font color="#ff00ff">1</font>&nbsp;<font color="#804040"><b>if</b></font>&nbsp;nb == <font color="#008080">@last_nb</font>
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#804040"><b>return</b></font>&nbsp;<font color="#008080">@grid</font>[i][j][nb] <font color="#804040"><b>if</b></font>&nbsp;<font color="#008080">@grid</font>[i][j][nb] &gt;= <font color="#ff00ff">0</font>
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008080">@grid</font>[i][j][nb] = get_neighbors(i, j, nb).inject(<font color="#ff00ff">0</font>) { |<font color="#008080">s</font>, (<font color="#008080">x</font>, <font color="#008080">y</font>)|&nbsp;s += find_solution(x, y, nb+<font color="#ff00ff">1</font>) }
&nbsp;&nbsp;<font color="#a020f0">end</font>
&nbsp;&nbsp;
&nbsp;&nbsp;<font color="#a020f0">def</font>&nbsp;<font color="#008080">get_neighbors</font>(i, j, nb)
&nbsp;&nbsp;&nbsp;&nbsp;[[-<font color="#ff00ff">1</font>, -<font color="#ff00ff">1</font>], [-<font color="#ff00ff">1</font>, <font color="#ff00ff">0</font>], [-<font color="#ff00ff">1</font>, <font color="#ff00ff">1</font>], [<font color="#ff00ff">0</font>, -<font color="#ff00ff">1</font>], [<font color="#ff00ff">0</font>, <font color="#ff00ff">1</font>], [<font color="#ff00ff">1</font>, -<font color="#ff00ff">1</font>], [<font color="#ff00ff">1</font>, <font color="#ff00ff">0</font>], [<font color="#ff00ff">1</font>, <font color="#ff00ff">1</font>]].inject([]) <font color="#804040"><b>do</b></font>&nbsp;|<font color="#008080">a</font>, (<font color="#008080">x</font>,<font color="#008080">y</font>)|
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a &lt;&lt; neighbor(i+x, j+y, nb+<font color="#ff00ff">1</font>)
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#804040"><b>end</b></font>.compact
&nbsp;&nbsp;<font color="#a020f0">end</font>
&nbsp;&nbsp;
&nbsp;&nbsp;<font color="#a020f0">def</font>&nbsp;<font color="#008080">neighbor</font>(i, j, nb)
&nbsp;&nbsp;&nbsp;&nbsp;(i &gt;= <font color="#ff00ff">0</font>&nbsp;&amp;&amp; i &lt; <font color="#008080">@rows</font>&nbsp;&amp;&amp; j &gt;= <font color="#ff00ff">0</font>&nbsp;&amp;&amp; j &lt; <font color="#008080">@cols</font>&nbsp;&amp;&amp; <font color="#008080">@grid</font>[i][j].key?(nb)) ? [i, j]&nbsp;: <font color="#ff00ff">nil</font>
&nbsp;&nbsp;<font color="#a020f0">end</font>
&nbsp;&nbsp;
<font color="#a020f0">end</font>

<font color="#804040"><b>if</b></font>&nbsp;<font color="#008080">$0</font>&nbsp;== <font color="#ff00ff">__FILE__</font>
&nbsp;&nbsp;(puts <font color="#6a5acd">&quot;</font><font color="#ff00ff">Usage: ruby quiz.rb&nbsp;&nbsp;grid_file&nbsp;&nbsp;goal_file</font><font color="#6a5acd">&quot;</font>; <font color="#804040"><b>exit</b></font>) <font color="#804040"><b>if</b></font>&nbsp;<font color="#008080">ARGV</font>.size &lt; <font color="#ff00ff">2</font>
&nbsp;&nbsp;<font color="#2e8b57"><b>Quiz</b></font>.new(<font color="#008080">ARGV</font>[<font color="#ff00ff">0</font>], <font color="#008080">ARGV</font>[<font color="#ff00ff">1</font>])
<font color="#804040"><b>end</b></font>

</font></code></pre>
<p># ============================== #</p>
<pre><code><font face="monospace"><font color="#0000ff"># Author : David Tran</font>
<font color="#0000ff"># Date&nbsp;&nbsp; : 2008-04-02</font>
<font color="#0000ff"># File&nbsp;&nbsp; : test.rb</font>
<font color="#0000ff"># Object : find the maximum solutions</font>

open(<font color="#6a5acd">&#39;</font><font color="#ff00ff">grid.txt</font><font color="#6a5acd">&#39;</font>, <font color="#6a5acd">&#39;</font><font color="#ff00ff">w</font><font color="#6a5acd">&#39;</font>) {|<font color="#008080">f</font>|&nbsp;<font color="#ff00ff">50</font>.times { f &lt;&lt; <font color="#6a5acd">&#39;</font><font color="#ff00ff">A </font><font color="#6a5acd">&#39;</font>&nbsp;* <font color="#ff00ff">50</font>&nbsp;&lt;&lt; <font color="#6a5acd">&quot;</font><font color="#6a5acd">&#92;n</font><font color="#6a5acd">&quot;</font>}}
max = <font color="#ff00ff">0</font>
index = -<font color="#ff00ff">1</font>
<font color="#ff00ff">50</font>.times <font color="#804040"><b>do</b></font>&nbsp;|<font color="#008080">i</font>|
&nbsp;&nbsp;i += <font color="#ff00ff">1</font>
&nbsp;&nbsp;open(<font color="#6a5acd">&#39;</font><font color="#ff00ff">goal.txt</font><font color="#6a5acd">&#39;</font>, <font color="#6a5acd">&#39;</font><font color="#ff00ff">w</font><font color="#6a5acd">&#39;</font>) { |<font color="#008080">f</font>|&nbsp;f &lt;&lt; <font color="#6a5acd">&#39;</font><font color="#ff00ff">A</font><font color="#6a5acd">&#39;</font>&nbsp;* i }
&nbsp;&nbsp;result = <font color="#6a5acd">%x{</font><font color="#ff00ff">&nbsp;ruby quiz.rb grid.txt goal.txt </font><font color="#6a5acd">}</font>
&nbsp;&nbsp;<font color="#804040"><b>if</b></font>&nbsp;result =~ <font color="#6a5acd">/</font><font color="#ff00ff">Solution = (&#92;d+)</font><font color="#6a5acd">/</font>
&nbsp;&nbsp;&nbsp;&nbsp;solutions = <font color="#008080">$1</font>.to_i
&nbsp;&nbsp;&nbsp;&nbsp;puts <font color="#6a5acd">&quot;</font><font color="#6a5acd">#{</font>i.to_s.rjust(<font color="#ff00ff">2</font>, <font color="#6a5acd">&#39;</font><font color="#ff00ff">0</font><font color="#6a5acd">&#39;</font>)<font color="#6a5acd">}</font><font color="#ff00ff">&nbsp;=&gt; </font><font color="#6a5acd">#{</font>solutions<font color="#6a5acd">}</font><font color="#6a5acd">&quot;</font>
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#804040"><b>if</b></font>&nbsp;(solutions &gt; max)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max = solutions
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;index = i
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#804040"><b>end</b></font>
&nbsp;&nbsp;<font color="#804040"><b>end</b></font>
<font color="#804040"><b>end</b></font>

puts
puts <font color="#6a5acd">&quot;</font><font color="#ff00ff">Maximum =&gt; </font><font color="#6a5acd">#{</font>index<font color="#6a5acd">}</font><font color="#ff00ff">&nbsp;=&gt; </font><font color="#6a5acd">#{</font>max<font color="#6a5acd">}</font><font color="#6a5acd">&quot;</font>


<font color="#6a5acd">__END__</font>
<font color="#0000ff">Result:</font>

<font color="#0000ff">01 =&gt; 2500</font>
<font color="#0000ff">02 =&gt; 19404</font>
<font color="#0000ff">03 =&gt; 152292</font>
<font color="#0000ff">04 =&gt; 1198512</font>
<font color="#0000ff">05 =&gt; 9453300</font>
<font color="#0000ff">06 =&gt; 74662104</font>
<font color="#0000ff">07 =&gt; 590305088</font>
<font color="#0000ff">08 =&gt; 4670864544</font>
<font color="#0000ff">09 =&gt; 36982919796</font>
<font color="#0000ff">10 =&gt; 292979734056</font>
<font color="#0000ff">11 =&gt; 2322050158968</font>
<font color="#0000ff">12 =&gt; 18410909224368</font>
<font color="#0000ff">13 =&gt; 146024921567904</font>
<font color="#0000ff">14 =&gt; 1158535320863088</font>
<font color="#0000ff">15 =&gt; 9194071282628352</font>
<font color="#0000ff">16 =&gt; 72981174038164224</font>
<font color="#0000ff">17 =&gt; 579439667561976564</font>
<font color="#0000ff">18 =&gt; 4601415854638476552</font>
<font color="#0000ff">19 =&gt; 36547133286285125864</font>
<font color="#0000ff">20 =&gt; 290326968106929048336</font>
<font color="#0000ff">21 =&gt; 2306684143572560961624</font>
<font color="#0000ff">22 =&gt; 18329503368942296048880</font>
<font color="#0000ff">23 =&gt; 145670217447616179975600</font>
<font color="#0000ff">24 =&gt; 1157829208250036601664992</font>
<font color="#0000ff">25 =&gt; 9203827271760017849641312</font>
<font color="#0000ff">26 =&gt; 73171094997928920840845904</font>
<font color="#0000ff">27 =&gt; 581774919929278927886179248</font>
<font color="#0000ff">28 =&gt; 4626070561470449649010421664</font>
<font color="#0000ff">29 =&gt; 36788241251602079481574654656</font>
<font color="#0000ff">30 =&gt; 292579041503607826263355150176</font>
<font color="#0000ff">31 =&gt; 2327088439774693588696558829376</font>
<font color="#0000ff">32 =&gt; 18510420519854069350331486524800</font>
<font color="#0000ff">33 =&gt; 147248802959429409354656962751220</font>
<font color="#0000ff">34 =&gt; 1171434060031010511872752993856328</font>
<font color="#0000ff">35 =&gt; 9319939961558447074697552088702600</font>
<font color="#0000ff">36 =&gt; 74154290207123230340766878367722064</font>
<font color="#0000ff">37 =&gt; 590046376097012157795995971369959624</font>
<font color="#0000ff">38 =&gt; 4695281006073221324094307242033576432</font>
<font color="#0000ff">39 =&gt; 37364705320671553187068052340260719824</font>
<font color="#0000ff">40 =&gt; 297361737077320616265561468778248253728</font>
<font color="#0000ff">41 =&gt; 2366634780471229416464762512469663693592</font>
<font color="#0000ff">42 =&gt; 18836455040472517436022242181973614080112</font>
<font color="#0000ff">43 =&gt; 149929836577708085403038515575864523777776</font>
<font color="#0000ff">44 =&gt; 1193430584532300786500980677298194867380832</font>
<font color="#0000ff">45 =&gt; 9500046751158181070821773471417360223448304</font>
<font color="#0000ff">46 =&gt; 75626347587870791654047249972768528120486752</font>
<font color="#0000ff">47 =&gt; 602058474789522292652482399670191674941123040</font>
<font color="#0000ff">48 =&gt; 4793158368431771829259255859223541964804203200</font>
<font color="#0000ff">49 =&gt; 38161186114402617099716572074367083097283018976</font>
<font color="#0000ff">50 =&gt; 303835410591851117616135618108340196903254429200</font>

<font color="#0000ff">Maximum =&gt; 50 =&gt; 303835410591851117616135618108340196903254429200</font>
</font></code></pre>
]]></content:encoded>
			<wfw:commentRss>http://davidtran.doublegifts.com/blog/?feed=rss2&amp;p=142</wfw:commentRss>
		</item>
	</channel>
</rss>
