<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1350724202700062730</id><updated>2024-09-16T13:20:53.941+07:00</updated><category term="extension"/><category term="projecteuler"/><category term="constraint programming"/><category term="arranger"/><category term="sequence"/><category term="biginteger"/><category term="dynamic programming"/><category term="enumerable"/><category term="codegolf"/><category term="delegate"/><category term="fibonacci"/><category term="linq"/><category term="prime"/><category term="8 queens"/><category term="float"/><category term="math"/><category term="pythagorean"/><category term="rational"/><category term="roman"/><category term="string"/><title type='text'>C H a o W</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://chaowchaow.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350724202700062730/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://chaowchaow.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Chaow</name><uri>http://www.blogger.com/profile/07962486640447233732</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>25</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1350724202700062730.post-3876493261252935794</id><published>2008-07-26T18:00:00.005+07:00</published><updated>2008-07-26T20:39:43.606+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="biginteger"/><category scheme="http://www.blogger.com/atom/ns#" term="projecteuler"/><category scheme="http://www.blogger.com/atom/ns#" term="rational"/><title type='text'>Rational for C#</title><content type='html'>&lt;a href=&quot;http://en.wikipedia.org/wiki/Rational_number&quot; target=&quot;_blank&quot;&gt;Rational&lt;/a&gt; is ratio of 2 integers. It represents fractions of an integer. Most of the time if you deal with rational number, you can use real number (float) instead. But real number has an drawback. It cannot maintain proportion of 2 integers for number with repeating decimal. For example,&lt;br /&gt;&lt;br /&gt;(1/20)&lt;sup&gt;2&lt;/sup&gt; + (1/15)&lt;sup&gt;2&lt;/sup&gt; - (1/12)&lt;sup&gt;2&lt;/sup&gt;&lt;br /&gt;= (1/400) + (1/225) - (1/144)&lt;br /&gt;= (9/3600) + (16/3600) - (25/3600)&lt;br /&gt;= 0&lt;br /&gt;&lt;br /&gt;Now testing with real number:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: blue;&quot;&gt;double&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt; x = &lt;span style=&quot;color:#2B91AF&quot;&gt;Math&lt;/span&gt;.Pow(1.0 / 20.0, 2.0);&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;double&lt;/span&gt; y = &lt;span style=&quot;color:#2B91AF&quot;&gt;Math&lt;/span&gt;.Pow(1.0 / 15.0, 2.0);&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;double&lt;/span&gt; z = &lt;span style=&quot;color:#2B91AF&quot;&gt;Math&lt;/span&gt;.Pow(1.0 / 12.0, 2.0);&lt;br /&gt;&lt;span style=&quot;color:#2B91AF&quot;&gt;Console&lt;/span&gt;.WriteLine(x + y - z);&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//8.67361737988404E-19&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Result is not zero as expected. To use rational, you can download from &lt;a href=&quot;http://chaowchaow.googlepages.com/Rational.cs&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;. Rational class is required &lt;a href=&quot;http://chaowchaow.blogspot.com/2007/12/biginteger.html&quot; target=&quot;_blank&quot;&gt;BigInteger&lt;/a&gt; in SilverLight package. You can construct rational several ways.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: #2B91AF;&quot;&gt;Rational&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt; a = &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Rational&lt;/span&gt;(1, 20);&lt;br /&gt;&lt;span style=&quot;color:#2B91AF&quot;&gt;Rational&lt;/span&gt; b = (&lt;span style=&quot;color:#2B91AF&quot;&gt;Rational&lt;/span&gt;)1 / 15;&lt;br /&gt;&lt;span style=&quot;color:#2B91AF&quot;&gt;Rational&lt;/span&gt; c = 1m / 12m;&lt;br /&gt;&lt;span style=&quot;color:#2B91AF&quot;&gt;Console&lt;/span&gt;.WriteLine(a.Power(2) + b.Power(2) - c.Power(2));&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//0&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You can construct rational using new keyword, first argument is numerator, and second argument is denominator. Second method is to cast from integer. Last method is to guess from decimal. Please noted that guessing rational from decimal may lose accuracy, such as:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: #2B91AF;&quot;&gt;Rational&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt; r = 1000001m / 600001m;&lt;br /&gt;&lt;span style=&quot;color:#2B91AF&quot;&gt;Console&lt;/span&gt;.WriteLine(r.ToString());&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//5/3&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You can see that it keeps 5/3 instead of 1000001/600001. If you need accuracy, construct rational or casting from integer are better solutions.&lt;br /&gt;&lt;br /&gt;The Rational class always keep rational in reduced form, such as:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: #2B91AF;&quot;&gt;Rational&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt; r = (&lt;span style=&quot;color:#2B91AF&quot;&gt;Rational&lt;/span&gt;)5 / 10;&lt;br /&gt;&lt;span style=&quot;color:#2B91AF&quot;&gt;Console&lt;/span&gt;.WriteLine(r.ToString());&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//1/2&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It keeps 1/2 instead of 5/10. This will make all same proportions such as 1/2, 3/6, 5/10 are all equivalent.&lt;br /&gt;&lt;br /&gt;This Rational class supports infinity, negative zero, and not a number (NaN). This will make all arithmetic operations are equal to real number, such as:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: green;&quot;&gt;//1/0 makes infinity&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: #2B91AF;&quot;&gt;Rational&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt; inf = (&lt;span style=&quot;color:#2B91AF&quot;&gt;Rational&lt;/span&gt;)1 / 0;&lt;br /&gt;&lt;span style=&quot;color:#2B91AF&quot;&gt;Console&lt;/span&gt;.WriteLine(inf);&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//Infinity&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//Invert of negative zero makes negative infinity&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#2B91AF&quot;&gt;Rational&lt;/span&gt; nzero = (&lt;span style=&quot;color:#2B91AF&quot;&gt;Rational&lt;/span&gt;)0 / -1;&lt;br /&gt;&lt;span style=&quot;color:#2B91AF&quot;&gt;Console&lt;/span&gt;.WriteLine(1 / nzero);&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//-Infinity&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//infinity - infinity = nan&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#2B91AF&quot;&gt;Rational&lt;/span&gt; nan = inf - inf;&lt;br /&gt;&lt;span style=&quot;color:#2B91AF&quot;&gt;Console&lt;/span&gt;.WriteLine(nan);&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//NaN&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Let&#39;s test rational with an easy question from &lt;a href=&quot;http://projecteuler.net&quot; target=&quot;_blank&quot;&gt;projecteuler.net&lt;/a&gt;.&lt;br /&gt;&lt;em&gt;Find numerator of the fraction immediately to left of 3/7 with denominator &lt;= 1000000&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: #2B91AF;&quot;&gt;Rational&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt; r = (&lt;span style=&quot;color:#2B91AF&quot;&gt;Rational&lt;/span&gt;)3 / 7;&lt;br /&gt;r -= (&lt;span style=&quot;color:#2B91AF&quot;&gt;Rational&lt;/span&gt;)1 / 999999;&lt;br /&gt;&lt;span style=&quot;color:#2B91AF&quot;&gt;Console&lt;/span&gt;.WriteLine(r.Numerator);&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//428570&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Next topic is to create continued fractions from square root and generate sequence of rational.</content><link rel='replies' type='application/atom+xml' href='http://chaowchaow.blogspot.com/feeds/3876493261252935794/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1350724202700062730/3876493261252935794' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350724202700062730/posts/default/3876493261252935794'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350724202700062730/posts/default/3876493261252935794'/><link rel='alternate' type='text/html' href='http://chaowchaow.blogspot.com/2008/07/rational-for-c.html' title='Rational for C#'/><author><name>Chaow</name><uri>http://www.blogger.com/profile/07962486640447233732</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350724202700062730.post-940790331274216959</id><published>2008-07-18T22:37:00.006+07:00</published><updated>2008-07-26T17:54:06.649+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="float"/><title type='text'>Infinity, Negative Zero, and Not a Number</title><content type='html'>Mathematics always go beyond its own current dimension. &lt;a href=&quot;http://en.wikipedia.org/wiki/Natural_numbers&quot; target=&quot;_blank&quot;&gt;Natural numbers&lt;/a&gt; was created, but it does not satisfy existence of zero and negative numbers. &lt;a href=&quot;http://en.wikipedia.org/wiki/Integer&quot; target=&quot;_blank&quot;&gt;Integer&lt;/a&gt; was then created, but what happened if we scale integer into smaller numbers. &lt;a href=&quot;http://en.wikipedia.org/wiki/Rational_number&quot; target=&quot;_blank&quot;&gt;Rational&lt;/a&gt; was then create, but it cannot represents number liked root of 2. &lt;a href=&quot;http://en.wikipedia.org/wiki/Real_number&quot; target=&quot;_blank&quot;&gt;Real numbers&lt;/a&gt; was then created, but some create &lt;a href=&quot;http://en.wikipedia.org/wiki/Complex_number&quot; target=&quot;_blank&quot;&gt;Complex numbers&lt;/a&gt; to satisfy root of -1, and some create &lt;a href=&quot;http://en.wikipedia.org/wiki/Affinely_extended_real_number_system&quot; target=&quot;_blank&quot;&gt;Extended real&lt;/a&gt;, to satisfy division of zero.&lt;br /&gt;&lt;br /&gt;Extended real is very interesting, it doesn&#39;t comply with number system as following:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt;Infinity + 1 = Infinity&lt;br /&gt;1 = Infinity - Infinity&lt;br /&gt;1 = 0 ???&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Therefore, infinity is not existed and &lt;a href=&quot;http://en.wikipedia.org/wiki/Division_by_zero&quot; target=&quot;_blank&quot;&gt;division by zero&lt;/a&gt; is undefined. But extended real try to create its own rules by introducing non-number liked &lt;a href=&quot;http://en.wikipedia.org/wiki/Infinity&quot; target=&quot;_blank&quot;&gt;Infinity&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/wiki/Negative_infinity&quot; target=&quot;_blank&quot;&gt;Negative Infinity&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/wiki/Negative_zero&quot; target=&quot;_blank&quot;&gt;Negative Zero&lt;/a&gt;, and &lt;a href=&quot;http://en.wikipedia.org/wiki/NaN&quot; target=&quot;_blank&quot;&gt;Not a number&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Infinity&lt;/strong&gt; can be created by 1/0. Some basic properties of infinity are:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt;1.0 / 0.0 = Inf&lt;br /&gt;1.0 / Inf = 0.0&lt;br /&gt;1.0 + Inf = Inf&lt;br /&gt;Inf - Inf = NaN&lt;br /&gt;Inf * 0.0 = NaN&lt;br /&gt;Inf * -1.0 = -Inf&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Infinity in extended real has its own sign. It can be positive or negative. &lt;strong&gt;Negative infinity&lt;/strong&gt; can be created by -1/0. Some basic properties of negative infinity are:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt;-1.0 / 0.0 = -Inf&lt;br /&gt;1.0 / -Inf = -0.0&lt;br /&gt;1.0 / -0.0 = -Inf&lt;br /&gt;1.0 + -Inf = -Inf&lt;br /&gt;-Inf * -1.0 = Inf&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Zero in extended real also has its own sign. It can be negative. &lt;strong&gt;Negative zero&lt;/strong&gt; can be create by -0. Some basic properties of negative zero are:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt;-(0.0) = -0.0&lt;br /&gt;-0.0 * -1.0 = 0.0&lt;br /&gt;-0.0 * -0.0 = 0.0&lt;br /&gt;-0.0 * 0.0 = -0.0&lt;br /&gt;-0.0 + -0.0 = -0.0&lt;br /&gt;-0.0 + 0.0 = 0.0&lt;br /&gt;-1.0 % 1.0 = -0.0&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;All undefined numbers are &lt;strong&gt;Not a Number&lt;/strong&gt; (NaN). All arithmatic operation with NaN result to NaN, therefore extended real has no arithmatic error. NaN can be created from:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt;0.0 / 0.0 = NaN&lt;br /&gt;Inf - Inf = NaN&lt;br /&gt;Inf * 0.0 = NaN&lt;br /&gt;1.0 % 0.0 = NaN&lt;br /&gt;Inf % 1.0 = NaN&lt;br /&gt;Sqrt(-1.0) = NaN&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Arithmatic comparisons for extended real are as follows:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt;Inf &gt; 1.0&lt;br /&gt;1.0 &gt; 0.0&lt;br /&gt;0.0 == -0.0&lt;br /&gt;0.0 &gt; -1.0&lt;br /&gt;-1.0 &gt; -Inf&lt;br /&gt;-Inf &gt; NaN&lt;br /&gt;NaN != NaN&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;NaN doesn&#39;t equal to itself, to check NaN use double.Equals(x, NaN) instead. Extended real is &lt;a href=&quot;http://en.wikipedia.org/wiki/IEEE_floating-point_standard&quot; target=&quot;_blank&quot;&gt;IEEE standard&lt;/a&gt; and it is called &quot;&lt;strong&gt;floating point&lt;/strong&gt;&quot;. In C#, 2 types for floating point are provided, float and double. Float is single precision, its maximum precision is around 1.4E-45. Double is much precise, its maximum precision is up to around 4.94E-324.&lt;br /&gt;&lt;br /&gt;Next post, I will introduce type with unbounded precision.</content><link rel='replies' type='application/atom+xml' href='http://chaowchaow.blogspot.com/feeds/940790331274216959/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1350724202700062730/940790331274216959' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350724202700062730/posts/default/940790331274216959'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350724202700062730/posts/default/940790331274216959'/><link rel='alternate' type='text/html' href='http://chaowchaow.blogspot.com/2008/07/infinity-negative-zero-and-not-number.html' title='Infinity, Negative Zero, and Not a Number'/><author><name>Chaow</name><uri>http://www.blogger.com/profile/07962486640447233732</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350724202700062730.post-6910370198676130628</id><published>2008-07-12T01:07:00.002+07:00</published><updated>2008-07-12T04:29:34.129+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="dynamic programming"/><category scheme="http://www.blogger.com/atom/ns#" term="prime"/><title type='text'>Dynamic Programming Part III - Partition Function</title><content type='html'>&lt;a href=&quot;http://en.wikipedia.org/wiki/Partition_function_%28number_theory%29&quot; target=&quot;_blank&quot;&gt;Partition Function&lt;/a&gt; is function to find distinct ways to sum natural numbers to a target number. Such as 4 can be partitioned to 5 distinct ways:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt;4&lt;br /&gt;3+1&lt;br /&gt;2+2&lt;br /&gt;2+1+1&lt;br /&gt;1+1+1+1&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Consider above summation and find overlapping function, we can notice that we can deduct 1 to 4 from target number. If the result is 0, it is the solution. If result is greater than 0, we must do further deduction. And this is the formula of partition function:&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://chaowchaow.googlepages.com/image003.png&quot; border=&quot;0&quot; alt=&quot;&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Where m is maximum number to deduct, n is the remaining. Whenever n is 0, means it is a solutions. But if n is less than 0, there is no solution for remaining less than 0. We can write above function into following code:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: #2B91AF;&quot;&gt;Func&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt;&amp;lt;&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt;, &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt;, &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt;&amp;gt; p = &lt;span style=&quot;color:blue&quot;&gt;null&lt;/span&gt;;&lt;br /&gt;p = (m, n) =&amp;gt; 1.To(m).Sum(i =&amp;gt; p(i, n - i));&lt;br /&gt;p = p.When((m, n) =&amp;gt; n == 0, (m, n) =&amp;gt; 1);&lt;br /&gt;p = p.When((m, n) =&amp;gt; n &amp;lt; 0, (m, n) =&amp;gt; 0);&lt;br /&gt;p = p.Memoize();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We can find the partition function of 100 by using following code:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: #2B91AF;&quot;&gt;Console&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt;.WriteLine(p(100, 100));&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//190569292&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We can adapt above function to find partition function using a specific set of number. Such as changing £2 to any number of coins (1p, 2p, 5p, 10p, 20p, 50p, 1£, and 2£). Following is the formula.&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://chaowchaow.googlepages.com/image004.png&quot; border=&quot;0&quot; alt=&quot;&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Where s(i) is the value of a specific item in the set. And now m is the upper bound of the set. We can solve number of solutions of changing for £2 with following code:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: blue;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt;[] s = &lt;span style=&quot;color:blue&quot;&gt;null&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt;, &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt;, &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt;&amp;gt; p = &lt;span style=&quot;color:blue&quot;&gt;null&lt;/span&gt;;&lt;br /&gt;p = (m, n) =&amp;gt; 0.To(m).Sum(i =&amp;gt; p(i, n - s[i]));&lt;br /&gt;p = p.When((m, n) =&amp;gt; n == 0, (m, n) =&amp;gt; 1);&lt;br /&gt;p = p.When((m, n) =&amp;gt; n &amp;lt; 0, (m, n) =&amp;gt; 0);&lt;br /&gt;p = p.Memoize();&lt;br /&gt;&lt;br /&gt;s = &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt;[] { 1, 2, 5, 10, 20, 50, 100, 200 };&lt;br /&gt;&lt;span style=&quot;color:#2B91AF&quot;&gt;Console&lt;/span&gt;.WriteLine(p(s.Length - 1, 200));&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//73682&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Next, we can also find the first target number, partitioned by prime numbers, and has over 5000 solutions.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt;s = &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Prime&lt;/span&gt;().TakeWhile(x =&amp;gt; x &amp;lt;= 100).Cast&amp;lt;&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt;&amp;gt;().ToArray();&lt;br /&gt;&lt;span style=&quot;color:#2B91AF&quot;&gt;Console&lt;/span&gt;.WriteLine(1.To(100).First(i =&amp;gt; p(s.Length - 1, i) &amp;gt;= 5000));&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//71&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This post is the end of dynamic programming series. The challenging part of dynamic programming is to find overlapping substructure. Once you find the substructure, your computation of the functions will be extremely fast. Next post is about number which is real number.</content><link rel='replies' type='application/atom+xml' href='http://chaowchaow.blogspot.com/feeds/6910370198676130628/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1350724202700062730/6910370198676130628' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350724202700062730/posts/default/6910370198676130628'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350724202700062730/posts/default/6910370198676130628'/><link rel='alternate' type='text/html' href='http://chaowchaow.blogspot.com/2008/07/dynamic-programming-part-iii-partition.html' title='Dynamic Programming Part III - Partition Function'/><author><name>Chaow</name><uri>http://www.blogger.com/profile/07962486640447233732</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350724202700062730.post-165805857917777191</id><published>2008-06-24T23:15:00.005+07:00</published><updated>2008-07-26T20:45:08.648+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="dynamic programming"/><title type='text'>Dynamic Programming Part II - Routes</title><content type='html'>This post is about to give you basic examples and how to solve dynamic programming. A classic dynamic programming example is to find number of routes over a rectangular grid.&lt;br /&gt;&lt;br /&gt;Here is example of 2x2 grid, there are 6 routes from top-left to bottom-right (without backtracking).&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://projecteuler.net/project/images/p_015.gif&quot;&gt;&lt;img src=&quot;http://projecteuler.net/project/images/p_015.gif&quot; border=&quot;0&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;(pic from &lt;a href=&quot;http://projecteuler.net&quot; target=&quot;_blank&quot;&gt;projecteuler.net&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;Then, how many routes for 20x20 grid? To solve this question with dynamic programming, you must first define the sub-structure. For every point on grid, there is 2 alternative routes, to move down, and to move right. Therefore, current function is a point (m,n), and sub-structure is point on the bottom (m,n-1) and point on the right (m-1,n). Number of routes for point (m,n) equal to point (m,n-1) plus point (m-1,n).&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt;(m,n)-----(m-1,n)&lt;br /&gt;&amp;nbsp;&amp;nbsp;|&lt;br /&gt;&amp;nbsp;&amp;nbsp;|&lt;br /&gt;&amp;nbsp;&amp;nbsp;|&lt;br /&gt;(m,n-1)&lt;br /&gt;&lt;br /&gt;if (m,n-1) has 3 routes to destination,&lt;br /&gt;and (m-1,n) also has 3 routes to destination,&lt;br /&gt;then (m,n) will has 6 (3+3) routes to destination&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Except point on bottom most, and on the right most, there is only one sub-structure.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt;(m,0)-----(m-1,0)&lt;br /&gt;&lt;br /&gt;then (m,0) = (m-1,0)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;and&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt;(0,n)&lt;br /&gt;&amp;nbsp;&amp;nbsp;|&lt;br /&gt;&amp;nbsp;&amp;nbsp;|&lt;br /&gt;&amp;nbsp;&amp;nbsp;|&lt;br /&gt;(0,n-1)&lt;br /&gt;&lt;br /&gt;then (0,n) = (0,n-1)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Finally, on the bottom-right most, it is the destination. The route count for itself is equal to 1. And here is the formula:&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://chaowchaow.googlepages.com/image001.png&quot; border=&quot;0&quot; /&gt;&lt;br /&gt;&lt;br /&gt;And you can write it with C# with following code:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: #2B91AF;&quot;&gt;Func&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt;&amp;lt;&lt;span style=&quot;color:blue&quot;&gt;long&lt;/span&gt;, &lt;span style=&quot;color:blue&quot;&gt;long&lt;/span&gt;, &lt;span style=&quot;color:blue&quot;&gt;long&lt;/span&gt;&amp;gt; func = &lt;span style=&quot;color:blue&quot;&gt;null&lt;/span&gt;;&lt;br /&gt;func = (m, n) =&amp;gt; func(m - 1, n) + func(m, n - 1);&lt;br /&gt;func = func.When((m, n) =&amp;gt; n == 0, (m, n) =&amp;gt; func(m - 1, 0));&lt;br /&gt;func = func.When((m, n) =&amp;gt; m == 0, (m, n) =&amp;gt; func(0, n - 1));&lt;br /&gt;func = func.When((m, n) =&amp;gt; m == 0 &amp;amp;&amp;amp; n == 0, (m, n) =&amp;gt; 1);&lt;br /&gt;func = func.Memoize();&lt;br /&gt;&lt;span style=&quot;color:#2B91AF&quot;&gt;Console&lt;/span&gt;.WriteLine(func(20, 20));&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//137846528820&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;To make it more harder, let&#39;s say that each point has different costs, how can we find the route with minimum cost? The logic is the same, but the formula is different. For a specific point on the grid, we will choose route that is lower cost.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt;(m,n)-----(m-1,n)&lt;br /&gt;&amp;nbsp;&amp;nbsp;|&lt;br /&gt;&amp;nbsp;&amp;nbsp;|&lt;br /&gt;&amp;nbsp;&amp;nbsp;|&lt;br /&gt;(m,n-1)&lt;br /&gt;&lt;br /&gt;if total cost for point (m,n-1)=15&lt;br /&gt;total cost for point (m-1,n)=20&lt;br /&gt;point (m,n-1) has lower total cost,&lt;br /&gt;then point (m,n)=15 + cost of point (m,n)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Here is the formula:&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://chaowchaow.googlepages.com/image002.png&quot; border=&quot;0&quot; /&gt;&lt;br /&gt;&lt;br /&gt;And this is code for C#:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: blue;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt;[,] cost = &lt;span style=&quot;color:&lt;br /&gt;blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt;[,] {&amp;nbsp;&amp;nbsp; {131, 673, 234, 103, 18}, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {201,&amp;nbsp; 96, 342, 965, 150}, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {630, 803, 746, 422, 111}, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{537, 699, 497, 121, 956}, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {805, 732, 524,&amp;nbsp; 37, 331}};&lt;br /&gt;&lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt;, &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt;, &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt;&amp;gt; func = &lt;span style=&quot;color:blue&quot;&gt;null&lt;/span&gt;;&lt;br /&gt;func = (m, n) =&amp;gt; cost[m, n] + &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt;[] { func(m - 1, n), func(m, n - 1) }.Min();&lt;br /&gt;func = func.When((m, n) =&amp;gt; n == 0, (m, n) =&amp;gt; cost[m, n] + func(m - 1, 0));&lt;br /&gt;func = func.When((m, n) =&amp;gt; m == 0, (m, n) =&amp;gt; cost[m, n] + func(0, n - 1));&lt;br /&gt;func = func.When((m, n) =&amp;gt; m == 0 &amp;amp;&amp;amp; n == 0, (m, n) =&amp;gt; cost[m, n]);&lt;br /&gt;func = func.Memoize();&lt;br /&gt;&lt;span style=&quot;color:#2B91AF&quot;&gt;Console&lt;/span&gt;.WriteLine(func(4, 4));&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//2427&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Next article, harder example for dynamic programming.</content><link rel='replies' type='application/atom+xml' href='http://chaowchaow.blogspot.com/feeds/165805857917777191/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1350724202700062730/165805857917777191' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350724202700062730/posts/default/165805857917777191'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350724202700062730/posts/default/165805857917777191'/><link rel='alternate' type='text/html' href='http://chaowchaow.blogspot.com/2008/06/dynamic-programming-part-ii-routes.html' title='Dynamic Programming Part II - Routes'/><author><name>Chaow</name><uri>http://www.blogger.com/profile/07962486640447233732</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350724202700062730.post-7097976282427901981</id><published>2008-06-14T10:18:00.003+07:00</published><updated>2008-07-26T17:51:36.640+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="dynamic programming"/><category scheme="http://www.blogger.com/atom/ns#" term="fibonacci"/><title type='text'>Dynamic Programming Part I - Introduction</title><content type='html'>All combinatoric problems can be solved by &lt;a href=&quot;http://en.wikipedia.org/wiki/Brute-force_search&quot; target=&quot;_blank&quot;&gt;Brute-force search&lt;/a&gt;. But if search space is very large, Brute-force search required very much time and performance to search for solutions. However, we can reduce search space by input the constraints, which is &lt;a href=&quot;http://chaowchaow.blogspot.com/search/label/constraint%20programming&quot; target=&quot;_blank&quot;&gt;Constraint Programming&lt;/a&gt;. And another optimization is to find the pattern of search space, it is &lt;a href=&quot;http://en.wikipedia.org/wiki/Dynamic_programming&quot; target=&quot;_blank&quot;&gt;Dynamic Programming&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Problems which can be solved by &lt;strong&gt;Dynamic Programming&lt;/strong&gt;, must contains 2 properties, which are&lt;br /&gt;&lt;br /&gt;- &lt;a href=&quot;http://en.wikipedia.org/wiki/Optimal_substructure&quot; target=&quot;_blank&quot;&gt;Optimal Substructure&lt;/a&gt;&lt;br /&gt;- &lt;a href=&quot;http://en.wikipedia.org/wiki/Overlapping_subproblem&quot; target=&quot;_blank&quot;&gt;Overlapping Subproblems&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Optimal Substructure&lt;/strong&gt; means, the sub-function must return the same solution everytime. For instance, &lt;br /&gt;&lt;a href=&quot;http://upload.wikimedia.org/wikipedia/en/4/42/Shortest_path_optimal_substructure.png&quot;&gt;&lt;img src=&quot;http://upload.wikimedia.org/wikipedia/en/4/42/Shortest_path_optimal_substructure.png&quot; border=&quot;0&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Start is a problem. The problem can be splitted into 3 sub-problems. Straight lines are known costs. Wavy lines are optimal costs of the sub-problems. If optimal costs is able to determine, the optimal solutions is also able to determine. The minimum cost for this problem is 25 (5 + 20). But if the optimal solutions on wavy lines cannot be determined, then there is no optimal substructure.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Overlapping Subproblems&lt;/strong&gt; means, the main function must be splitted into sub-function, and all sub-functions should share the same function. For instance, for a Fibonacci number, it is equal to the sum of 2 previous Fibonacci numbers. We can write into function: F(n) = F(n - 1) + F(n - 2). And we must also define the end point of recursive function: F(0) = 0, F(1) = 1.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://upload.wikimedia.org/math/7/6/f/76f99713cf111eb035d908228c351710.png&quot;&gt;&lt;img src=&quot;http://upload.wikimedia.org/math/7/6/f/76f99713cf111eb035d908228c351710.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Dynamic Programming in practical makes use of&lt;br /&gt;- &lt;a href=&quot;http://en.wikipedia.org/wiki/Recursion_%28computer_science%29&quot; target=&quot;_blank&quot;&gt;Recursion&lt;/a&gt;&lt;br /&gt;- &lt;a href=&quot;http://en.wikipedia.org/wiki/Pattern_matching&quot; target=&quot;_blank&quot;&gt;Pattern Matching&lt;/a&gt;&lt;br /&gt;- &lt;a href=&quot;http://en.wikipedia.org/wiki/Memoization&quot; target=&quot;_blank&quot;&gt;Memoization&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Recursion&lt;/strong&gt; is function that can be splitted into sub-function of itself. In C#, it doesn&#39;t support anonymous recursive function, we have to set it to null before make the recursion.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: #2B91AF;&quot;&gt;Func&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt;&amp;lt;&lt;span style=&quot;color:blue&quot;&gt;long&lt;/span&gt;, &lt;span style=&quot;color:blue&quot;&gt;long&lt;/span&gt;&amp;gt; fibo = &lt;span style=&quot;color:blue&quot;&gt;null&lt;/span&gt;;&lt;br /&gt;fibo = n =&amp;gt; fibo(n - 1) + fibo(n - 2);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Pattern Matching&lt;/strong&gt; is to check the input parameter, and reroute to the the appropriate function. For me, I used &lt;em&gt;When&lt;/em&gt; method, this method can be found in delegate article, &lt;a href=&quot;http://chaowchaow.blogspot.com/2008/01/extension-methods-for-delegate-types.html&quot; target=&quot;_blank&quot;&gt;part I&lt;/a&gt;, and &lt;a href=&quot;http://chaowchaow.blogspot.com/2008/04/extension-methods-for-delegate-types.html&quot; target=&quot;_blank&quot;&gt;part II&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt;fibo = fibo.When(n =&amp;gt; n == 1, n =&amp;gt; 1);&lt;br /&gt;fibo = fibo.When(n =&amp;gt; n == 0, n =&amp;gt; 0);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Memoization&lt;/strong&gt; is technique to cache the result to speed up calculation. Because dynamic programming is optimal substructure, the sub-function can be determined. Memoization is very important to make dynamic programming processes faster. (&lt;em&gt;Memoize&lt;/em&gt; method also can be found in delegate article, &lt;a href=&quot;http://chaowchaow.blogspot.com/2008/01/extension-methods-for-delegate-types.html&quot; target=&quot;_blank&quot;&gt;part I&lt;/a&gt;, and &lt;a href=&quot;http://chaowchaow.blogspot.com/2008/04/extension-methods-for-delegate-types.html&quot; target=&quot;_blank&quot;&gt;part II&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt;fibo = fibo.Memoize();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now we can combine it all together.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: #2B91AF;&quot;&gt;Func&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt;&amp;lt;&lt;span style=&quot;color:blue&quot;&gt;long&lt;/span&gt;, &lt;span style=&quot;color:blue&quot;&gt;long&lt;/span&gt;&amp;gt; fibo = &lt;span style=&quot;color:blue&quot;&gt;null&lt;/span&gt;;&lt;br /&gt;fibo = n =&amp;gt; fibo(n - 1) + fibo(n - 2);&lt;br /&gt;fibo = fibo.When(n =&amp;gt; n == 1, n =&amp;gt; 1);&lt;br /&gt;fibo = fibo.When(n =&amp;gt; n == 0, n =&amp;gt; 0);&lt;br /&gt;fibo = fibo.Memoize();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Dynamic programming is now completed for Fibonacci function. To call function, is very simple.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: #2B91AF;&quot;&gt;Console&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt;.WriteLine(fibo(38));&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//39088169&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Next article, some more examples on dynamic programming.</content><link rel='replies' type='application/atom+xml' href='http://chaowchaow.blogspot.com/feeds/7097976282427901981/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1350724202700062730/7097976282427901981' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350724202700062730/posts/default/7097976282427901981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350724202700062730/posts/default/7097976282427901981'/><link rel='alternate' type='text/html' href='http://chaowchaow.blogspot.com/2008/06/dynamic-programming-part-i-introduction.html' title='Dynamic Programming Part I - Introduction'/><author><name>Chaow</name><uri>http://www.blogger.com/profile/07962486640447233732</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350724202700062730.post-6213403712168893855</id><published>2008-05-28T21:23:00.004+07:00</published><updated>2008-06-14T10:07:08.069+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="codegolf"/><category scheme="http://www.blogger.com/atom/ns#" term="roman"/><title type='text'>Roman Numerals</title><content type='html'>&lt;a href=&quot;http://en.wikipedia.org/wiki/Roman_numerals&quot; target=&quot;_blank&quot;&gt;Roman numerals&lt;/a&gt; is a numeral system used in ancient Rome. However, today we still use Roman numerals mostly for number-lists, places&#39; year, and on the watches. Here are the letters, which represent a number.&lt;br /&gt;&lt;br /&gt;&quot;&lt;strong&gt;I&lt;/strong&gt;&quot; is for 1 &lt;br /&gt;&quot;&lt;strong&gt;V&lt;/strong&gt;&quot; is for 5 &lt;br /&gt;&quot;&lt;strong&gt;X&lt;/strong&gt;&quot; is for 10&lt;br /&gt;&quot;&lt;strong&gt;L&lt;/strong&gt;&quot; is for 50&lt;br /&gt;&quot;&lt;strong&gt;C&lt;/strong&gt;&quot; is for 100&lt;br /&gt;&quot;&lt;strong&gt;D&lt;/strong&gt;&quot; is for 500&lt;br /&gt;&quot;&lt;strong&gt;M&lt;/strong&gt;&quot; is for 1000&lt;br /&gt;&lt;br /&gt;Rule for reading Roman numerals is simple, just sum up value of each letter. However, there is an exception for reduce form. If value of the letter on the left is less than value of the letter on the right, that is reduce form. That letter must deduct from the sum instead of addition. Such as &quot;XLIX&quot;, first X is less than L, and I is less than second X. We can write it as -10 + 50 - 1 + 10 = 49.&lt;br /&gt;&lt;br /&gt;Rule for writing Roman numerals is also simple. Just deduct from sum by using largest value letter as possible. And you cannot using the letters for 4 times consecutively, in this case, you must write the reduce form. For example 19, Roman number should be &quot;XVIIII&quot; (10 + 5 + 1 + 1 + 1 + 1). But we cannot using I for 4 times consecutively, therefore &quot;VIIII&quot;, must be written in reduce form as &quot;IX&quot;. As a result, 19 can be written as &quot;XIX&quot;.&lt;br /&gt;&lt;br /&gt;Now, for coding.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: blue;&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt; &lt;span style=&quot;color:blue&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Roman&lt;/span&gt; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; _value;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; Value {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;get&lt;/span&gt; { &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; _value; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; Roman(&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; value) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;if&lt;/span&gt; (value &amp;lt; 1 || value &amp;gt; 4999)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;throw&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;ArgumentOutOfRangeException&lt;/span&gt;(&lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot;value&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot;value should be between 1 and 4999&amp;quot;&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _value = value;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;implicit&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;operator&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Roman&lt;/span&gt;(&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; x) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Roman&lt;/span&gt;(x);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Roman&lt;/span&gt; Parse(&lt;span style=&quot;color:blue&quot;&gt;string&lt;/span&gt; roman) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;var&lt;/span&gt; letter = &lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot;IVXLCDM&amp;quot;&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;var&lt;/span&gt; num = &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt;[] { 1, 5, 10, 50, 100, 500, 1000 };&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;var&lt;/span&gt; dict = num.WithIndex(letter);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; value, last = 0, sum = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;foreach&lt;/span&gt; (&lt;span style=&quot;color:blue&quot;&gt;char&lt;/span&gt; c &lt;span style=&quot;color:blue&quot;&gt;in&lt;/span&gt; roman) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;if&lt;/span&gt; (!dict.TryGetValue(c, &lt;span style=&quot;color:blue&quot;&gt;out&lt;/span&gt; value))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;throw&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;ArgumentException&lt;/span&gt;(&lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot;roman contains invalid characters&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot;roman&amp;quot;&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;if&lt;/span&gt; (last &amp;lt; value)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sum -= last;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;else&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sum += last;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; last = value;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sum += last;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Roman&lt;/span&gt;(sum);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;override&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;string&lt;/span&gt; ToString() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;string&lt;/span&gt; numStr = _value.ToString(&lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot;0000&amp;quot;&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;string&lt;/span&gt; one = &lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot;MCXI&amp;quot;&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;string&lt;/span&gt;[] five = { &lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot;MMM&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot;D&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot;L&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot;V&amp;quot;&lt;/span&gt; };&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:#2B91AF&quot;&gt;StringBuilder&lt;/span&gt; sb = &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;StringBuilder&lt;/span&gt;();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; numStr.ForEach((c, i) =&amp;gt; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;if&lt;/span&gt; (c &amp;lt; &lt;span style=&quot;color:#A31515&quot;&gt;&amp;#39;4&amp;#39;&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sb.Append(one[i], (&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt;)(c - &lt;span style=&quot;color:#A31515&quot;&gt;&amp;#39;0&amp;#39;&lt;/span&gt;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;if&lt;/span&gt; (c == &lt;span style=&quot;color:#A31515&quot;&gt;&amp;#39;4&amp;#39;&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sb.Append(one[i]).Append(five[i]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;if&lt;/span&gt; (c &amp;lt; &lt;span style=&quot;color:#A31515&quot;&gt;&amp;#39;9&amp;#39;&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sb.Append(five[i]).Append(one[i], (&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt;)(c - &lt;span style=&quot;color:#A31515&quot;&gt;&amp;#39;5&amp;#39;&lt;/span&gt;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color:green&quot;&gt;//9&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sb.Append(one[i]).Append(one[i - 1]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; sb.ToString();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you notice, Parse method uses index injection from &lt;a href=&quot;http://chaowchaow.blogspot.com/2008/05/extension-methods-for-enumerable-part.html&quot; target=&quot;_blank&quot;&gt;previous post&lt;/a&gt;, to transform 2 set of array into a dictionary.&lt;br /&gt;&lt;br /&gt;To create a Roman number, just assign from integer.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: &amp;quot;Courier New&amp;quot;; color: #2B91AF;&quot;&gt;Roman&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt; r = 19;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;To read Roman number, use Parse method.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: &amp;quot;Courier New&amp;quot;; color: #2B91AF;&quot;&gt;Roman&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt; r = &lt;span style=&quot;color:#2B91AF&quot;&gt;Roman&lt;/span&gt;.Parse(&lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot;XIX&amp;quot;&lt;/span&gt;);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;To write Roman number, use ToString method.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: &amp;quot;Courier New&amp;quot;; color: #2B91AF;&quot;&gt;Console&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt;.WriteLine(r.ToString());&lt;span style=&quot;color:green&quot;&gt;&lt;br&gt;//XIX&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;To get value from Roman number, use Value property.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: #2B91AF;&quot;&gt;Console&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt;.WriteLine(r.Value);&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//19&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;More example from &lt;a href=&quot;http://codegolf.com&quot; target=&quot;_blank&quot;&gt;CodeGolf&lt;/a&gt;. Roman to decimal number.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: #2B91AF;&quot;&gt;Roman&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt; r = &lt;span style=&quot;color:#2B91AF&quot;&gt;Roman&lt;/span&gt;.Parse(&lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot;MCDXL&amp;quot;&lt;/span&gt;);&lt;br /&gt;&lt;span style=&quot;color:#2B91AF&quot;&gt;Console&lt;/span&gt;.WriteLine(r.Value);&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//1440&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Next article, start a new series topic &quot;Dynamic Programming&quot;.</content><link rel='replies' type='application/atom+xml' href='http://chaowchaow.blogspot.com/feeds/6213403712168893855/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1350724202700062730/6213403712168893855' title='1 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350724202700062730/posts/default/6213403712168893855'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350724202700062730/posts/default/6213403712168893855'/><link rel='alternate' type='text/html' href='http://chaowchaow.blogspot.com/2008/05/roman-numerals.html' title='Roman Numerals'/><author><name>Chaow</name><uri>http://www.blogger.com/profile/07962486640447233732</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350724202700062730.post-8567872077689483690</id><published>2008-05-15T22:03:00.003+07:00</published><updated>2008-06-14T10:07:08.070+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="codegolf"/><category scheme="http://www.blogger.com/atom/ns#" term="enumerable"/><category scheme="http://www.blogger.com/atom/ns#" term="extension"/><title type='text'>Extension Methods for Enumerable Part II - Index injection and index extraction</title><content type='html'>In enumerable type, index is useful to identify a member. In C# 3.0, some methods for enumerable provide index parameter such as Select and Where. But most of methods are still not provide index, such as GroupBy and OrderBy.&lt;br /&gt;&lt;br /&gt;One of the easy way to inject index into enumerable is to use &lt;a href=&quot;http://en.wikipedia.org/wiki/Closure_%28computer_science%29&quot; target=&quot;_blank&quot;&gt;Closure&lt;/a&gt;. For example, if you want to order &quot;ABCDEFG&quot; alternately you may write.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: blue;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt; i = 0;&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;var&lt;/span&gt; e = &lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot;ABCDEFG&amp;quot;&lt;/span&gt;.OrderBy(c =&amp;gt; i++ % 2);&lt;br /&gt;&lt;span style=&quot;color:#2B91AF&quot;&gt;Console&lt;/span&gt;.WriteLine(e.ListMembers());&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//A C E G B D F&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;To inject an index, you may declare a variable (i) and use this variable as an index in the delegate. You must also put incremental operator (++) to index variable to make index increase every iteration.&lt;br /&gt;&lt;br /&gt;Anyway, using of Closure also has drawback. The index variable will not be cleared after enumeration. When you enumerate again index variable will be incorrect. For example:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt; i = 0;&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;var&lt;/span&gt; e = &lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot;ABCDEFG&amp;quot;&lt;/span&gt;.OrderBy(c =&amp;gt; i++ % 2);&lt;br /&gt;&lt;span style=&quot;color:#2B91AF&quot;&gt;Console&lt;/span&gt;.WriteLine(e.ListMembers());&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//A C E G B D F&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#2B91AF&quot;&gt;Console&lt;/span&gt;.WriteLine(e.ListMembers());&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//B D F A C E G&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As you can see, the third command and the forth command are the same. But the result is not the same. Because, after run the third command, i value is equal to 7. Then when you call the forth command, the index will be started at index 7 and so on. Finally, the result will not be the same for the second time.&lt;br /&gt;&lt;br /&gt;Anyway, this issue can be solved by make the class persistent.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt; i = 0;&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;var&lt;/span&gt; e = &lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot;ABCDEFG&amp;quot;&lt;/span&gt;.OrderBy(c =&amp;gt; i++ % 2).ToArray();&lt;br /&gt;&lt;span style=&quot;color:#2B91AF&quot;&gt;Console&lt;/span&gt;.WriteLine(e.ListMembers());&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//A C E G B D F&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#2B91AF&quot;&gt;Console&lt;/span&gt;.WriteLine(e.ListMembers());&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//A C E G B D F&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Above example, we call ToArray after OrderBy method, and make e variable persistent. The result for e will be the same everytime.&lt;br /&gt;&lt;br /&gt;Another solution for index injection is to create extension methods.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt;, T&amp;gt; WithIndex&amp;lt;T&amp;gt;(&lt;span style=&quot;color:&lt;br /&gt;blue&quot;&gt;this&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; source) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; source.WithIndex(0.To(&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt;.MaxValue), &lt;span style=&quot;color:#2B91AF&quot;&gt;EqualityComparer&lt;/span&gt;&amp;lt;&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt;&amp;gt;.Default);&lt;br /&gt;}&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Dictionary&lt;/span&gt;&amp;lt;T1, T2&amp;gt; WithIndex&amp;lt;T1, T2&amp;gt;(&lt;span style=&quot;color:blue&quot;&gt;this&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;IEnumerable&lt;/span&gt;&amp;lt;T2&amp;gt; source, &lt;span style=&quot;color:#2B91AF&quot;&gt;IEnumerable&lt;/span&gt;&amp;lt;T1&amp;gt; index) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; source.WithIndex(index, &lt;span style=&quot;color:#2B91AF&quot;&gt;EqualityComparer&lt;/span&gt;&amp;lt;T1&amp;gt;.Default);&lt;br /&gt;}&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Dictionary&lt;/span&gt;&amp;lt;T1, T2&amp;gt; WithIndex&amp;lt;T1, T2&amp;gt;(&lt;span style=&quot;color:blue&quot;&gt;this&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;IEnumerable&lt;/span&gt;&amp;lt;T2&amp;gt; source, &lt;span style=&quot;color:#2B91AF&quot;&gt;IEnumerable&lt;/span&gt;&amp;lt;T1&amp;gt; index, &lt;span style=&quot;color:#2B91AF&quot;&gt;IEqualityComparer&lt;/span&gt;&amp;lt;T1&amp;gt; comparer) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:#2B91AF&quot;&gt;Dictionary&lt;/span&gt;&amp;lt;T1, T2&amp;gt; dict = &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Dictionary&lt;/span&gt;&amp;lt;T1, T2&amp;gt;(comparer);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;using&lt;/span&gt; (&lt;span style=&quot;color:#2B91AF&quot;&gt;IEnumerator&lt;/span&gt;&amp;lt;T2&amp;gt; source_enum = source.GetEnumerator()) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;using&lt;/span&gt; (&lt;span style=&quot;color:#2B91AF&quot;&gt;IEnumerator&lt;/span&gt;&amp;lt;T1&amp;gt; index_enum = index.GetEnumerator()) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;while&lt;/span&gt; (source_enum.MoveNext()) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;if&lt;/span&gt; (!index_enum.MoveNext())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;throw&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;ArgumentException&lt;/span&gt;(&lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot;index cannot has less length than source&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot;index&amp;quot;&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dict.Add(index_enum.Current, source_enum.Current);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; dict;&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You just call above method before enumeration. The result you get is a dictionary. Key is index, and Value is object. Then after enumeration, you may call Select method to remove index from the object. For example:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt; e = &lt;span style=&quot;color:blue&quot;&gt;from&lt;/span&gt; c &lt;span style=&quot;color:blue&quot;&gt;in&lt;/span&gt; &lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot;ABCDEFG&amp;quot;&lt;/span&gt;.WithIndex()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;orderby&lt;/span&gt; c.Key % 2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;select&lt;/span&gt; c.Value;&lt;br /&gt;&lt;span style=&quot;color:#2B91AF&quot;&gt;Console&lt;/span&gt;.WriteLine(e.ListMembers());&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//A C E G B D F&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#2B91AF&quot;&gt;Console&lt;/span&gt;.WriteLine(e.ListMembers());&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//A C E G B D F&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You can also pass any kind of index into WithIndex method. The index&#39;s length must be greater than or equal to source&#39;s length.&lt;br /&gt;&lt;br /&gt;For example, you have &lt;em&gt;source&lt;/em&gt; and &lt;em&gt;position&lt;/em&gt;. And you want to sort &lt;em&gt;source&lt;/em&gt; by &lt;em&gt;position&lt;/em&gt;. In this case, you can assign &lt;em&gt;position&lt;/em&gt; as an index of the &lt;em&gt;source&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt; e = &lt;span style=&quot;color:blue&quot;&gt;from&lt;/span&gt; x &lt;span style=&quot;color:blue&quot;&gt;in&lt;/span&gt; source.WithIndex(position)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;orderby&lt;/span&gt; x.Key&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;select&lt;/span&gt; x.Value;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Index extraction&lt;/strong&gt; is index from specific item in the enumerable. Here is the extension methods:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; IndexOf&amp;lt;T&amp;gt;(&lt;span style=&quot;color:blue&quot;&gt;this&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; source, T item) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; source.IndexOf(item, &lt;span style=&quot;color:#2B91AF&quot;&gt;EqualityComparer&lt;/span&gt;&amp;lt;T&amp;gt;.Default);&lt;br /&gt;}&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; IndexOf&amp;lt;T&amp;gt;(&lt;span style=&quot;color:blue&quot;&gt;this&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; source, T item, &lt;span style=&quot;color:#2B91AF&quot;&gt;IEqualityComparer&lt;/span&gt;&amp;lt;T&amp;gt; comparer) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:#2B91AF&quot;&gt;IList&lt;/span&gt;&amp;lt;T&amp;gt; list = source &lt;span style=&quot;color:blue&quot;&gt;as&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;IList&lt;/span&gt;&amp;lt;T&amp;gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;if&lt;/span&gt; (list != &lt;span style=&quot;color:blue&quot;&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; list.IndexOf(item);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; i = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;foreach&lt;/span&gt; (T x &lt;span style=&quot;color:blue&quot;&gt;in&lt;/span&gt; source) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;if&lt;/span&gt; (comparer.Equals(x, item))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; i;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; -1;&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The example for IndexOf is from &lt;a href=&quot;http://codegolf.com/&quot; target=&quot;_blank&quot;&gt;CodeGolf&lt;/a&gt;. The question is Reverse game. You will get list of numbers randomly. And you must tell how many numbers from the left to reverse. And target is to arrage the numbers.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt;[] list = &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt;[] { 8, 9, 4, 5, 1, 3, 6, 2, 7 };&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:#2B91AF&quot;&gt;Action&lt;/span&gt;&amp;lt;&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt;&amp;gt; reverse = i =&amp;gt; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;if&lt;/span&gt; (i &amp;gt; 1) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:#2B91AF&quot;&gt;Console&lt;/span&gt;.WriteLine(&lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot;reverse: {0}&amp;quot;&lt;/span&gt;, i);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; list = list.Take(i).Reverse().Concat(list.Skip(i)).ToArray();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:#2B91AF&quot;&gt;Console&lt;/span&gt;.WriteLine(list.ListMembers());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;list.Length.DownTo(1).ForEach(x =&amp;gt; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;if&lt;/span&gt; (x != list[x - 1]) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; reverse(list.&lt;strong&gt;IndexOf&lt;/strong&gt;(x) + 1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; reverse(x);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;});&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//8 9 4 5 1 3 6 2 7&lt;br /&gt;//reverse: 2&lt;br /&gt;//9 8 4 5 1 3 6 2 7&lt;br /&gt;//reverse: 9&lt;br /&gt;//7 2 6 3 1 5 4 8 9&lt;br /&gt;//reverse: 7&lt;br /&gt;//4 5 1 3 6 2 7 8 9&lt;br /&gt;//reverse: 5&lt;br /&gt;//6 3 1 5 4 2 7 8 9&lt;br /&gt;//reverse: 6&lt;br /&gt;//2 4 5 1 3 6 7 8 9&lt;br /&gt;//reverse: 3&lt;br /&gt;//5 4 2 1 3 6 7 8 9&lt;br /&gt;//reverse: 5&lt;br /&gt;//3 1 2 4 5 6 7 8 9&lt;br /&gt;//reverse: 3&lt;br /&gt;//2 1 3 4 5 6 7 8 9&lt;br /&gt;//reverse: 2&lt;br /&gt;//1 2 3 4 5 6 7 8 9&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Above example, you need IndexOf to identify position of the next number you want to reverse in the list. Then you reverse that number to the left, and then you reverse again to move the number to appropriate position.&lt;br /&gt;&lt;br /&gt;Next, we will go to Roman Numerals.</content><link rel='replies' type='application/atom+xml' href='http://chaowchaow.blogspot.com/feeds/8567872077689483690/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1350724202700062730/8567872077689483690' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350724202700062730/posts/default/8567872077689483690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350724202700062730/posts/default/8567872077689483690'/><link rel='alternate' type='text/html' href='http://chaowchaow.blogspot.com/2008/05/extension-methods-for-enumerable-part.html' title='Extension Methods for Enumerable Part II - Index injection and index extraction'/><author><name>Chaow</name><uri>http://www.blogger.com/profile/07962486640447233732</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350724202700062730.post-2762770306335383882</id><published>2008-04-24T09:21:00.004+07:00</published><updated>2008-06-14T10:07:08.070+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="biginteger"/><category scheme="http://www.blogger.com/atom/ns#" term="extension"/><category scheme="http://www.blogger.com/atom/ns#" term="math"/><title type='text'>Extension Methods for Math</title><content type='html'>Math class provided by core library of .NET is very good. But most methods are for double type. Today we will create math methods for integer types which include int, long, and BigInteger.&lt;br /&gt;&lt;br /&gt;Start with &lt;strong&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Greatest_common_divisor&quot; target=&quot;_blank&quot;&gt;GCD (Greatest Common Divisor)&lt;/a&gt;&lt;/strong&gt;, which I used once in &lt;a href=&quot;http://chaowchaow.blogspot.com/2008/01/infinite-sequence-part-v.html&quot; target=&quot;_blank&quot;&gt;Pythagorean article&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: blue;&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; Gcd(&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; a, &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; b) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;while&lt;/span&gt; (b != 0) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; r = a % b;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a = b;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; b = r;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; a;&lt;br /&gt;}&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;long&lt;/span&gt; Gcd(&lt;span style=&quot;color:blue&quot;&gt;long&lt;/span&gt; a, &lt;span style=&quot;color:blue&quot;&gt;long&lt;/span&gt; b) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;while&lt;/span&gt; (b != 0L) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;long&lt;/span&gt; r = a % b;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a = b;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; b = r;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; a;&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;And next one goes to &lt;strong&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Least_common_multiple&quot; target=&quot;_blank&quot;&gt;LCM (Least Common Multiple)&lt;/a&gt;&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: blue;&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; Lcm(&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; a, &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; b) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; (b / Gcd(a, b)) * a;&lt;br /&gt;}&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;long&lt;/span&gt; Lcm(&lt;span style=&quot;color:blue&quot;&gt;long&lt;/span&gt; a, &lt;span style=&quot;color:blue&quot;&gt;long&lt;/span&gt; b) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; (b / Gcd(a, b)) * a;&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Usage of these methods are easy, to find GCD and LCM of number 1 to 20.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: #2B91AF;&quot;&gt;Console&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt;.WriteLine(1.To(20).Aggregate(&lt;span style=&quot;color:#2B91AF&quot;&gt;Math2&lt;/span&gt;.Gcd));&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//1&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#2B91AF&quot;&gt;Console&lt;/span&gt;.WriteLine(1.To(20).Aggregate(&lt;span style=&quot;color:#2B91AF&quot;&gt;Math2&lt;/span&gt;.Lcm));&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//232792560&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Next is &lt;strong&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Integer_square_root&quot; target=&quot;_blank&quot;&gt;Integer Square Root&lt;/a&gt;&lt;/strong&gt;. This method uses &lt;a href=&quot;http://en.wikipedia.org/wiki/Newton%27s_method&quot; target=&quot;_blank&quot;&gt;Newton&#39;s method&lt;/a&gt; to solve square root.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: blue;&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; Sqrt(&lt;span style=&quot;color:blue&quot;&gt;this&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; num) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;if&lt;/span&gt; (num &amp;lt; 0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;throw&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;ArgumentOutOfRangeException&lt;/span&gt;(&lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot;num&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot;num cannot be negative&amp;quot;&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; x = num;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; y = (x + 1) / 2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;while&lt;/span&gt; (y &amp;lt; x) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x = y;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; y = (x + (num / x)) / 2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; x;&lt;br /&gt;}&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;long&lt;/span&gt; Sqrt(&lt;span style=&quot;color:blue&quot;&gt;this&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;long&lt;/span&gt; num) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;if&lt;/span&gt; (num &amp;lt; 0L)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;throw&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;ArgumentOutOfRangeException&lt;/span&gt;(&lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot;num&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot;num cannot be negative&amp;quot;&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;long&lt;/span&gt; x = num;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;long&lt;/span&gt; y = (x + 1L) / 2L;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;while&lt;/span&gt; (y &amp;lt; x) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x = y;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; y = (x + (num / x)) / 2L;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; x;&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Usage is simple, to find square root of 2,000,000,000,000,000,000&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: #2B91AF;&quot;&gt;Console&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt;.WriteLine(2000000000000000000.Sqrt());&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//1414213562&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Next is to find the &lt;strong&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Exponentiation&quot; target=&quot;_blank&quot;&gt;Exponentiation&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: blue;&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; Power(&lt;span style=&quot;color:blue&quot;&gt;this&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; num, &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; pow) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;if&lt;/span&gt; (pow &amp;lt; 0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;throw&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;ArgumentOutOfRangeException&lt;/span&gt;(&lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot;pow&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot;pow cannot be negative&amp;quot;&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; result = 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;while&lt;/span&gt; (pow != 0) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;if&lt;/span&gt; ((pow &amp;amp; 1) == 1) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; result *= num;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;if&lt;/span&gt; (pow == 1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; result;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; num *= num;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pow &amp;gt;&amp;gt;= 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; result;&lt;br /&gt;}&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;long&lt;/span&gt; Power(&lt;span style=&quot;color:blue&quot;&gt;this&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;long&lt;/span&gt; num, &lt;span style=&quot;color:blue&quot;&gt;long&lt;/span&gt; pow) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;if&lt;/span&gt; (pow &amp;lt; 0L)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;throw&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;ArgumentOutOfRangeException&lt;/span&gt;(&lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot;pow&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot;pow cannot be negative&amp;quot;&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;long&lt;/span&gt; result = 1L;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;while&lt;/span&gt; (pow != 0L) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;if&lt;/span&gt; ((pow &amp;amp; 1L) == 1L) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; result *= num;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;if&lt;/span&gt; (pow == 1L)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; result;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; num *= num;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pow &amp;gt;&amp;gt;= 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; result;&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Usage is as simple as square root, to find 2nd power of 1,414,213,562.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: #2B91AF;&quot;&gt;Console&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt;.WriteLine(1414213562L.Power(2));&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//1999999998944727844&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;When you use integer square root and power to a number, if result is not the same as that number, the number is not &lt;a href=&quot;http://en.wikipedia.org/wiki/Perfect_square&quot; target=&quot;_blank&quot;&gt;perfect square&lt;/a&gt;. In the example above, 2,000,000,000,000,000,000 is not perfect square.&lt;br /&gt;&lt;br /&gt;Last one, &lt;strong&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Modular_exponentiation&quot; target=&quot;_blank&quot;&gt;Modular Exponentiation&lt;/a&gt;&lt;/strong&gt;, is to perform power over a modulus.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: blue;&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; ModPow(&lt;span style=&quot;color:blue&quot;&gt;this&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; num, &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; pow, &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; mod) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;if&lt;/span&gt; (pow &amp;lt; 0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;throw&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;ArgumentOutOfRangeException&lt;/span&gt;(&lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot;pow&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot;pow cannot be negative&amp;quot;&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; result = 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;while&lt;/span&gt; (pow != 0) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;if&lt;/span&gt; ((pow &amp;amp; 1) == 1) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; result = (result * num) % mod;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;if&lt;/span&gt; (pow == 1L)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; result;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; num = (num * num) % mod;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pow &amp;gt;&amp;gt;= 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; result;&lt;br /&gt;}&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;long&lt;/span&gt; ModPow(&lt;span style=&quot;color:blue&quot;&gt;this&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;long&lt;/span&gt; num, &lt;span style=&quot;color:blue&quot;&gt;long&lt;/span&gt; pow, &lt;span style=&quot;color:blue&quot;&gt;long&lt;/span&gt; mod) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;if&lt;/span&gt; (pow &amp;lt; 0L)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;throw&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;ArgumentOutOfRangeException&lt;/span&gt;(&lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot;pow&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot;pow cannot be negative&amp;quot;&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;long&lt;/span&gt; result = 1L;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;while&lt;/span&gt; (pow != 0L) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;if&lt;/span&gt; ((pow &amp;amp; 1L) == 1L) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; result = (result * num) % mod;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;if&lt;/span&gt; (pow == 1L)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; result;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; num = (num * num) % mod;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pow &amp;gt;&amp;gt;= 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; result;&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Example of modular exponentiation, to find last 5 digits of 10th power of 1,414,213,562.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: #2B91AF;&quot;&gt;Console&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt;.WriteLine(1414213562L.ModPow(10L, 100000L));&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//60224&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;And below is the code for BigInteger&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: blue;&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;BigInteger&lt;/span&gt; Gcd(&lt;span style=&quot;color:#2B91AF&quot;&gt;BigInteger&lt;/span&gt; a, &lt;span style=&quot;color:#2B91AF&quot;&gt;BigInteger&lt;/span&gt; b) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;while&lt;/span&gt; (!b.IsZero()) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:#2B91AF&quot;&gt;BigInteger&lt;/span&gt; r = a % b;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a = b;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; b = r;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; a;&lt;br /&gt;}&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;BigInteger&lt;/span&gt; Lcm(&lt;span style=&quot;color:#2B91AF&quot;&gt;BigInteger&lt;/span&gt; a, &lt;span style=&quot;color:#2B91AF&quot;&gt;BigInteger&lt;/span&gt; b) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; (b / Gcd(a, b)) * a;&lt;br /&gt;}&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;readonly&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;BigInteger&lt;/span&gt; two = 2;&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;BigInteger&lt;/span&gt; Sqrt(&lt;span style=&quot;color:blue&quot;&gt;this&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;BigInteger&lt;/span&gt; num) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;if&lt;/span&gt; (num.IsNegative())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;throw&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;ArgumentException&lt;/span&gt;(&lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot;num cannot be negative&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot;num&amp;quot;&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;if&lt;/span&gt; (num.IsZero())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;BigInteger&lt;/span&gt;.Zero;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:#2B91AF&quot;&gt;BigInteger&lt;/span&gt; x = num;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:#2B91AF&quot;&gt;BigInteger&lt;/span&gt; y = (x + &lt;span style=&quot;color:#2B91AF&quot;&gt;BigInteger&lt;/span&gt;.One) / two;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;while&lt;/span&gt; (y &amp;lt; x) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x = y;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; y = (x + (num / x)) / two;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; x;&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;There is not Power and ModPow for BigInteger, because BigInteger already contains those methods.&lt;br /&gt;&lt;br /&gt;Next article, is to find the ways to inject index into various enumerable methods.</content><link rel='replies' type='application/atom+xml' href='http://chaowchaow.blogspot.com/feeds/2762770306335383882/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1350724202700062730/2762770306335383882' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350724202700062730/posts/default/2762770306335383882'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350724202700062730/posts/default/2762770306335383882'/><link rel='alternate' type='text/html' href='http://chaowchaow.blogspot.com/2008/04/extension-methods-for-math.html' title='Extension Methods for Math'/><author><name>Chaow</name><uri>http://www.blogger.com/profile/07962486640447233732</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350724202700062730.post-4954686782321428353</id><published>2008-04-05T16:31:00.003+07:00</published><updated>2008-06-14T10:07:08.070+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="delegate"/><category scheme="http://www.blogger.com/atom/ns#" term="extension"/><title type='text'>Extension Methods for Delegate Types Part II - Passing anonymous type to generic function</title><content type='html'>How can you create function which its parameter or return type is anonymous type? You can&#39;t assign lambda expression to implicit local variable declaration.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: green;&quot;&gt;//Compile error&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: blue;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt; func = () =&amp;gt; &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; { x = 1, y = 2 };&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The c# compiler also does not accept &lt;a href=&quot;http://en.wikipedia.org/wiki/Type_inference&quot; target=&quot;_blank&quot;&gt;type inference&lt;/a&gt; on instantiation, such as&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: green;&quot;&gt;//Compile error&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: blue;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt; func = &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; Func(() =&gt; &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; { x = 1, y = 2 });&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;To create generic function, which accepts anonymous type, we must create method. Because for method, type inference is allowed.&lt;br /&gt;&lt;br /&gt;Here is the code.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: blue;&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;TResult&amp;gt; CreateFunction&amp;lt;TResult&amp;gt;(&lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;TResult&amp;gt; tResult) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; tResult;&lt;br /&gt;}&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T, TResult&amp;gt; CreateFunction&amp;lt;T, TResult&amp;gt;(T t, &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T, TResult&amp;gt; tResult) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; tResult;&lt;br /&gt;}&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T1, T2, TResult&amp;gt; CreateFunction&amp;lt;T1, T2, TResult&amp;gt;(T1 t1, T2 t2, &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T1, T2, TResult&amp;gt; tResult) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; tResult;&lt;br /&gt;}&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T1, T2, T3, TResult&amp;gt; CreateFunction&amp;lt;T1, T2, T3, TResult&amp;gt;(T1 t1, T2 t2, T3 t3, &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T1, T2, T3, TResult&amp;gt; tResult) {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; tResult;&lt;br /&gt;}&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T1, T2, T3, T4, TResult&amp;gt; CreateFunction&amp;lt;T1, T2, T3, T4, TResult&amp;gt;(T1 t1, T2 t2, T3 t3, T4 t4, &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T1, T2, T3, T4, TResult&amp;gt; tResult) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; tResult;&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;To create the method just pass lambda expression to the argument.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: blue;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt; func = &lt;span style=&quot;color:#2B91AF&quot;&gt;Function2&lt;/span&gt;.CreateFunction(() =&gt; &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; { x = 1, y = 2 });&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You can also create function which its arguments and return type are anonymous type&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: blue;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt; func = &lt;span style=&quot;color:#2B91AF&quot;&gt;Function2&lt;/span&gt;.CreateFunction(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; { Name = &lt;span style=&quot;color:blue&quot;&gt;default&lt;/span&gt;(&lt;span style=&quot;color:blue&quot;&gt;string&lt;/span&gt;), Age = &lt;span style=&quot;color:blue&quot;&gt;default&lt;/span&gt;(&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt;) },&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;default&lt;/span&gt;(&lt;span style=&quot;color:blue&quot;&gt;decimal&lt;/span&gt;),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (person, salary) =&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Name = person.Name,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Age = person.Age,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Salary = salary&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;var&lt;/span&gt; p = func(&lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; { Name = &lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot;Lisa&amp;quot;&lt;/span&gt;, Age = 20 }, 1000000);&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//p = { Name = Lisa, Age = 20, Salary = 1000000 }&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Just pass the empty class to specify type of arguments. Above code is to create function which accept an anonymous type (Name: string, Age: int) and a decimal, the function returns another anonymous type (Name: string, Age: int, Salary: decimal).&lt;br /&gt;&lt;br /&gt;As a bonus here are some more extension methods.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T2, T3, TResult&amp;gt; Partial&amp;lt;T1, T2, T3, TResult&amp;gt;(&lt;span style=&quot;color:blue&quot;&gt;this&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T1, T2, T3, TResult&amp;gt; func, T1 arg1) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; (arg2, arg3) =&amp;gt; func(arg1, arg2, arg3);&lt;br /&gt;}&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T2, T3, T4, TResult&amp;gt; Partial&amp;lt;T1, T2, T3, T4, TResult&amp;gt;(&lt;span style=&quot;color:blue&quot;&gt;this&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T1, T2, T3, T4, TResult&amp;gt; func, T1 arg1) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; (arg2, arg3, arg4) =&amp;gt; func(arg1, arg2, arg3, arg4);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T1, T2, T3, TResult&amp;gt; Memoize&amp;lt;T1, T2, T3, TResult&amp;gt;(&lt;span style=&quot;color:blue&quot;&gt;this&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T1, T2, T3, TResult&amp;gt; func) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;var&lt;/span&gt; dict = &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Dictionary&lt;/span&gt;&amp;lt;T1, &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T2, T3, TResult&amp;gt;&amp;gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; (arg1, arg2, arg3) =&amp;gt; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T2, T3, TResult&amp;gt; value;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;if&lt;/span&gt; (!dict.TryGetValue(arg1, &lt;span style=&quot;color:blue&quot;&gt;out&lt;/span&gt; value)) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; value = func.Partial(arg1).Memoize();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dict.Add(arg1, value);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; value(arg2, arg3);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;br /&gt;}&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T1, T2, T3, T4, TResult&amp;gt; Memoize&amp;lt;T1, T2, T3, T4, TResult&amp;gt;(&lt;span style=&quot;color:blue&quot;&gt;this&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T1, T2, T3, T4, TResult&amp;gt; func) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;var&lt;/span&gt; dict = &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Dictionary&lt;/span&gt;&amp;lt;T1, &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T2, T3, T4, TResult&amp;gt;&amp;gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; (arg1, arg2, arg3, arg4) =&amp;gt; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T2, T3, T4, TResult&amp;gt; value;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;if&lt;/span&gt; (!dict.TryGetValue(arg1, &lt;span style=&quot;color:blue&quot;&gt;out&lt;/span&gt; value)) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; value = func.Partial(arg1).Memoize();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dict.Add(arg1, value);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; value(arg2, arg3, arg4);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T1, T2, T3, TResult&amp;gt; When&amp;lt;T1, T2, T3, TResult&amp;gt;(&lt;span style=&quot;color:blue&quot;&gt;this&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T1, T2, T3, TResult&amp;gt; func, &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T1, T2, T3, &lt;span style=&quot;color:blue&quot;&gt;bool&lt;/span&gt;&amp;gt; predicate, &lt;span style=&quot;color:&lt;br /&gt;#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T1, T2, T3, TResult&amp;gt; alternative) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; (arg1, arg2, arg3) =&amp;gt; predicate(arg1, arg2, arg3) ? alternative(arg1, arg2, arg3) : func(arg1, arg2, arg3);&lt;br /&gt;}&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T1, T2, T3, T4, TResult&amp;gt; When&amp;lt;T1, T2, T3, T4, TResult&amp;gt;(&lt;span style=&quot;color:blue&quot;&gt;this&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T1, T2, T3, T4, TResult&amp;gt; func, &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T1, T2, T3, T4, &lt;span style=&quot;color:blue&quot;&gt;bool&lt;/span&gt;&amp;gt; predicate, &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T1, T2, T3, T4, TResult&amp;gt; alternative) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; (arg1, arg2, arg3, arg4) =&amp;gt; predicate(arg1, arg2, arg3, arg4) ? alternative(arg1, arg2, arg3, arg4) : func(arg1, arg2, arg3, arg4);&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;These are &lt;strong&gt;Parial&lt;/strong&gt;, &lt;strong&gt;Memoize&lt;/strong&gt;, and &lt;strong&gt;When&lt;/strong&gt; functions, which are the same as &lt;a href=&quot;http://chaowchaow.blogspot.com/2008/01/extension-methods-for-delegate-types.html&quot; target=&quot;_blank&quot;&gt;previous post&lt;/a&gt;. You can find detail of functions in previous post. The only difference of these functions and functions in previous post is, these functions accept 3 and 4 arguments.&lt;br /&gt;&lt;br /&gt;Next post, extension methods for math.</content><link rel='replies' type='application/atom+xml' href='http://chaowchaow.blogspot.com/feeds/4954686782321428353/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1350724202700062730/4954686782321428353' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350724202700062730/posts/default/4954686782321428353'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350724202700062730/posts/default/4954686782321428353'/><link rel='alternate' type='text/html' href='http://chaowchaow.blogspot.com/2008/04/extension-methods-for-delegate-types.html' title='Extension Methods for Delegate Types Part II - Passing anonymous type to generic function'/><author><name>Chaow</name><uri>http://www.blogger.com/profile/07962486640447233732</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350724202700062730.post-6935941499869493195</id><published>2008-03-27T11:21:00.004+07:00</published><updated>2008-06-14T10:07:08.071+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="arranger"/><category scheme="http://www.blogger.com/atom/ns#" term="constraint programming"/><title type='text'>Constraint Programming Part VI - River Crossing</title><content type='html'>&lt;a href=&quot;http://en.wikipedia.org/wiki/River_IQ_Test&quot; target=&quot;_blank&quot;&gt;River crossing&lt;/a&gt; is a puzzle, which its objective is to bring all people (father, mother, 2 sons, 2 daughters, police, and thief) crossing a river. With the constriants that:&lt;br /&gt;&lt;br /&gt;- Not more than 2 persons can raft at a time&lt;br /&gt;- Father cannot stay with daughter without mother&lt;br /&gt;- Mother cannot stay with son without father&lt;br /&gt;- Thief cannot stay with any body without police&lt;br /&gt;- Only father, mother, and police can raft&lt;br /&gt;&lt;br /&gt;You can play online game &lt;a href=&quot;http://freeweb.siol.net/danej/riverIQGame.swf&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;To solve this puzzle with arranger class, first, let&#39;s declare the members.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt;[&lt;span style=&quot;color:#2B91AF&quot;&gt;Flags&lt;/span&gt;]&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;enum&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Cross&lt;/span&gt; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Thief = 1,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Police = 2,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Father = 4,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Mother = 8,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Son = 16,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Son2 = 32,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Daughter = 64,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Daughter2 = 128,&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Cross type is flag because, we want to consolidate any combinations of persons into a variable. We can declare allPeople represents all persons in Cross type.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: &amp;quot;Courier New&amp;quot;; color: blue;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt; allPeople = &lt;span style=&quot;color:#2B91AF&quot;&gt;Cross&lt;/span&gt;.Thief | &lt;span style=&quot;color:#2B91AF&quot;&gt;Cross&lt;/span&gt;.Police | &lt;span style=&quot;color:#2B91AF&quot;&gt; Cross&lt;/span&gt;.Father | &lt;span style=&quot;color:#2B91AF&quot;&gt;Cross&lt;/span&gt;.Mother | &lt;span style=&quot;color:#2B91AF&quot;&gt;Cross&lt;/span&gt;.Son | &lt;span style=&quot;color:#2B91AF&quot;&gt;Cross&lt;/span&gt;.Son2 | &lt;span style=&quot;color:#2B91AF&quot;&gt;Cross&lt;/span&gt;.Daughter | &lt;span style=&quot;color:#2B91AF&quot;&gt;Cross&lt;/span&gt;.Daughter2;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;And below function is to switch the presence of persons in combination.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: &amp;quot;Courier New&amp;quot;; color: #2B91AF;&quot;&gt;Func&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt;&amp;lt;&lt;span style=&quot;color:#2B91AF&quot;&gt;Cross&lt;/span&gt;, &lt;span style=&quot;color:#2B91AF&quot;&gt;Cross&lt;/span&gt;&amp;gt; opp = x =&amp;gt; x ^ allPeople;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;To solve this puzzle, we might divid problem into 2 steps, combination of persons of each crossing, and combination of crossing which can solve the puzzle.&lt;br /&gt;&lt;br /&gt;We can declare &lt;strong&gt;custom construction&lt;/strong&gt; of Arranger class by using command e.Arrange(arg1, arg2, arg3). Where e is enumerable. Arg1 is local variable, if you need more than 1 variable, you can combine variables into an anonymous type new {var1, var2}. Arg2 is assignment of new local variable when a new member is added. Arg3 is condition to complete the solution.&lt;br /&gt;&lt;br /&gt;To create Arranger class, represents combination of persons of each crossing:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: blue;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt; crossing = &lt;span style=&quot;color:#2B91AF&quot;&gt;Enumerable2&lt;/span&gt;.Enum&amp;lt;&lt;span style=&quot;color:#2B91AF&quot;&gt;Cross&lt;/span&gt;&amp;gt;().Arrange(&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:green&quot;&gt;//Seed - number of people, and people&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; { Length = 0, Value = (&lt;span style=&quot;color:#2B91AF&quot;&gt;Cross&lt;/span&gt;)0 },&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:green&quot;&gt;//Func - add number of people, add people&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (current, item, i) =&amp;gt; &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; { Length = current.Length + 1, Value = current.Value | item },&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:green&quot;&gt;//Yield - must contains police, father, or mother&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; current =&amp;gt; (current.Value &amp;amp; (&lt;span style=&quot;color:#2B91AF&quot;&gt;Cross&lt;/span&gt;.Police | &lt;span style=&quot;color:#2B91AF&quot;&gt;Cross&lt;/span&gt;.Father | &lt;span style=&quot;color:#2B91AF&quot;&gt;Cross&lt;/span&gt;.Mother)) &amp;gt; 0&lt;br /&gt;);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is custom construction of Arranger class. Arg1 (local variable) is anonymous type of length (number of person) and value (combination of persons). Arg2 (assignment of local variable), current is variable before adding new member, item is new member, and i is index of new member. When new member is added, length is increased by 1, and value is included new member. Arg3, solution will be completed when value contains father, or mother, or police.&lt;br /&gt;&lt;br /&gt;The Arranger class is not finished yet. We must add constraints to the class.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: green;&quot;&gt;//no police-police, and police-thief is the same as thief-police&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt;crossing.ArrangementModel = &lt;span style=&quot;color:#2B91AF&quot;&gt;ArrangementModel&lt;/span&gt;.Combination;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//Answer can be 1 or 2 people on boat&lt;br /&gt;&lt;/span&gt;crossing.ContinueOnYielded = &lt;span style=&quot;color:blue&quot;&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//Stop arranging when there are more than 2 people&lt;br /&gt;&lt;/span&gt;crossing.AppendBreak(current =&amp;gt; current.Length &amp;gt; 2);&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//Thief must be with police&lt;br /&gt;&lt;/span&gt;crossing.AppendConstraint(current =&amp;gt; current.Value == &lt;span style=&quot;color:#2B91AF&quot;&gt;Cross&lt;/span&gt;.Thief, current =&amp;gt; item =&amp;gt; item == &lt;span style=&quot;color:#2B91AF&quot;&gt;Cross&lt;/span&gt;.Police);&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//Father cannot be with daughter&lt;br /&gt;&lt;/span&gt;crossing.AppendConstraint(current =&amp;gt; current.Value == &lt;span style=&quot;color:#2B91AF&quot;&gt;Cross&lt;/span&gt;.Father, current =&amp;gt; item =&amp;gt; item != &lt;span style=&quot;color:#2B91AF&quot;&gt;Cross&lt;/span&gt;.Daughter &amp;amp;&amp;amp; item != &lt;span style=&quot;color:#2B91AF&quot;&gt;Cross&lt;/span&gt;.Daughter2);&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//Mother cannot be with son&lt;br /&gt;&lt;/span&gt;crossing.AppendConstraint(current =&amp;gt; current.Value == &lt;span style=&quot;color:#2B91AF&quot;&gt;Cross&lt;/span&gt;.Mother, current =&amp;gt; item =&amp;gt; item != &lt;span style=&quot;color:#2B91AF&quot;&gt;Cross&lt;/span&gt;.Son &amp;amp;&amp;amp; item != &lt;span style=&quot;color:#2B91AF&quot;&gt;Cross&lt;/span&gt;.Son2);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This arrangement model is combination because, we don&#39;t care the position of persons in raft, &quot;police-thief&quot; is considered the same as &quot;thief-police&quot;. And we cannot repeat a person in raft, such as &quot;police-police&quot; is impossible.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;ContinueOnYield&lt;/strong&gt; is the command to search more members when found a solution. Such as solutions to cross can be either &quot;police&quot;, or &quot;police-thief&quot;.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;AppendBreak&lt;/strong&gt; is command to stop searching. Above, we stop searching when number of members to cross is more than 2.&lt;br /&gt;&lt;br /&gt;You can list all possible crossing combination.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt;crossing.SelectResults(c =&amp;gt; c.Value).ForEach(c =&amp;gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Console&lt;/span&gt;.WriteLine(c));&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//Thief, Police&lt;br /&gt;//Police&lt;br /&gt;//Police, Father&lt;br /&gt;//Police, Mother&lt;br /&gt;//Police, Son&lt;br /&gt;//Police, Son2&lt;br /&gt;//Police, Daughter&lt;br /&gt;//Police, Daughter2&lt;br /&gt;//Father&lt;br /&gt;//Father, Mother&lt;br /&gt;//Father, Son&lt;br /&gt;//Father, Son2&lt;br /&gt;//Mother&lt;br /&gt;//Mother, Daughter&lt;br /&gt;//Mother, Daughter2&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you enumerate Arranger instant directly, you will get enumeration of all possible combinations. But if you enumerate from &lt;strong&gt;SelectResults&lt;/strong&gt;, you will get enumeration of the local variable of the possible combinations.&lt;br /&gt;&lt;br /&gt;Now in step 2, we have to find combination of crossing.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: blue;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt; solutions = crossing.SelectResults(c =&amp;gt; c.Value).Arrange(&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:green&quot;&gt;//Seed - list of people on target&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Cross&lt;/span&gt;[] { 0 },&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:green&quot;&gt;//Func - add/subtract crossing people to/from target&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (list, item, i) =&amp;gt; list.Append(list.Last() ^ item),&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:green&quot;&gt;//Yield - all people on target&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; list =&amp;gt; list.Last() == allPeople&lt;br /&gt;);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In custom construction of Arranger class, arg1 (local variable) is the list of people on target land of each crossing. Arg2 (assignment) is to switch people on target land with the people who is crossing. Arg3 (solution) is people on target land must include all people.&lt;br /&gt;&lt;br /&gt;Next is to append the break case.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: green;&quot;&gt;//Thief cannot be with others without police&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt;solutions.AppendBreak(list =&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ((list.Last() &amp;amp; (&lt;span style=&quot;color:#2B91AF&quot;&gt;Cross&lt;/span&gt;.Thief | &lt;span style=&quot;color:#2B91AF&quot;&gt;Cross&lt;/span&gt;.Police)) == &lt;span style=&quot;color:#2B91AF&quot;&gt;Cross&lt;/span&gt;.Thief) &amp;amp;&amp;amp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (list.Last() != &lt;span style=&quot;color:#2B91AF&quot;&gt;Cross&lt;/span&gt;.Thief)&lt;br /&gt;);&lt;br /&gt;solutions.AppendBreak(list =&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ((list.Last() &amp;amp; (&lt;span style=&quot;color:#2B91AF&quot;&gt;Cross&lt;/span&gt;.Thief | &lt;span style=&quot;color:#2B91AF&quot;&gt;Cross&lt;/span&gt;.Police)) == &lt;span style=&quot;color:#2B91AF&quot;&gt;Cross&lt;/span&gt;.Police) &amp;amp;&amp;amp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (opp(list.Last()) != &lt;span style=&quot;color:#2B91AF&quot;&gt;Cross&lt;/span&gt;.Thief)&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//Son cannot be with mother without father&lt;br /&gt;&lt;/span&gt;solutions.AppendBreak(list =&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ((list.Last() &amp;amp; (&lt;span style=&quot;color:#2B91AF&quot;&gt;Cross&lt;/span&gt;.Father | &lt;span style=&quot;color:#2B91AF&quot;&gt;Cross&lt;/span&gt;.Mother)) == &lt;span style=&quot;color:#2B91AF&quot;&gt;Cross&lt;/span&gt;.Mother) &amp;amp;&amp;amp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ((list.Last() &amp;amp; (&lt;span style=&quot;color:#2B91AF&quot;&gt;Cross&lt;/span&gt;.Son | &lt;span style=&quot;color:#2B91AF&quot;&gt;Cross&lt;/span&gt;.Son2)) &amp;gt; 0)&lt;br /&gt;);&lt;br /&gt;solutions.AppendBreak(list =&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ((list.Last() &amp;amp; (&lt;span style=&quot;color:#2B91AF&quot;&gt;Cross&lt;/span&gt;.Father | &lt;span style=&quot;color:#2B91AF&quot;&gt;Cross&lt;/span&gt;.Mother)) == &lt;span style=&quot;color:#2B91AF&quot;&gt;Cross&lt;/span&gt;.Father) &amp;amp;&amp;amp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ((opp(list.Last()) &amp;amp; (&lt;span style=&quot;color:#2B91AF&quot;&gt;Cross&lt;/span&gt;.Son | &lt;span style=&quot;color:#2B91AF&quot;&gt;Cross&lt;/span&gt;.Son2)) &amp;gt; 0)&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//Daughter cannot be with father without mother&lt;br /&gt;&lt;/span&gt;solutions.AppendBreak(list =&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ((list.Last() &amp;amp; (&lt;span style=&quot;color:#2B91AF&quot;&gt;Cross&lt;/span&gt;.Father | &lt;span style=&quot;color:#2B91AF&quot;&gt;Cross&lt;/span&gt;.Mother)) == &lt;span style=&quot;color:#2B91AF&quot;&gt;Cross&lt;/span&gt;.Father) &amp;amp;&amp;amp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ((list.Last() &amp;amp; (&lt;span style=&quot;color:#2B91AF&quot;&gt;Cross&lt;/span&gt;.Daughter | &lt;span style=&quot;color:#2B91AF&quot;&gt;Cross&lt;/span&gt;.Daughter2)) &amp;gt; 0)&lt;br /&gt;);&lt;br /&gt;solutions.AppendBreak(list =&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ((list.Last() &amp;amp; (&lt;span style=&quot;color:#2B91AF&quot;&gt;Cross&lt;/span&gt;.Father | &lt;span style=&quot;color:#2B91AF&quot;&gt;Cross&lt;/span&gt;.Mother)) == &lt;span style=&quot;color:#2B91AF&quot;&gt;Cross&lt;/span&gt;.Mother) &amp;amp;&amp;amp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ((opp(list.Last()) &amp;amp; (&lt;span style=&quot;color:#2B91AF&quot;&gt;Cross&lt;/span&gt;.Daughter | &lt;span style=&quot;color:#2B91AF&quot;&gt;Cross&lt;/span&gt;.Daughter2)) &amp;gt; 0)&lt;br /&gt;);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We don&#39;t care who is crossing. But if the crossing makes conflict in constraints, we will stop searching. Above, we stop searching if thief be with any persons without police, father be with daughter without mother, and mother be with son without father.&lt;br /&gt;&lt;br /&gt;Now add more constraints.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: green;&quot;&gt;//Cannot cross back&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt;solutions.AppendConstraint(list =&amp;gt; list.Length % 2 == 0, list =&amp;gt; item =&amp;gt; !list.Any((x, i) =&amp;gt; (i % 2 == 0) &amp;amp;&amp;amp; (x == (list.Last() ^ item))));&lt;br /&gt;solutions.AppendConstraint(list =&amp;gt; list.Length % 2 == 1, list =&amp;gt; item =&amp;gt; !list.Any((x, i) =&amp;gt; (i % 2 == 1) &amp;amp;&amp;amp; (x == (list.Last() ^ item))));&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//Must have people to cross&lt;br /&gt;&lt;/span&gt;solutions.AppendConstraint(list =&amp;gt; list.Length % 2 == 0, list =&amp;gt; item =&amp;gt; (list.Last() &amp;amp; item) == item);&lt;br /&gt;solutions.AppendConstraint(list =&amp;gt; list.Length % 2 == 1, list =&amp;gt; item =&amp;gt; (~list.Last() &amp;amp; item) == item);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We now add 2 constraints. First constraint is to prevent cycle crossing by checking if the crossing create duplicate combination of people on target land. Second constraint is to limit people who are crossing must be available on the side which the raft is on.&lt;br /&gt;&lt;br /&gt;All constraints are assigned. Then we output the result.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt;solutions.SelectResults().First().ForEach(x =&amp;gt; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:#2B91AF&quot;&gt;Console&lt;/span&gt;.WriteLine(opp(x));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:#2B91AF&quot;&gt;Console&lt;/span&gt;.WriteLine(x);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:#2B91AF&quot;&gt;Console&lt;/span&gt;.WriteLine(&lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot;=============================================================&amp;quot;&lt;/span&gt;);&lt;br /&gt;});&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//Thief, Police, Father, Mother, Son, Son2, Daughter, Daughter2&lt;br /&gt;//0&lt;br /&gt;//=============================================================&lt;br /&gt;//Father, Mother, Son, Son2, Daughter, Daughter2&lt;br /&gt;//Thief, Police&lt;br /&gt;//=============================================================&lt;br /&gt;//Police, Father, Mother, Son, Son2, Daughter, Daughter2&lt;br /&gt;//Thief&lt;br /&gt;//=============================================================&lt;br /&gt;//Father, Mother, Son2, Daughter, Daughter2&lt;br /&gt;//Thief, Police, Son&lt;br /&gt;//=============================================================&lt;br /&gt;//Thief, Police, Father, Mother, Son2, Daughter, Daughter2&lt;br /&gt;//Son&lt;br /&gt;//=============================================================&lt;br /&gt;//Thief, Police, Mother, Daughter, Daughter2&lt;br /&gt;//Father, Son, Son2&lt;br /&gt;//=============================================================&lt;br /&gt;//Thief, Police, Father, Mother, Daughter, Daughter2&lt;br /&gt;//Son, Son2&lt;br /&gt;//=============================================================&lt;br /&gt;//Thief, Police, Daughter, Daughter2&lt;br /&gt;//Father, Mother, Son, Son2&lt;br /&gt;//=============================================================&lt;br /&gt;//Thief, Police, Mother, Daughter, Daughter2&lt;br /&gt;//Father, Son, Son2&lt;br /&gt;//=============================================================&lt;br /&gt;//Mother, Daughter, Daughter2&lt;br /&gt;//Thief, Police, Father, Son, Son2&lt;br /&gt;//=============================================================&lt;br /&gt;//Father, Mother, Daughter, Daughter2&lt;br /&gt;//Thief, Police, Son, Son2&lt;br /&gt;//=============================================================&lt;br /&gt;//Daughter, Daughter2&lt;br /&gt;//Thief, Police, Father, Mother, Son, Son2&lt;br /&gt;//=============================================================&lt;br /&gt;//Mother, Daughter, Daughter2&lt;br /&gt;//Thief, Police, Father, Son, Son2&lt;br /&gt;//=============================================================&lt;br /&gt;//Daughter2&lt;br /&gt;//Thief, Police, Father, Mother, Son, Son2, Daughter&lt;br /&gt;//=============================================================&lt;br /&gt;//Thief, Police, Daughter2&lt;br /&gt;//Father, Mother, Son, Son2, Daughter&lt;br /&gt;//=============================================================&lt;br /&gt;//Thief&lt;br /&gt;//Police, Father, Mother, Son, Son2, Daughter, Daughter2&lt;br /&gt;//=============================================================&lt;br /&gt;//Thief, Police&lt;br /&gt;//Father, Mother, Son, Son2, Daughter, Daughter2&lt;br /&gt;//=============================================================&lt;br /&gt;//0&lt;br /&gt;//Thief, Police, Father, Mother, Son, Son2, Daughter, Daughter2&lt;br /&gt;//=============================================================&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Next post, we will find more extension for delegate types.</content><link rel='replies' type='application/atom+xml' href='http://chaowchaow.blogspot.com/feeds/6935941499869493195/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1350724202700062730/6935941499869493195' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350724202700062730/posts/default/6935941499869493195'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350724202700062730/posts/default/6935941499869493195'/><link rel='alternate' type='text/html' href='http://chaowchaow.blogspot.com/2008/03/constraint-programming-part-vi-river.html' title='Constraint Programming Part VI - River Crossing'/><author><name>Chaow</name><uri>http://www.blogger.com/profile/07962486640447233732</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350724202700062730.post-3131813943119298444</id><published>2008-03-20T13:28:00.003+07:00</published><updated>2008-06-14T10:07:08.071+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="arranger"/><category scheme="http://www.blogger.com/atom/ns#" term="constraint programming"/><category scheme="http://www.blogger.com/atom/ns#" term="linq"/><title type='text'>Constraint Programming Part V - Einstein&#39;s Puzzle</title><content type='html'>There are 5 houses, which each house is different colors, different nationalities, different pets, different drinks, and different cigarettes.&lt;br /&gt;&lt;br /&gt;And here are the constraints&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The British lives in the red house. &lt;/li&gt;&lt;li&gt;The Swedish keeps dogs as pets. &lt;/li&gt;&lt;li&gt;The Danish drinks tea. &lt;/li&gt;&lt;li&gt;The green house is on the left of the white house. &lt;/li&gt;&lt;li&gt;The green homeowner drinks coffee. &lt;/li&gt;&lt;li&gt;The person who smokes Pall Mall rears birds. &lt;/li&gt;&lt;li&gt;The owner of the yellow house smokes Dunhill. &lt;/li&gt;&lt;li&gt;The man living in the center house drinks milk. &lt;/li&gt;&lt;li&gt;The Norwegian lives in the first house. &lt;/li&gt;&lt;li&gt;The man who smokes Blend lives next to the one who keeps cats. &lt;/li&gt;&lt;li&gt;The man who keeps the horse lives next to the man who smokes Dunhill.&lt;/li&gt;&lt;li&gt;The owner who smokes Bluemaster drinks beer. &lt;/li&gt;&lt;li&gt;The German smokes prince. &lt;/li&gt;&lt;li&gt;The Norwegian lives next to the blue house. &lt;/li&gt;&lt;li&gt;The man who smokes Blend has a neighbor who drinks water. &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Question is who own the &lt;strong&gt;fish&lt;/strong&gt;?&lt;br /&gt;&lt;br /&gt;You can try to solve yourself. Only 2% of people can solve this puzzle.&lt;br /&gt;&lt;br /&gt;For solving by constraint programming, first, is to create the types.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: blue;&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt; &lt;span style=&quot;color:blue&quot;&gt;enum&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Nationality&lt;/span&gt; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; British,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Swedish,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Danish,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Norwegian,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; German,&lt;br /&gt;}&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;enum&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;HouseColor&lt;/span&gt; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Red,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Green,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; White,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Yellow,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Blue,&lt;br /&gt;}&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;enum&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Smoke&lt;/span&gt; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PallMall,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DunHill,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Blend,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; BlueMaster,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Prince,&lt;br /&gt;}&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;enum&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Drink&lt;/span&gt; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Tea,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Coffee,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Milk,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Beer,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Water,&lt;br /&gt;}&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;enum&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Pet&lt;/span&gt; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dog,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Bird,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Cat,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Horse,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Fish,&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Then we split questions into 2 groups. First group is questions about properties of a single house. Second group is questions about properties between houses.&lt;br /&gt;&lt;br /&gt;Here is the first group of questions.&lt;br /&gt;&lt;br /&gt;- The British lives in the red house. &lt;br /&gt;- The Swedish keeps dogs as pets. &lt;br /&gt;- The Danish drinks tea. &lt;br /&gt;- The green homeowner drinks coffee. &lt;br /&gt;- The person who smokes Pall Mall rears birds. &lt;br /&gt;- The owner of the yellow house smokes Dunhill. &lt;br /&gt;- The owner who smokes Bluemaster drinks beer. &lt;br /&gt;- The German smokes prince. &lt;br /&gt;&lt;br /&gt;You can solve above properties by using linq.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: blue;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt; men = &lt;span style=&quot;color:blue&quot;&gt;from&lt;/span&gt; n &lt;span style=&quot;color:blue&quot;&gt;in&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Enumerable2&lt;/span&gt;.Enum&amp;lt;&lt;span style=&quot;color:#2B91AF&quot;&gt;Nationality&lt;/span&gt;&amp;gt;()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;from&lt;/span&gt; c &lt;span style=&quot;color:blue&quot;&gt;in&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Enumerable2&lt;/span&gt;.Enum&amp;lt;&lt;span style=&quot;color:#2B91AF&quot;&gt;HouseColor&lt;/span&gt;&amp;gt;()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;where&lt;/span&gt; (n == &lt;span style=&quot;color:#2B91AF&quot;&gt;Nationality&lt;/span&gt;.British) == (c == &lt;span style=&quot;color:#2B91AF&quot;&gt;HouseColor&lt;/span&gt;.Red)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;from&lt;/span&gt; s &lt;span style=&quot;color:blue&quot;&gt;in&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Enumerable2&lt;/span&gt;.Enum&amp;lt;&lt;span style=&quot;color:#2B91AF&quot;&gt;Smoke&lt;/span&gt;&amp;gt;()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;where&lt;/span&gt; (n == &lt;span style=&quot;color:#2B91AF&quot;&gt;Nationality&lt;/span&gt;.German) == (s == &lt;span style=&quot;color:#2B91AF&quot;&gt;Smoke&lt;/span&gt;.Prince)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;where&lt;/span&gt; (c == &lt;span style=&quot;color:#2B91AF&quot;&gt;HouseColor&lt;/span&gt;.Yellow) == (s == &lt;span style=&quot;color:#2B91AF&quot;&gt;Smoke&lt;/span&gt;.DunHill)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:blue&quot;&gt;from&lt;/span&gt; d &lt;span style=&quot;color:blue&quot;&gt;in&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Enumerable2&lt;/span&gt;.Enum&amp;lt;&lt;span style=&quot;color:#2B91AF&quot;&gt;Drink&lt;/span&gt;&amp;gt;()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;where&lt;/span&gt; (n == &lt;span style=&quot;color:#2B91AF&quot;&gt;Nationality&lt;/span&gt;.Danish) == (d == &lt;span style=&quot;color:#2B91AF&quot;&gt;Drink&lt;/span&gt;.Tea)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;where&lt;/span&gt; (c == &lt;span style=&quot;color:#2B91AF&quot;&gt;HouseColor&lt;/span&gt;.Green) == (d == &lt;span style=&quot;color:#2B91AF&quot;&gt;Drink&lt;/span&gt;.Coffee)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;where&lt;/span&gt; (s == &lt;span style=&quot;color:#2B91AF&quot;&gt;Smoke&lt;/span&gt;.BlueMaster) == (d == &lt;span style=&quot;color:#2B91AF&quot;&gt;Drink&lt;/span&gt;.Beer)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;from&lt;/span&gt; p &lt;span style=&quot;color:blue&quot;&gt;in&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Enumerable2&lt;/span&gt;.Enum&amp;lt;&lt;span style=&quot;color:#2B91AF&quot;&gt;Pet&lt;/span&gt;&amp;gt;()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;where&lt;/span&gt; (n == &lt;span style=&quot;color:#2B91AF&quot;&gt;Nationality&lt;/span&gt;.Swedish) == (p == &lt;span style=&quot;color:#2B91AF&quot;&gt;Pet&lt;/span&gt;.Dog)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;where&lt;/span&gt; (s == &lt;span style=&quot;color:#2B91AF&quot;&gt;Smoke&lt;/span&gt;.PallMall) == (p == &lt;span style=&quot;color:#2B91AF&quot;&gt;Pet&lt;/span&gt;.Bird)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;select&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Nationality = n,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HouseColor = c,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Smoke = s,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Drink = d,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Pet = p&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;By using above expression 5^5 combinations of properties are reduced to only 78 combinations of properties. You can get Count by&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: &amp;quot;Courier New&amp;quot;; color: #2B91AF;&quot;&gt;Console&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt;.WriteLine(men.Count());&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//78&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;And for remaining constraints can be solved by Arranger class.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: green;&quot;&gt;//Generate solution&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: blue;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt; solutions = men.Arrange(5);&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//New guy must not has same properties as persons in sequence&lt;br /&gt;&lt;/span&gt;solutions.AppendConstraint(seq =&amp;gt; seq.Any(),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; seq =&amp;gt; man =&amp;gt; seq.All(x =&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x.Nationality != man.Nationality &amp;amp;&amp;amp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x.HouseColor != man.HouseColor &amp;amp;&amp;amp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x.Smoke != man.Smoke &amp;amp;&amp;amp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x.Drink != man.Drink &amp;amp;&amp;amp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x.Pet != man.Pet&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; )&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//Norwegian lives in the first house.&lt;br /&gt;&lt;/span&gt;solutions.AppendConstraint(seq =&amp;gt; seq.Length == 0,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; seq =&amp;gt; man =&amp;gt; man.Nationality == &lt;span style=&quot;color:#2B91AF&quot;&gt;Nationality&lt;/span&gt;.Norwegian&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//Guy who drinks milk lives in the third house&lt;br /&gt;&lt;/span&gt;solutions.AppendConstraint(seq =&amp;gt; seq.Length &amp;lt;= 2,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; seq =&amp;gt; man =&amp;gt; (seq.Length == 2) == (man.Drink == &lt;span style=&quot;color:#2B91AF&quot;&gt;Drink&lt;/span&gt;.Milk)&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//White house is next to green house&lt;br /&gt;&lt;/span&gt;solutions.AppendConstraint(seq =&amp;gt; seq.Any(),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; seq =&amp;gt; man =&amp;gt; (seq.Last().HouseColor == &lt;span style=&quot;color:#2B91AF&quot;&gt;HouseColor&lt;/span&gt;.Green) == (man.HouseColor == &lt;span style=&quot;color:#2B91AF&quot;&gt;HouseColor&lt;/span&gt;.White)&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//Guy who pets cat is neighbor with guy who smokes Blend&lt;br /&gt;&lt;/span&gt;solutions.AppendConstraint(seq =&amp;gt; seq.Count(x =&amp;gt; x.Pet == &lt;span style=&quot;color:#2B91AF&quot;&gt;Pet&lt;/span&gt;.Cat || x.Smoke == &lt;span style=&quot;color:#2B91AF&quot;&gt;Smoke&lt;/span&gt;.Blend) == 1,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; seq =&amp;gt; man =&amp;gt; (man.Pet == &lt;span style=&quot;color:#2B91AF&quot;&gt;Pet&lt;/span&gt;.Cat) || (man.Smoke == &lt;span style=&quot;color:#2B91AF&quot;&gt;Smoke&lt;/span&gt;.Blend)&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//Guy who pets horse is neighbor with guy who smokes DunHill&lt;br /&gt;&lt;/span&gt;solutions.AppendConstraint(seq =&amp;gt; seq.Count(x =&amp;gt; x.Pet == &lt;span style=&quot;color:#2B91AF&quot;&gt;Pet&lt;/span&gt;.Horse || x.Smoke == &lt;span style=&quot;color:#2B91AF&quot;&gt;Smoke&lt;/span&gt;.DunHill) == 1,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; seq =&amp;gt; man =&amp;gt; (man.Pet == &lt;span style=&quot;color:#2B91AF&quot;&gt;Pet&lt;/span&gt;.Horse) || (man.Smoke == &lt;span style=&quot;color:#2B91AF&quot;&gt;Smoke&lt;/span&gt;.DunHill)&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//Norwegian is neighbor with guy lives in blue house&lt;br /&gt;&lt;/span&gt;solutions.AppendConstraint(seq =&amp;gt; seq.Count(x =&amp;gt; x.Nationality == &lt;span style=&quot;color:#2B91AF&quot;&gt;Nationality&lt;/span&gt;.Norwegian || x.HouseColor == &lt;span style=&quot;color:#2B91AF&quot;&gt;HouseColor&lt;/span&gt;.Blue) == 1,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; seq =&amp;gt; man =&amp;gt; (man.Nationality == &lt;span style=&quot;color:#2B91AF&quot;&gt;Nationality&lt;/span&gt;.Norwegian) || (man.HouseColor == &lt;span style=&quot;color:#2B91AF&quot;&gt;HouseColor&lt;/span&gt;.Blue)&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//Guy who drinks water is neighbor with guy who smokes Blend&lt;br /&gt;&lt;/span&gt;solutions.AppendConstraint(seq =&amp;gt; seq.Count(x =&amp;gt; x.Drink == &lt;span style=&quot;color:#2B91AF&quot;&gt;Drink&lt;/span&gt;.Water || x.Smoke == &lt;span style=&quot;color:#2B91AF&quot;&gt;Smoke&lt;/span&gt;.Blend) == 1,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; seq =&amp;gt; man =&amp;gt; (man.Drink == &lt;span style=&quot;color:#2B91AF&quot;&gt;Drink&lt;/span&gt;.Water) || (man.Smoke == &lt;span style=&quot;color:#2B91AF&quot;&gt;Smoke&lt;/span&gt;.Blend)&lt;br /&gt;);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;And this is the answer.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;&quot;&gt;solutions.First().ForEach(&lt;span style=&quot;color:#2B91AF&quot;&gt;Console&lt;/span&gt;.WriteLine);&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//{ Nationality = Norwegian, HouseColor = Yellow, Smoke = DunHill, Drink = Water, Pet = Cat }&lt;br /&gt;//{ Nationality = Danish, HouseColor = Blue, Smoke = Blend, Drink = Tea, Pet = Horse }&lt;br /&gt;//{ Nationality = British, HouseColor = Red, Smoke = PallMall, Drink = Milk, Pet = Bird }&lt;br /&gt;//{ Nationality = German, HouseColor = Green, Smoke = Prince, Drink = Coffee, Pet = Fish }&lt;br /&gt;//{ Nationality = Swedish, HouseColor = White, Smoke = BlueMaster, Drink = Beer, Pet = Dog }&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Next is last part of constraint programming. We will learn to use Arranger class to solve questions with unknown length of solution. The question is river crossing.</content><link rel='replies' type='application/atom+xml' href='http://chaowchaow.blogspot.com/feeds/3131813943119298444/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1350724202700062730/3131813943119298444' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350724202700062730/posts/default/3131813943119298444'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350724202700062730/posts/default/3131813943119298444'/><link rel='alternate' type='text/html' href='http://chaowchaow.blogspot.com/2008/03/constraint-programming-part-v-einsteins.html' title='Constraint Programming Part V - Einstein&#39;s Puzzle'/><author><name>Chaow</name><uri>http://www.blogger.com/profile/07962486640447233732</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350724202700062730.post-4090429053977140577</id><published>2008-03-06T15:44:00.003+07:00</published><updated>2008-06-14T10:07:08.071+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="arranger"/><category scheme="http://www.blogger.com/atom/ns#" term="constraint programming"/><category scheme="http://www.blogger.com/atom/ns#" term="linq"/><title type='text'>Constraint Programming Part IV - LINQ</title><content type='html'>&lt;a href=&quot;http://en.wikipedia.org/wiki/Language_Integrated_Query&quot; target=&quot;_blank&quot;&gt;LINQ&lt;/a&gt; is a set of operators to query enumerable data. To query even numbers from set of 1 to 10, you may write:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: blue;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New&quot;&gt; even = &lt;span style=&quot;color:blue&quot;&gt;from&lt;/span&gt; x &lt;span style=&quot;color:blue&quot;&gt;in&lt;/span&gt; 1.To(10)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;where&lt;/span&gt; x % 2 == 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;select&lt;/span&gt; x;&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//even = {2, 4, 6, 8, 10}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;With using of LINQ, you can also do constraint programming. You can use &quot;&lt;strong&gt;from&lt;/strong&gt;&quot; operator to join next member. You can append constraint by using &quot;&lt;strong&gt;where&lt;/strong&gt;&quot; operator. And you can declare new variables by using &quot;&lt;strong&gt;let&lt;/strong&gt;&quot; operator.&lt;br /&gt;&lt;br /&gt;As an example, if you want to solve &lt;em&gt;SEND + MORE = MONEY&lt;/em&gt;. Each letter represents a digit and there is no duplicated number among the letters. To solve this question, you may write:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New; color: blue;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt; solutions = &lt;span style=&quot;color:blue&quot;&gt;from&lt;/span&gt; d &lt;span style=&quot;color:blue&quot;&gt;in&lt;/span&gt; 0.To(9)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;from&lt;/span&gt; e &lt;span style=&quot;color:blue&quot;&gt;in&lt;/span&gt; 0.To(9).Except(&lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt;[] { d })&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;from&lt;/span&gt; y &lt;span style=&quot;color:blue&quot;&gt;in&lt;/span&gt; 0.To(9).Except(&lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt;[] { d, e })&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;where&lt;/span&gt; (d + e) % 10 == y&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;from&lt;/span&gt; n &lt;span style=&quot;color:blue&quot;&gt;in&lt;/span&gt; 0.To(9).Except(&lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt;[] { d, e, y })&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;from&lt;/span&gt; r &lt;span style=&quot;color:blue&quot;&gt;in&lt;/span&gt; 0.To(9).Except(&lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt;[] { d, e, y, n })&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;let&lt;/span&gt; nd = n * 10 + d&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;let&lt;/span&gt; re = r * 10 + e&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;let&lt;/span&gt; ey = e * 10 + y&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:blue&quot;&gt;where&lt;/span&gt; (nd + re) % 100 == ey&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;from&lt;/span&gt; o &lt;span style=&quot;color:blue&quot;&gt;in&lt;/span&gt; 0.To(9).Except(&lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt;[] { d, e, y, n, r })&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;let&lt;/span&gt; end = e * 100 + nd&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;let&lt;/span&gt; ore = o * 100 + re&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;let&lt;/span&gt; ney = n * 100 + ey&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;where&lt;/span&gt; (end + ore) % 1000 == ney&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;from&lt;/span&gt; s &lt;span style=&quot;color:blue&quot;&gt;in&lt;/span&gt; 1.To(9).Except(&lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt;[] { d, e, y, n, r, o })&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;from&lt;/span&gt; m &lt;span style=&quot;color:blue&quot;&gt;in&lt;/span&gt; 1.To(9).Except(&lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt;[] { d, e, y, n, r, o, s })&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;where&lt;/span&gt; s * 1000 + end + m * 1000 + ore == m * 10000 + o * 1000 + ney&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color:blue&quot;&gt;select&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; { s, e, n, d, m, o, r, y };&lt;br /&gt;solutions.ForEach(&lt;span style=&quot;color:#2B91AF&quot;&gt;Console&lt;/span&gt;.WriteLine);&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//{ s = 9, e = 5, n = 6, d = 7, m = 1, o = 0, r = 8, y = 2 }&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The code above solves from last digit to the first digit. To translate the code, first block is to process last digit. &lt;em&gt;D&lt;/em&gt;, &lt;em&gt;E&lt;/em&gt;, and &lt;em&gt;Y&lt;/em&gt; is a number in 0 to 9. &lt;strong&gt;Except&lt;/strong&gt; method makes all letters are not duplicated. And there is a contraint that, &lt;em&gt;D&lt;/em&gt; + &lt;em&gt;E&lt;/em&gt; last digit must be &lt;em&gt;Y&lt;/em&gt;. Upto this point, all solutions that &lt;em&gt;D&lt;/em&gt; + &lt;em&gt;E&lt;/em&gt;, last digit is not &lt;em&gt;Y&lt;/em&gt;, will be filtered out.&lt;br /&gt;&lt;br /&gt;Second block is to process last 2 digits, &lt;em&gt;N&lt;/em&gt; and &lt;em&gt;R&lt;/em&gt; is a number in 0 to 9 with no duplication. And now 3 variables are declared &lt;em&gt;ND&lt;/em&gt;, &lt;em&gt;RE&lt;/em&gt;, and &lt;em&gt;EY&lt;/em&gt;. &lt;em&gt;ND&lt;/em&gt; represents 2 digit number &lt;em&gt;N&lt;/em&gt; and &lt;em&gt;D&lt;/em&gt;, and the same for &lt;em&gt;RE&lt;/em&gt; and &lt;em&gt;EY&lt;/em&gt;. And there is a constraint &lt;em&gt;ND&lt;/em&gt; + &lt;em&gt;RE&lt;/em&gt;, last 2 digits must be &lt;em&gt;EY&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;Third block, is the same as second block, but is to precess last 3 digit. &lt;em&gt;O&lt;/em&gt; is a number in 0 to 9 with no duplication. &lt;em&gt;END&lt;/em&gt; + &lt;em&gt;ORE&lt;/em&gt;, last 3 digits must be &lt;em&gt;NEY&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;Fourth block is to find the solution. &lt;em&gt;S&lt;/em&gt; and &lt;em&gt;M&lt;/em&gt; is a number in 1 to 9, first digit cannot be 0. And &lt;em&gt;SEND&lt;/em&gt; + &lt;em&gt;MORE&lt;/em&gt; must be equal to &lt;em&gt;MONEY&lt;/em&gt;. Then select the result.&lt;br /&gt;&lt;br /&gt;Now compare LINQ code with using arranger class.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: #2B91AF;&quot;&gt;Func&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt;&amp;lt;&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt;, &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt;, &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt;, &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt;, &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt;&amp;gt; mix = (a, b, c, d) =&amp;gt; a * 1000 + b * 100 + c * 10 + d;&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; D = 0, E = 1, Y = 2, N = 3, R = 4, O = 5, S = 6, M = 7;&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;var&lt;/span&gt; sol = 0.To(9).Arrange(8);&lt;br /&gt;sol.ArrangementModel = &lt;span style=&quot;color:#2B91AF&quot;&gt;ArrangementModel&lt;/span&gt;.Permutation;&lt;br /&gt;sol.AppendConstraint(set =&amp;gt; set.Length == Y, set =&amp;gt; y =&amp;gt; (set[D] + set[E]) % 10 == y);&lt;br /&gt;&lt;br /&gt;sol.AppendConstraint(set =&amp;gt; set.Length == R, set =&amp;gt; r =&amp;gt; (mix(0, 0, set[N], set[D]) + mix(0, 0, r, set[E])) % 100 == mix(0, 0, set[E], set[Y]));&lt;br /&gt;sol.AppendConstraint(set =&amp;gt; set.Length == O, set =&amp;gt; o =&amp;gt; (mix(0, set[E], set[N], set[D]) + mix(0, o, set[R], set[E])) % 1000 == mix(0, set[N], set[E], set[Y]));&lt;br /&gt;&lt;br /&gt;sol.AppendConstraint(set =&amp;gt; set.Length == S, set =&amp;gt; s =&amp;gt; s != 0);&lt;br /&gt;sol.AppendConstraint(set =&amp;gt; set.Length == M, set =&amp;gt; m =&amp;gt; m != 0);&lt;br /&gt;sol.AppendConstraint(set =&amp;gt; set.Length == M, set =&amp;gt; m =&amp;gt; mix(set[S], set[E], set[N], set[D]) + mix(m, set[O], set[R], set[E]) == m * 10000 + mix(set[O], set[N], set[E], set[Y]));&lt;br /&gt;&lt;br /&gt;sol.SelectResults(set =&amp;gt; &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; { s = set[S], e = set[E], n = set[N], d = set[D], m = set[M], o = set[O], r = set[R], y = set[Y] })&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .ForEach(&lt;span style=&quot;color:#2B91AF&quot;&gt;Console&lt;/span&gt;.WriteLine);&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//{ s = 9, e = 5, n = 6, d = 7, m = 1, o = 0, r = 8, y = 2 }&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The code is much more confusing. To translate code above, &lt;em&gt;mix&lt;/em&gt; function is function to join digits together. Arragement model is permutation, because each letter cannot be duplicated. First constraint, processed when get &lt;em&gt;Y&lt;/em&gt;, &lt;em&gt;D&lt;/em&gt; + &lt;em&gt;E&lt;/em&gt;, last digit is &lt;em&gt;Y&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;Second constraint, processed when get &lt;em&gt;R&lt;/em&gt;, &lt;em&gt;ND&lt;/em&gt; + &lt;em&gt;RE&lt;/em&gt;, last 2 digits must be &lt;em&gt;EY&lt;/em&gt;. Third constraint, processed when get &lt;em&gt;O&lt;/em&gt;, &lt;em&gt;END&lt;/em&gt; + &lt;em&gt;ORE&lt;/em&gt;, last 3 digits must be &lt;em&gt;NEY&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;Fouth and fifth constraint, processed when get &lt;em&gt;S&lt;/em&gt; and &lt;em&gt;M&lt;/em&gt;, &lt;em&gt;S&lt;/em&gt; and &lt;em&gt;M&lt;/em&gt; must not equal to 0. Last constraint, processed when get the last member &lt;em&gt;M&lt;/em&gt;. &lt;em&gt;SEND&lt;/em&gt; + &lt;em&gt;MORE&lt;/em&gt; must be equal to &lt;em&gt;MONEY&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;To solve a constraint satisfaction problem, sometimes, when each constraint is applied to only one member, solving the problem using LINQ is better. But if constraints are applied to all members like 8 queens or sudoku, using Arranger class is better.&lt;br /&gt;&lt;br /&gt;Next, we will solve problem with using LINQ and arranger in combination. The problem is Einstein&#39;s puzzle.</content><link rel='replies' type='application/atom+xml' href='http://chaowchaow.blogspot.com/feeds/4090429053977140577/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1350724202700062730/4090429053977140577' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350724202700062730/posts/default/4090429053977140577'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350724202700062730/posts/default/4090429053977140577'/><link rel='alternate' type='text/html' href='http://chaowchaow.blogspot.com/2008/03/constraint-programming-part-iv-linq.html' title='Constraint Programming Part IV - LINQ'/><author><name>Chaow</name><uri>http://www.blogger.com/profile/07962486640447233732</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350724202700062730.post-1556529813930190271</id><published>2008-02-29T16:37:00.003+07:00</published><updated>2008-06-14T10:07:08.072+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="arranger"/><category scheme="http://www.blogger.com/atom/ns#" term="constraint programming"/><title type='text'>Constraint Programming Part III - Sudoku</title><content type='html'>&lt;a href=&quot;http://en.wikipedia.org/wiki/Sudoku&quot; target=&quot;_blank&quot;&gt;Sudoku&lt;/a&gt; is a puzzle with the objective to fill number 1 to 9 into 9x9 table, with the constraints that, each row, each column, and each 3x3 block, cannot contain duplicated members.&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://upload.wikimedia.org/wikipedia/en/thumb/f/ff/Sudoku-by-L2G-20050714.svg/250px-Sudoku-by-L2G-20050714.svg.png&quot;/&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New&quot;&gt;&lt;em&gt;(image from &lt;a href=&quot;http://en.wikipedia.org/wiki/Sudoku&quot; target=&quot;_blank&quot;&gt;wikipedia&lt;/a&gt;)&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Source for Sudoku class you can download from &lt;a href=&quot;http://chaowchaow.googlepages.com/Sudoku.cs&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;. The source of Sudoku table is array of integer, named &quot;table&quot;.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New; color: blue&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New&quot;&gt;[] table&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The size of array is 81, index 0-8 represents each cell in the first row, 9-17 for the second row, and so on. Following functions are to convert index to row, column, and grid number.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New; color: blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;font-size: 10.0pt; font-family: Courier New&quot;&gt;&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; getRow(&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; x) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; x / 9;&lt;br /&gt;}&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; getCol(&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; x) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; x % 9;&lt;br /&gt;}&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; getGrid(&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; x) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; (getRow(x) / 3) * 3 + (getCol(x) / 3);&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;And this function is to test whether 2 input arguments are in the same row, or column or grid.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New; color: blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;font-size: 10.0pt; font-family: Courier New&quot;&gt;&lt;span style=&quot;color:blue&quot;&gt;bool&lt;/span&gt; Conflict(&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; x, &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; y) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; (getRow(x) == getRow(y)) ||&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (getCol(x) == getCol(y)) ||&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (getGrid(x) == getGrid(y));&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Before start constraint programming, extract the known positions, and known values from Sudoku table.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New; color: blue&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New&quot;&gt;[] position = 0.To(80).OrderByDescending(x =&amp;gt; table[x] &amp;gt; 0).ToArray();&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt;[] valued = table.Where(x =&amp;gt; x &amp;gt; 0).ToArray();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Position is array of index of known values. All known value indexes will move to the front. This will make arranger class processes known values before unknown value. And now start constraint programming.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New; color: blue&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New&quot;&gt; solutions = 1.To(9).Arrange(81);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is instantiation of arrager class to arrange 1-9 for the size of 81. And next append the constraint.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New&quot;&gt;solutions.AppendConstraint(set =&amp;gt; set.Length &amp;lt; valued.Length,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; set =&amp;gt; cell =&amp;gt; cell == valued[set.Length]&lt;br /&gt;);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This &lt;strong&gt;AppendConstraint&lt;/strong&gt; command is different from AppendConstraint command in &lt;a href=&quot;http://chaowchaow.blogspot.com/2008/02/constraint-programming-part-ii-8-queens.html&quot; target=&quot;_blank&quot;&gt;previous post&lt;/a&gt;. This AppendConstraint command takes 2 arguments. First argument is argument to condition when the constraint should be applied. Second argument is constraint body. Above command can be translated that, when number of members in set less than number of known value, new member value must equal to known value. And next is constraint for Sudoku.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New&quot;&gt;solutions.AppendConstraint(set =&amp;gt; set.Length &amp;gt;= valued.Length,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; set =&amp;gt; cell =&amp;gt; !set.Any((x, i) =&amp;gt; x == cell &amp;amp;&amp;amp; Conflict(position[i], position[set.Length]))&lt;br /&gt;);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Above command can be translated that, when number of members greater than or equal to number of known values, new member cannot make any both duplicated in value and conflict in position.&lt;br /&gt;&lt;br /&gt;Now the command is completed. Next is to rearrange index into normal position.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New; color: blue&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New&quot;&gt; solution = solutions.FirstOrDefault();&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;if&lt;/span&gt; (solution == &lt;span style=&quot;color:blue&quot;&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;null&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; idx = 0;&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Sudoku&lt;/span&gt;(solution.OrderBy(x =&amp;gt; position[idx++]).ToArray());&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Test the class.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New; color: blue&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New&quot;&gt;[] table = { 5, 3, 0, 0, 7, 0, 0, 0, 0,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6, 0, 0, 1, 9, 5, 0, 0, 0, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0, 9, 8, 0, 0, 0, 0, 6, 0, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 8, 0, 0, 0, 6, 0, 0, 0, 3, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4, 0, 0, 8, 0, 3, 0, 0, 1, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 7, 0, 0, 0, 2, 0, 0, 0, 6, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0, 6, 0, 0, 0, 0, 2, 8, 0, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0, 0, 0, 4, 1, 9, 0, 0, 5, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0, 0, 0, 0, 8, 0, 0, 7, 9};&lt;br /&gt;&lt;span style=&quot;color:#2B91AF&quot;&gt;Console&lt;/span&gt;.WriteLine(&lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Sudoku&lt;/span&gt;(table).ToSolvedSudoku());&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//5, 3, 4, 6, 7, 8, 9, 1, 2&lt;br /&gt;//6, 7, 2, 1, 9, 5, 3, 4, 8&lt;br /&gt;//1, 9, 8, 3, 4, 2, 5, 6, 7&lt;br /&gt;//8, 5, 9, 7, 6, 1, 4, 2, 3&lt;br /&gt;//4, 2, 6, 8, 5, 3, 7, 9, 1&lt;br /&gt;//7, 1, 3, 9, 2, 4, 8, 5, 6&lt;br /&gt;//9, 6, 1, 5, 3, 7, 2, 8, 4&lt;br /&gt;//2, 8, 7, 4, 1, 9, 6, 3, 5&lt;br /&gt;//3, 4, 5, 2, 8, 6, 1, 7, 9&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The Sudoku is now solve! Next we will do constraint programming using only LinQ.</content><link rel='replies' type='application/atom+xml' href='http://chaowchaow.blogspot.com/feeds/1556529813930190271/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1350724202700062730/1556529813930190271' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350724202700062730/posts/default/1556529813930190271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350724202700062730/posts/default/1556529813930190271'/><link rel='alternate' type='text/html' href='http://chaowchaow.blogspot.com/2008/02/constraint-programming-part-iii-sudoku.html' title='Constraint Programming Part III - Sudoku'/><author><name>Chaow</name><uri>http://www.blogger.com/profile/07962486640447233732</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350724202700062730.post-411547971375806151</id><published>2008-02-20T14:20:00.009+07:00</published><updated>2008-07-26T17:50:33.704+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="8 queens"/><category scheme="http://www.blogger.com/atom/ns#" term="arranger"/><category scheme="http://www.blogger.com/atom/ns#" term="constraint programming"/><title type='text'>Constraint Programming Part II - 8 Queens Puzzle</title><content type='html'>To download class used in this article, download &lt;a href=&quot;http://chaowchaow.googlepages.com/Arranger.cs&quot; target=&quot;_blank&quot;&gt;Arranger&lt;/a&gt; class. Please note that, Arranger class is also use code in &lt;a href=&quot;http://chaowchaow.blogspot.com/2008/01/extension-methods-for-delegate-types.html&quot; target=&quot;_blank&quot;&gt;Extension methods for delegate types&lt;/a&gt; article.&lt;br /&gt;&lt;br /&gt;After put the classes into your project, create more extension methods.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New; color: blue&quot;&gt; public&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New&quot;&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Arranger&lt;/span&gt;&amp;lt;T,  T[]&amp;gt; Arrange&amp;lt;T&amp;gt;(&lt;span style=&quot;color:blue&quot;&gt;this&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt; IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; source, &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; length) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Arranger&lt;/span&gt;&amp;lt;T, T[]&amp;gt;(source, &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; T[0],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (current, item, i) =&amp;gt; current.Append(item),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; current =&amp;gt; current.Length == length);&lt;br /&gt;}&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Arranger&lt;/span&gt;&amp;lt;T1, T2&amp;gt; Arrange&amp;lt;T1, T2&amp;gt;(&lt;span style=&quot;color:blue&quot;&gt;this&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;IEnumerable&lt;/span&gt;&amp;lt;T1&amp;gt; source, T2 seed, &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T2, T1, &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt;,  T2&amp;gt; func, &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T2, &lt;span style=&quot;color:blue&quot;&gt; bool&lt;/span&gt;&amp;gt; yield) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Arranger&lt;/span&gt;&amp;lt;T1, T2&amp;gt;(source, seed, func, yield);&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Basic use of this class is easy, you can write just one line of code.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New; color: #A31515&quot;&gt;&amp;quot;ABC&amp;quot;&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New&quot;&gt;.Arrange(2).ForEach(x =&amp;gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Console&lt;/span&gt;.WriteLine(x.ListMembers()));&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//A A&lt;br /&gt;//A B&lt;br /&gt;//A C&lt;br /&gt;//B A&lt;br /&gt;//B B&lt;br /&gt;//B C&lt;br /&gt;//C A&lt;br /&gt;//C B&lt;br /&gt;//C C&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As result, the class generates all possible solutions to arrange A, B and C with length of 2. We can call this arrangement as &lt;strong&gt;PermutationWithRepetition&lt;/strong&gt;. This model is suited with problems that each member&#39;s position is matter and each member can be duplicated to each other. Example of this model is English word. The word &quot;&lt;em&gt;Hello&lt;/em&gt;&quot;, letter H - e - l - l - o were chosen. Position is matter because if we change to &quot;Helol&quot;, the word is changed to be meaningless. PermutationWithRepetition is the default model.&lt;br /&gt;&lt;br /&gt;Now try next model, &lt;strong&gt;Permutation&lt;/strong&gt;. We can set model from the property &lt;strong&gt;ArrangementModel&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New; color: blue&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New&quot;&gt; solutions = &lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot;ABC&amp;quot;&lt;/span&gt;.Arrange(2);&lt;br /&gt;solutions.ArrangementModel = &lt;span style=&quot;color:#2B91AF&quot;&gt;ArrangementModel&lt;/span&gt;.Permutation;&lt;br /&gt;solutions.ForEach(x =&amp;gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Console&lt;/span&gt;.WriteLine(x.ListMembers()));&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//A B&lt;br /&gt;//A C&lt;br /&gt;//B A&lt;br /&gt;//B C&lt;br /&gt;//C A&lt;br /&gt;//C B&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You can see that duplicated members are eliminated. Permutation is suited with problems that position is matter and each member cannot appear twice. Example is playing jigsaw puzzle. Position is important to build every piece of jigsaw to be a picture. But you cannot use a piece of jigsaw twice.&lt;br /&gt;&lt;br /&gt;Next model &lt;strong&gt;CombinationWithRepetition&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New; color: blue&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New&quot;&gt; solutions = &lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot;ABC&amp;quot;&lt;/span&gt;.Arrange(2);&lt;br /&gt;solutions.ArrangementModel = &lt;span style=&quot;color:#2B91AF&quot;&gt;ArrangementModel&lt;/span&gt;.CombinationWithRepetition;&lt;br /&gt;solutions.ForEach(x =&amp;gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Console&lt;/span&gt;.WriteLine(x.ListMembers()));&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//A A&lt;br /&gt;//A B&lt;br /&gt;//A C&lt;br /&gt;//B B&lt;br /&gt;//B C&lt;br /&gt;//C C&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;When compare with PermutationWithRepetition, CombinationWithRepetition show only distinct result. This model is suited with problems that position is not matter, and each member can be duplicated. Example is changing for money. You can change 50 cents, 25 cents and 25 cents for 1 dollars. Position is not matter {50c, 25c, 25c} is equal to {25c, 25c, 50c}.&lt;br /&gt;&lt;br /&gt;Last model, &lt;strong&gt;Combination&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New; color: blue&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New&quot;&gt; solutions = &lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot;ABC&amp;quot;&lt;/span&gt;.Arrange(2);&lt;br /&gt;solutions.ArrangementModel = &lt;span style=&quot;color:#2B91AF&quot;&gt;ArrangementModel&lt;/span&gt;.Combination;&lt;br /&gt;solutions.ForEach(x =&amp;gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Console&lt;/span&gt;.WriteLine(x.ListMembers()));&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//A B&lt;br /&gt;//A C&lt;br /&gt;//B C&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;When compare with CombinationWithRepetition, duplicated members is eliminated. This model is suited with problems that position is not matter, and each member cannot appear twice. Example is playing cards. You may get card Ace of clubs and Jack clubs. Position is not matter, {A club, J club} is equal to {J club, A club}. And you cannot have the same card in a hand.&lt;br /&gt;&lt;br /&gt;Beside models, you can append constraint to the arranger.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New; color: blue&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New&quot;&gt; solutions = &lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot;ABC&amp;quot;&lt;/span&gt;.Arrange(2);&lt;br /&gt;solutions.AppendConstraint(set =&amp;gt; c =&amp;gt; c != &lt;span style=&quot;color:#A31515&quot;&gt;&#39;B&#39;&lt;/span&gt;);&lt;br /&gt;solutions.ForEach(x =&amp;gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Console&lt;/span&gt;.WriteLine(x.ListMembers()));&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//A A&lt;br /&gt;//A C&lt;br /&gt;//C A&lt;br /&gt;//C C&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;AppendConstraint&lt;/strong&gt; limits the options while arranger chooses each member. You may notice that the function pass into AppendConstraint has 2 lambda operator (=&amp;gt;). It is partial function application. &quot;Set&quot; argument is set of members that arranger has already chosen, &quot;c&quot; argument is member to be chosen. Example above, the solution has a constraint that member to be chosen cannot be B. Therefore, there is no B in the results.&lt;br /&gt;&lt;br /&gt;With ArrangementModel and AppendConstraint, now we can construct &lt;a href=&quot;http://en.wikipedia.org/wiki/Eight_queens_puzzle&quot; target=&quot;_blank&quot;&gt;8 queens puzzle&lt;/a&gt; solutions.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New; color: blue&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New&quot;&gt; sol = 0.To(7).Arrange(8);&lt;br /&gt;sol.ArrangementModel = &lt;span style=&quot;color:#2B91AF&quot;&gt;ArrangementModel&lt;/span&gt;.Permutation;&lt;br /&gt;sol.AppendConstraint(set =&amp;gt; q =&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; set.All((x, i) =&amp;gt; (set.Length - i != &lt;span style=&quot;color:#2B91AF&quot;&gt;Math&lt;/span&gt;.Abs(x - q)))&lt;br /&gt;);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;0.To(7) is input source represents column index 0 (A) to column index 7 (H) to put a queen. Arrange(8) is to create solutions of 8 queens. ArrangementModel.Permutation means each queens cannot be in the same column index. And AppendConstraint limits that the new queen cannot put diagonal to queens that already in the set.&lt;br /&gt;&lt;br /&gt;With just 3 statements, code is finished. Now output the results.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New; color: #2B91AF&quot;&gt;Console&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New&quot;&gt;.WriteLine(&lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot;&amp;nbsp; A B C D E F G H&amp;quot;&lt;/span&gt;);&lt;br /&gt;sol.First().ForEach((q, i) =&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:#2B91AF&quot;&gt;Console&lt;/span&gt;.WriteLine(&lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot;{0} &amp;quot;&lt;/span&gt; + &lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot;_ &amp;quot;&lt;/span&gt;.Repeat(q) + &lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot;Q &amp;quot;&lt;/span&gt; + &lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot;_ &amp;quot;&lt;/span&gt;.Repeat(7 - q), i + 1)&lt;br /&gt;);&lt;br /&gt;&lt;span style=&quot;color:#2B91AF&quot;&gt;Console&lt;/span&gt;.WriteLine();&lt;br /&gt;&lt;span style=&quot;color:#2B91AF&quot;&gt;Console&lt;/span&gt;.WriteLine(&lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot;Total solutions: {0}&amp;quot;&lt;/span&gt;, sol.Count());&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//&amp;nbsp; A B C D E F G H&lt;br /&gt;//1 Q _ _ _ _ _ _ _&lt;br /&gt;//2 _ _ _ _ Q _ _ _&lt;br /&gt;//3 _ _ _ _ _ _ _ Q&lt;br /&gt;//4 _ _ _ _ _ Q _ _&lt;br /&gt;//5 _ _ Q _ _ _ _ _&lt;br /&gt;//6 _ _ _ _ _ _ Q _&lt;br /&gt;//7 _ Q _ _ _ _ _ _&lt;br /&gt;//8 _ _ _ Q _ _ _ _&lt;br /&gt;//&lt;br /&gt;//Total solutions: 92&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Next post, solve harder problem which is Sudoku.</content><link rel='replies' type='application/atom+xml' href='http://chaowchaow.blogspot.com/feeds/411547971375806151/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1350724202700062730/411547971375806151' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350724202700062730/posts/default/411547971375806151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350724202700062730/posts/default/411547971375806151'/><link rel='alternate' type='text/html' href='http://chaowchaow.blogspot.com/2008/02/constraint-programming-part-ii-8-queens.html' title='Constraint Programming Part II - 8 Queens Puzzle'/><author><name>Chaow</name><uri>http://www.blogger.com/profile/07962486640447233732</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350724202700062730.post-2432163324238131412</id><published>2008-02-05T20:43:00.000+07:00</published><updated>2008-02-06T08:52:31.056+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="constraint programming"/><title type='text'>Constraint Programming Part I - Introduction</title><content type='html'>&lt;a href=&quot;http://en.wikipedia.org/wiki/Constraint_programming&quot; target=&quot;_blank&quot;&gt;Constraint programming&lt;/a&gt; is programming for searching the solutions by specifying the constraints of a problem, and then generating the satisfied solutions. Constraint programming is unlike &lt;a href=&quot;http://en.wikipedia.org/wiki/Brute-force_search&quot; target=&quot;_blank&quot;&gt;Brute-force search&lt;/a&gt;, which Brute-force generates all possible solutions and then tests all solutions for the answer. Constraint programming can reduce a huge time to search by discarding large set of unsatisfied solutions.&lt;br /&gt;&lt;br /&gt;A solution is a combination set of finite domains. And a satisfied solution is the solution that satisfies all constraints. For instance, in &lt;a href=&quot;http://en.wikipedia.org/wiki/Sudoku&quot; target=&quot;_blank&quot;&gt;Sudoku&lt;/a&gt;, a solution is a set of 1 to 9 with size of 9 rows and 9 columns. Satisfied solutions are values of all cells in each column, each row, and each 3 x 3 grid must be unique.&lt;br /&gt;&lt;br /&gt;Constraint programming can solve solutions by &quot;guess-and-check&quot;, this can be done by technics called &lt;a href=&quot;http://en.wikipedia.org/wiki/Backtracking&quot; target=&quot;_blank&quot;&gt;backtracking&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Local_consistency&quot; target=&quot;_blank&quot;&gt;local consistency&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;BackTracking is recursive algorithm to guess a value, and check if the value is satisfied the constraints. If the value is satisfied, it will recurse and guess a value for next item. The recursion will be done until solution is valid. If no solution is valid, it will rollback and guess next value, and continue searching for valid solutions again.&lt;br /&gt;&lt;br /&gt;Local consistency is algorithm to cut off number of items in a domain. This will reduce time and space to search. Moreover, local consistency is also checker for satisfied solutions.&lt;br /&gt;&lt;br /&gt;For instance, for 4-queens problem, you have to place 4 queens on 4 x 4 board, with the constraint that all 4 queens must not eat each other. In this problem, there are 4 variables, which are queens for row 1, 2, 3, 4. And there are 4 items in a finite domain, which are column A, B, C, D. And there are 2 constraints, all queens cannot be in the same column, and all queens cannot place diagonally to previous queens.&lt;br /&gt;&lt;br /&gt;To start, constraint programming will pick value for the first queen, which is column A.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New&quot;&gt;&amp;nbsp; A B C D&lt;br /&gt;1 Q . . .&lt;br /&gt;2 . . _ _&lt;br /&gt;3 . _ . _&lt;br /&gt;4 . _ _ .&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;With local consistency, it enforces that in second row, you cannot place queen on column A and B. In third row, you cannot place queen on column A and C, and for forth row, you cannot place queen on column A and D.&lt;br /&gt;&lt;br /&gt;Next, constraint programming will pick value for the second queen, which is column C.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New&quot;&gt;&amp;nbsp; A B C D&lt;br /&gt;1 Q . . .&lt;br /&gt;2 . . Q .&lt;br /&gt;3 . . . .&lt;br /&gt;4 . _ . .&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You can see that, when we place second queen on column C, we cannot continue place queen on third row. Therefore, the solution is failed. Constraint programming will backtrack and try pick next value for the second queen, which is column D.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New&quot;&gt;&amp;nbsp; A B C D&lt;br /&gt;1 Q . . .&lt;br /&gt;2 . . . Q&lt;br /&gt;3 . _ . .&lt;br /&gt;4 . . _ .&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Next, for the third queen.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New&quot;&gt;&amp;nbsp; A B C D&lt;br /&gt;1 Q . . .&lt;br /&gt;2 . . . Q&lt;br /&gt;3 . Q . .&lt;br /&gt;4 . . . .&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Again, we cannot continue place queen for the forth row. Constraint programming will backtrack. The third row has only one option. Backtracking will perform again to the second row, unfortunately, second row used all available options. Then, we have to backtrack to the first row. Next value for the first row is column B.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New&quot;&gt;&amp;nbsp; A B C D&lt;br /&gt;1 . Q . .&lt;br /&gt;2 . . . _&lt;br /&gt;3 _ . _ .&lt;br /&gt;4 _ . _ _&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Next, for second row.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New&quot;&gt;&amp;nbsp; A B C D&lt;br /&gt;1 . Q . .&lt;br /&gt;2 . . . Q&lt;br /&gt;3 _ . . .&lt;br /&gt;4 _ . _ .&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Next, for third row.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New&quot;&gt;&amp;nbsp; A B C D&lt;br /&gt;1 . Q . .&lt;br /&gt;2 . . . Q&lt;br /&gt;3 Q . . .&lt;br /&gt;4 . . _ .&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Next, for the last row.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New&quot;&gt;&amp;nbsp; A B C D&lt;br /&gt;1 . Q . .&lt;br /&gt;2 . . . Q&lt;br /&gt;3 Q . . .&lt;br /&gt;4 . . Q .&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;No conflict, solution is completed! Constraint programming can continue find whether there are any other solutions.&lt;br /&gt;&lt;br /&gt;Next, we will start programming, and solve 8 queens problem.</content><link rel='replies' type='application/atom+xml' href='http://chaowchaow.blogspot.com/feeds/2432163324238131412/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1350724202700062730/2432163324238131412' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350724202700062730/posts/default/2432163324238131412'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350724202700062730/posts/default/2432163324238131412'/><link rel='alternate' type='text/html' href='http://chaowchaow.blogspot.com/2008/02/constraint-programming-part-i.html' title='Constraint Programming Part I - Introduction'/><author><name>Chaow</name><uri>http://www.blogger.com/profile/07962486640447233732</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350724202700062730.post-7441542668951419098</id><published>2008-01-25T00:09:00.000+07:00</published><updated>2008-06-14T10:07:08.072+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="extension"/><category scheme="http://www.blogger.com/atom/ns#" term="string"/><title type='text'>Extension Methods for String</title><content type='html'>This post continues on extension methods, now for string. String is the most common type in all programming languages. It is a human-readable text for any kind of information. These are some more extension methods, which may make you to present your data easier. &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New; color: blue&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New&quot;&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;string&lt;/span&gt; Join(&lt;span style=&quot;color:blue&quot;&gt;this&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style=&quot;color:blue&quot;&gt;string&lt;/span&gt;&amp;gt; source, &lt;span style=&quot;color:blue&quot;&gt;string&lt;/span&gt; separator) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;string&lt;/span&gt;[] value = source &lt;span style=&quot;color:blue&quot;&gt;as&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;string&lt;/span&gt;[];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;if&lt;/span&gt; (value != &lt;span style=&quot;color:blue&quot;&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;string&lt;/span&gt;.Join(separator, value);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;string&lt;/span&gt;.Join(separator, source.ToArray());&lt;br /&gt;}&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;string&lt;/span&gt; Reverse(&lt;span style=&quot;color:blue&quot;&gt;this&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;string&lt;/span&gt; text) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; len = text.Length;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;char&lt;/span&gt;[] charArray = &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;char&lt;/span&gt;[len--];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;for&lt;/span&gt; (&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; i = 0; len &amp;gt;= 0; i++, len--)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; charArray[i] = text[len];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;string&lt;/span&gt;(charArray);&lt;br /&gt;}&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;string&lt;/span&gt; Repeat(&lt;span style=&quot;color:blue&quot;&gt;this&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;string&lt;/span&gt; source, &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; num) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;if&lt;/span&gt; (num &amp;lt;= 0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;string&lt;/span&gt;.Empty;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:#2B91AF&quot;&gt;StringBuilder&lt;/span&gt; sb = &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;StringBuilder&lt;/span&gt;(source.Length * num);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; num.Times(x =&amp;gt; sb.Append(source));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; sb.ToString();&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Join&lt;/strong&gt; method is the same as String.Join, but this is for enumerable of string. Below is example.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New; color: blue&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New&quot;&gt; result = &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt;[] { &lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot;Hello&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot;World!&amp;quot;&lt;/span&gt; }.Join(&lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot;, &amp;quot;&lt;/span&gt;);&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//result = &amp;quot;Hello, World!&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Reverse&lt;/strong&gt; method is to reverse the character order of a string. Below is example.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New; color: blue&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New&quot;&gt; result = &lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot;Hello, World!&amp;quot;&lt;/span&gt;.Reverse();&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;// result = &amp;quot;!dlroW ,olleH&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Repeat&lt;/strong&gt; method is to duplicate a string for specific number of times. Below is example.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New; color: blue&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New&quot;&gt; result = &lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot;Hello, World!&amp;quot;&lt;/span&gt;.Repeat(3);&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;// result = &amp;quot;Hello, World!Hello, World!Hello, World!&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Some more useful methods used to transform enumerable of objects to a string, which I always use when debugging. Following is the code.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New; color: blue&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New&quot;&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;string&lt;/span&gt; ListMembers&amp;lt;T&amp;gt;(&lt;span style=&quot;color:blue&quot;&gt;this&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; source, &lt;span style=&quot;color:blue&quot;&gt;string&lt;/span&gt; format, &lt;span style=&quot;color:blue&quot;&gt;string&lt;/span&gt; separator) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; source.Select(s =&amp;gt; &lt;span style=&quot;color:blue&quot;&gt;string&lt;/span&gt;.Format(format, s)).Join(separator);&lt;br /&gt;}&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;string&lt;/span&gt; ListMembers&amp;lt;T&amp;gt;(&lt;span style=&quot;color:blue&quot;&gt;this&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; source) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; source.Select(s =&amp;gt; s.ToString()).Join(&lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot; &amp;quot;&lt;/span&gt;);&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;ListMembers&lt;/strong&gt; method can be used as ToString method. It transforms every object to string and join them together. Below is example.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New; color: blue&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New&quot;&gt; result = &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt;[] { 1, 2, 3, 4, 5 }.ListMembers();&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//result = &amp;quot;1 2 3 4 5&amp;quot;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Next post, go to interesting topic about finding solutions by specifying constraints. It is called Constraint Programming.</content><link rel='replies' type='application/atom+xml' href='http://chaowchaow.blogspot.com/feeds/7441542668951419098/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1350724202700062730/7441542668951419098' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350724202700062730/posts/default/7441542668951419098'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350724202700062730/posts/default/7441542668951419098'/><link rel='alternate' type='text/html' href='http://chaowchaow.blogspot.com/2008/01/extension-methods-for-string.html' title='Extension Methods for String'/><author><name>Chaow</name><uri>http://www.blogger.com/profile/07962486640447233732</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350724202700062730.post-8533276353679714643</id><published>2008-01-18T16:11:00.000+07:00</published><updated>2008-06-14T10:07:08.073+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="enumerable"/><category scheme="http://www.blogger.com/atom/ns#" term="extension"/><title type='text'>Extension Methods for Enumerable</title><content type='html'>Visual Studio 2008 provides many extension method for enumerable, extension method in this post is additional extension that I wrote while developing programs.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New; color: blue&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New&quot;&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; Repeat&amp;lt;T&amp;gt;(&lt;span style=&quot;color:blue&quot;&gt;this&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; source, &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; num) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;for&lt;/span&gt; (&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; x = 0; x &amp;lt; num; x++) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;using&lt;/span&gt; (&lt;span style=&quot;color:#2B91AF&quot;&gt;IEnumerator&lt;/span&gt;&amp;lt;T&amp;gt; source_enum = source.GetEnumerator()) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;while&lt;/span&gt; (source_enum.MoveNext())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;yield&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; source_enum.Current;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; AsEnumerable&amp;lt;T&amp;gt;(T item) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;yield&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; item;&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Repeat&lt;/strong&gt; method is to reiterate enumerable for specific amount of times. This method is unlike built-in Repeat method of VS 2008. The built-in Repeat method repeats a single item, but this Repeat method repeats an enumerable.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New; color: blue&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New&quot;&gt; result = &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt;[] { 1, 2, 3 }.Repeat(3);&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//result = {1, 2, 3, 1, 2, 3, 1, 2, 3}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Example above makes the repeat of array {1, 2, 3} for 3 times.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;AsEnumerable&lt;/strong&gt; method makes single item to an enumerable of single element. This method is unlike built-in AsEnumerable method of VS 2008. The built-in AsEnumerable method just cast an enumerable to IEnumerable interface. This AsEnumerable method is not casting, but wrap single item with enumerable.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New; color: blue&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New&quot;&gt; result = &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt;[] { 1, 2, 3 }.Concat(&lt;span style=&quot;color:#2B91AF&quot;&gt;Enumerable2&lt;/span&gt;.AsEnumerable(4));&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//result = {1, 2, 3, 4}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Example above array of {1, 2, 3} is able to concatenate with enumerable of 4.&lt;br /&gt;&lt;br /&gt;Some more functions:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New; color: blue&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New&quot;&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;bool&lt;/span&gt; All&amp;lt;T&amp;gt;(&lt;span style=&quot;color:blue&quot;&gt;this&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; source, &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T, &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt;, &lt;span style=&quot;color:blue&quot;&gt;bool&lt;/span&gt;&amp;gt; predicate) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; i = 0;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;foreach&lt;/span&gt; (T item &lt;span style=&quot;color:blue&quot;&gt;in&lt;/span&gt; source) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;if&lt;/span&gt; (!predicate(item, i++))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;false&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;true&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;bool&lt;/span&gt; Any&amp;lt;T&amp;gt;(&lt;span style=&quot;color:blue&quot;&gt;this&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; source, &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T, &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt;, &lt;span style=&quot;color:blue&quot;&gt;bool&lt;/span&gt;&amp;gt; predicate) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; i = 0;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;foreach&lt;/span&gt; (T item &lt;span style=&quot;color:blue&quot;&gt;in&lt;/span&gt; source) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;if&lt;/span&gt; (predicate(item, i++)) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;true&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;false&lt;/span&gt;;&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Both &lt;strong&gt;All&lt;/strong&gt; and &lt;strong&gt;Any&lt;/strong&gt; methods are the same with built-in All/Any methods, but the different is these methods provide index used in predicate function.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New; color: blue&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New&quot;&gt; result = &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt;[] { 0, 1, 2 }.All((x, i) =&amp;gt; x == i);&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//result = true&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;var&lt;/span&gt; result2 = &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt;[] { 2, 1, 0 }.Any((x, i) =&amp;gt; x == i);&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//result2 = true&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Example above, All method tests every element&#39;s value is equal to index, which is true. Any method tests any element&#39;s value is equal to index, it is true because number 1&#39;s value is equal to index.&lt;br /&gt;&lt;br /&gt;Last 2 functions, these functions are not extension of enumerable, but they are related to enumerable.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New; color: blue&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New&quot;&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; Enum&amp;lt;T&amp;gt;() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; System.&lt;span style=&quot;color:#2B91AF&quot;&gt;Enum&lt;/span&gt;.GetValues(&lt;span style=&quot;color:blue&quot;&gt;typeof&lt;/span&gt;(T)).Cast&amp;lt;T&amp;gt;();&lt;br /&gt;}&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; T[] Append&amp;lt;T&amp;gt;(&lt;span style=&quot;color:blue&quot;&gt;this&lt;/span&gt; T[] source, T item) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; len = source.Length;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; T[] ret = &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; T[len + 1];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; source.CopyTo(ret, 0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret[len] = item;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; ret;&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Enum&lt;/strong&gt; method creates enumerable from enum.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New; color: blue&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New&quot;&gt; result = &lt;span style=&quot;color:#2B91AF&quot;&gt;Enumerable2&lt;/span&gt;.Enum&amp;lt;&lt;span style=&quot;color:#2B91AF&quot;&gt;DayOfWeek&lt;/span&gt;&amp;gt;();&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//result = {Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Example above, Enum method creates enumerable of DayOfWeek type. Values range from Sunday to Saturday.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Append&lt;/strong&gt; method appends an item to an array.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New; color: blue&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New&quot;&gt; result = &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt;[] { 1, 2, 3 }.Append(4);&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//result = {1, 2, 3, 4}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Example above 4 is appended to array of {1, 2, 3} and results to new array of {1, 2, 3, 4}.&lt;br /&gt;&lt;br /&gt;Next post is still be on more Extension Methods.</content><link rel='replies' type='application/atom+xml' href='http://chaowchaow.blogspot.com/feeds/8533276353679714643/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1350724202700062730/8533276353679714643' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350724202700062730/posts/default/8533276353679714643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350724202700062730/posts/default/8533276353679714643'/><link rel='alternate' type='text/html' href='http://chaowchaow.blogspot.com/2008/01/extension-methods-for-enumerable.html' title='Extension Methods for Enumerable'/><author><name>Chaow</name><uri>http://www.blogger.com/profile/07962486640447233732</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350724202700062730.post-5501779265745804494</id><published>2008-01-12T16:23:00.001+07:00</published><updated>2008-06-14T10:07:08.073+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="delegate"/><category scheme="http://www.blogger.com/atom/ns#" term="extension"/><title type='text'>Extension Methods for Delegate Types</title><content type='html'>The great resource, that I highly recommend you to read is &lt;a href=&quot;http://blogs.msdn.com/wesdyer/&quot; target=&quot;_blank&quot;&gt;Wesdyer&#39;s&lt;/a&gt; blog. His blog contains much information about &lt;a href=&quot;http://en.wikipedia.org/wiki/Functional_programming&quot; target=&quot;_blank&quot;&gt;Functional Programming&lt;/a&gt; in C#. Articles you should read that relate to this post are &lt;a href=&quot;http://blogs.msdn.com/wesdyer/archive/2007/01/26/function-memoization.aspx&quot; target=&quot;_blank&quot;&gt;Function Memoization&lt;/a&gt; and &lt;a href=&quot;http://blogs.msdn.com/wesdyer/archive/2007/01/29/currying-and-partial-function-application.aspx&quot; target=&quot;_blank&quot;&gt;Partial Function Application&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Put this code onto your extension class (source: &lt;a href=&quot;http://blogs.msdn.com/wesdyer/&quot; target=&quot;_blank&quot;&gt;Wesdyer&#39;s&lt;/a&gt; blog).&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New; color: blue&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New&quot;&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T, TResult&amp;gt; Memoize&amp;lt;T, TResult&amp;gt;(&lt;span style=&quot;color:blue&quot;&gt;this&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T, TResult&amp;gt; func) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;var&lt;/span&gt; dict = &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Dictionary&lt;/span&gt;&amp;lt;T, TResult&amp;gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; arg =&amp;gt; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TResult value;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;if&lt;/span&gt; (!dict.TryGetValue(arg, &lt;span style=&quot;color:blue&quot;&gt;out&lt;/span&gt; value)) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; value = func(arg);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dict.Add(arg, value);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; value;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;br /&gt;}&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T2, TResult&amp;gt; Partial&amp;lt;T1, T2, TResult&amp;gt;(&lt;span style=&quot;color:blue&quot;&gt;this&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T1, T2, TResult&amp;gt; func, T1 arg1) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; arg2 =&amp;gt; func(arg1, arg2);&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Memoization&quot; target=&quot;_blank&quot;&gt;Function Memoization&lt;/a&gt;&lt;/strong&gt; is technic to speed up repeating calculation by storing arguments and result.&lt;br /&gt;&lt;br /&gt;Compare this simple fibonacci function&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New; color: #2B91AF&quot;&gt;Func&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New&quot;&gt;&amp;lt;&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt;, &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt;&amp;gt; fib = &lt;span style=&quot;color:blue&quot;&gt;null&lt;/span&gt;;&lt;br /&gt;fib = n =&amp;gt; n &amp;gt; 1 ? fib(n - 1) + fib(n - 2) : n;&lt;br /&gt;&lt;span style=&quot;color:#2B91AF&quot;&gt;Console&lt;/span&gt;.WriteLine(fib(38));&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//39088169&lt;br /&gt;//2.35 seconds&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;with memoized fibonacci&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New; color: #2B91AF&quot;&gt;Func&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New&quot;&gt;&amp;lt;&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt;, &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt;&amp;gt; fib = &lt;span style=&quot;color:blue&quot;&gt;null&lt;/span&gt;;&lt;br /&gt;fib = n =&amp;gt; n &amp;gt; 1 ? fib(n - 1) + fib(n - 2) : n;&lt;br /&gt;&lt;strong&gt;fib = fib.Memoize();&lt;/strong&gt;&lt;br /&gt;&lt;span style=&quot;color:#2B91AF&quot;&gt;Console&lt;/span&gt;.WriteLine(fib(38));&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//39088169&lt;br /&gt;//0.01 second&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Memoized function performs much faster. Just add only 1 line of code.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Partial Function Application&lt;/strong&gt; is to define an argument of a function and create another function with remaining argument.&lt;br /&gt;&lt;br /&gt;Here is an example.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New; color: #2B91AF&quot;&gt;Func&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New&quot;&gt;&amp;lt;&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt;, &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt;, &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt;&amp;gt; gcd = &lt;span style=&quot;color:blue&quot;&gt;null&lt;/span&gt;;&lt;br /&gt;gcd = (x, y) =&amp;gt; (y == 0) ? x : gcd(y, x % y);&lt;br /&gt;&lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt;, &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt;&amp;gt; gcdBy20 = gcd.Partial(20);&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;var&lt;/span&gt; max = 1.To(15).Max(gcdBy20);&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//max = 10&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;First, we declare Greatest Common Divisor (GCD) function. Then, we partial it and create new gcdBy20 function. This function takes only one argument and return greatest common divisor with 20. To use, we generate numbers 1 to 15, and find which value has maximum gcdBy20.&lt;br /&gt;&lt;br /&gt;Now more extension methods by me.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New; color: blue&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New&quot;&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T1, T2, TResult&amp;gt; Memoize&amp;lt;T1, T2, TResult&amp;gt;(&lt;span style=&quot;color:blue&quot;&gt;this&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T1, T2, TResult&amp;gt; func) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;var&lt;/span&gt; dict = &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Dictionary&lt;/span&gt;&amp;lt;T1, &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T2, TResult&amp;gt;&amp;gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; (arg1, arg2) =&amp;gt; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T2, TResult&amp;gt; value;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;if&lt;/span&gt; (!dict.TryGetValue(arg1, &lt;span style=&quot;color:blue&quot;&gt;out&lt;/span&gt; value)) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; value = func.Partial(arg1).Memoize();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dict.Add(arg1, value);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; value(arg2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;br /&gt;}&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T, &lt;span style=&quot;color:blue&quot;&gt;bool&lt;/span&gt;&amp;gt; And&amp;lt;T&amp;gt;(&lt;span style=&quot;color:blue&quot;&gt;this&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T, &lt;span style=&quot;color:blue&quot;&gt;bool&lt;/span&gt;&amp;gt; predicate1, &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T, &lt;span style=&quot;color:blue&quot;&gt;bool&lt;/span&gt;&amp;gt; predicate2) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; arg =&amp;gt; predicate1(arg) &amp;amp;&amp;amp; predicate2(arg);&lt;br /&gt;}&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T, &lt;span style=&quot;color:blue&quot;&gt;bool&lt;/span&gt;&amp;gt; Or&amp;lt;T&amp;gt;(&lt;span style=&quot;color:blue&quot;&gt;this&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T, &lt;span style=&quot;color:blue&quot;&gt;bool&lt;/span&gt;&amp;gt; predicate1, &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T, &lt;span style=&quot;color:blue&quot;&gt;bool&lt;/span&gt;&amp;gt; predicate2) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; arg =&amp;gt; predicate1(arg) || predicate2(arg);&lt;br /&gt;}&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T, TResult&amp;gt; When&amp;lt;T, TResult&amp;gt;(&lt;span style=&quot;color:blue&quot;&gt;this&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T, TResult&amp;gt; func, &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T, &lt;span style=&quot;color:blue&quot;&gt;bool&lt;/span&gt;&amp;gt; predicate, &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T, TResult&amp;gt; alternative) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; arg =&amp;gt; predicate(arg) ? alternative(arg) : func(arg);&lt;br /&gt;}&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T1, T2, TResult&amp;gt; When&amp;lt;T1, T2, TResult&amp;gt;(&lt;span style=&quot;color:blue&quot;&gt;this&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T1, T2, TResult&amp;gt; func, &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T1, T2, &lt;span style=&quot;color:blue&quot;&gt;bool&lt;/span&gt;&amp;gt; predicate, &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T1, T2, TResult&amp;gt; alternative) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; (arg1, arg2) =&amp;gt; predicate(arg1, arg2) ? alternative(arg1, arg2) : func(arg1, arg2);&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Memoize&lt;/strong&gt; function memorizes the result of function with 2 arguments. The first memoize function is able to memorize only 1 argument. If you notice, you can see that this Memoize function uses both Partial and previous Memoize functionality to memorize.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;And/Or&lt;/strong&gt; functions are simple. They takes a predicate and produce another predicate with And/Or logic.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New; color: #2B91AF&quot;&gt;Func&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New&quot;&gt;&amp;lt;&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt;, &lt;span style=&quot;color:blue&quot;&gt;bool&lt;/span&gt;&amp;gt; predicate = x =&amp;gt; x % 2 == 0;&lt;br /&gt;predicate = predicate.And(x =&amp;gt; x % 3 == 0);&lt;br /&gt;predicate = predicate.And(x =&amp;gt; x % 4 == 0);&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;var&lt;/span&gt; value = 1.To(20).Where(predicate);&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//value = {12}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Example above, we create predicate function which find whether x is divisible by 2 And 3 And 4. Then generate numbers 1 to 20, and filter which numbers pass the predicate.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&quot;When&quot;&lt;/strong&gt; function provides conditional to evaluate alternative expression if condition is met.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New; color: #2B91AF&quot;&gt;Func&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New&quot;&gt;&amp;lt;&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt;, &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt;&amp;gt; fact = &lt;span style=&quot;color:blue&quot;&gt;null&lt;/span&gt;;&lt;br /&gt;fact = x =&amp;gt; fact(x - 1) * x;&lt;br /&gt;fact = fact.When(x =&amp;gt; x == 0, x =&amp;gt; 1);&lt;br /&gt;&lt;span style=&quot;color:#2B91AF&quot;&gt;Console&lt;/span&gt;.WriteLine(fact(10));&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//3628800&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Factorial function equal to factorial of x - 1 multiply by x. But &quot;When&quot; function creates alternation instruction, when x equal to 0, result will equal to 1.&lt;br /&gt;&lt;br /&gt;A little bit more extension methods&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New; color: blue&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New&quot;&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T, &lt;span style=&quot;color:blue&quot;&gt;bool&lt;/span&gt;&amp;gt; PredicateAll&amp;lt;T&amp;gt;(&lt;span style=&quot;color:blue&quot;&gt;this&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T, &lt;span style=&quot;color:blue&quot;&gt;bool&lt;/span&gt;&amp;gt;&amp;gt; source) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;using&lt;/span&gt; (&lt;span style=&quot;color:blue&quot;&gt;var&lt;/span&gt; source_enum = source.GetEnumerator()) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;if&lt;/span&gt; (!source_enum.MoveNext())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; x =&amp;gt; &lt;span style=&quot;color:blue&quot;&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T, &lt;span style=&quot;color:blue&quot;&gt;bool&lt;/span&gt;&amp;gt; result = source_enum.Current;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;while&lt;/span&gt; (source_enum.MoveNext())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; result = result.And(source_enum.Current);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; result;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T, &lt;span style=&quot;color:blue&quot;&gt;bool&lt;/span&gt;&amp;gt; PredicateAny&amp;lt;T&amp;gt;(&lt;span style=&quot;color:blue&quot;&gt;this&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T, &lt;span style=&quot;color:blue&quot;&gt;bool&lt;/span&gt;&amp;gt;&amp;gt; source) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;using&lt;/span&gt; (&lt;span style=&quot;color:blue&quot;&gt;var&lt;/span&gt; source_enum = source.GetEnumerator()) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;if&lt;/span&gt; (!source_enum.MoveNext())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; x =&amp;gt; &lt;span style=&quot;color:blue&quot;&gt;false&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T, &lt;span style=&quot;color:blue&quot;&gt;bool&lt;/span&gt;&amp;gt; result = source_enum.Current;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;while&lt;/span&gt; (source_enum.MoveNext())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; result = result.Or(source_enum.Current);&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; result;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;PredicateAll&lt;/strong&gt; transforms list of predicates to a predicate that will be true if all predicates are true. On the other hand, &lt;strong&gt;PredicateAny&lt;/strong&gt; create predicate that will be false if all predicates false.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New; color: #2B91AF&quot;&gt;List&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New&quot;&gt;&amp;lt;&lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt;, &lt;span style=&quot;color:blue&quot;&gt;bool&lt;/span&gt;&amp;gt;&amp;gt; predicateList = &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;List&lt;/span&gt;&amp;lt;&lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt;, &lt;span style=&quot;color:blue&quot;&gt;bool&lt;/span&gt;&amp;gt;&amp;gt;();&lt;br /&gt;predicateList.Add(x =&amp;gt; x % 2 == 0);&lt;br /&gt;predicateList.Add(x =&amp;gt; x % 3 == 0);&lt;br /&gt;predicateList.Add(x =&amp;gt; x % 4 == 0);&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;var&lt;/span&gt; predicateAll = predicateList.PredicateAll();&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;var&lt;/span&gt; predicateAny = predicateList.PredicateAny();&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;var&lt;/span&gt; result = 1.To(20).Where(predicateAll);&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//result = {12}&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:blue&quot;&gt;var&lt;/span&gt; result2 = 1.To(20).Where(predicateAny);&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//result2 = {2, 3, 4, 6, 8, 9, 10, 12, 14, 15, 16, 18, 20}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Example above, predicateAll returns true only numbers that is divisible by 2, and 3, and 4 which is 12. predicateAny returns true for any numbers that is divisible by 2, or 3, or 4 which are 2, 3, 4, 6, 8, 9, 10, 12, 14, 15, 16, 18, 20.&lt;br /&gt;&lt;br /&gt;Next post continue on extension methods.</content><link rel='replies' type='application/atom+xml' href='http://chaowchaow.blogspot.com/feeds/5501779265745804494/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1350724202700062730/5501779265745804494' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350724202700062730/posts/default/5501779265745804494'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350724202700062730/posts/default/5501779265745804494'/><link rel='alternate' type='text/html' href='http://chaowchaow.blogspot.com/2008/01/extension-methods-for-delegate-types.html' title='Extension Methods for Delegate Types'/><author><name>Chaow</name><uri>http://www.blogger.com/profile/07962486640447233732</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350724202700062730.post-104570442488258321</id><published>2008-01-09T09:54:00.002+07:00</published><updated>2008-06-14T10:07:08.073+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="projecteuler"/><category scheme="http://www.blogger.com/atom/ns#" term="pythagorean"/><category scheme="http://www.blogger.com/atom/ns#" term="sequence"/><title type='text'>Infinite Sequence Part V - Pythagorean Triple</title><content type='html'>Most of the time, if we think of sequence, it should be natural numbers. But this time, we change to geometry. An interesting geometry is &lt;a href=&quot;http://en.wikipedia.org/wiki/Pythagorean_triple&quot; target=&quot;_blank&quot;&gt;Pythagorean triple&lt;/a&gt;. Pythagorean triple consists of 3 integer values which can be constructed a right triangle. A primitive Pythagorean triple is triple that all values in triple are &lt;a href=&quot;http://en.wikipedia.org/wiki/Coprime&quot; target=&quot;_blank&quot;&gt;coprime&lt;/a&gt;. Example of primitive Pythagorean triples are: &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New&quot;&gt;( 3,&amp;nbsp; 4,&amp;nbsp; 5) ( 5, 12, 13) ( 7, 24, 25) &lt;br /&gt;( 8, 15, 17) ( 9, 40, 41) (11, 60, 61) &lt;br /&gt;(12, 35, 37) (13, 84, 85) (16, 63, 65)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;To generate a Pythagorean triple is easy, just pick 2 integer m and n where m &gt; n. This is the formula to create Pythagorean triple.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New&quot;&gt;Side a = m&lt;sup&gt;2&lt;/sup&gt; - n&lt;sup&gt;2&lt;/sup&gt;&lt;br /&gt;Side b = 2mn&lt;br /&gt;Side c = m&lt;sup&gt;2&lt;/sup&gt; + n&lt;sup&gt;2&lt;/sup&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Such as number is 2 and 1.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New&quot;&gt;Side a = 2&lt;sup&gt;2&lt;/sup&gt; - 1&lt;sup&gt;2&lt;/sup&gt;&amp;nbsp;&amp;nbsp; = 3&lt;br /&gt;Side b = 2 * 2 * 1 = 4&lt;br /&gt;Side c = 2&lt;sup&gt;2&lt;/sup&gt; + 1&lt;sup&gt;2&lt;/sup&gt;&amp;nbsp;&amp;nbsp; = 5&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now we get (3, 4, 5) triple.&lt;br /&gt;&lt;br /&gt;This is the class that represent Pythagorean triple.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New&quot;&gt;&lt;span style=&quot;color: green&quot;&gt;//Fix: 2008-02-29 - Make class immutable&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;PythagoreanTriple&lt;/span&gt; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; _seed1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; _seed2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; _size;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; _sideA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; _sideB;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; _sideC;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; Seed1 {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;get&lt;/span&gt; { &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; _seed1; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; Seed2 {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;get&lt;/span&gt; { &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; _seed2; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; Size {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;get&lt;/span&gt; { &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; _size; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; SideA {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:blue&quot;&gt;get&lt;/span&gt; { &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; _sideA; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; SideB {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;get&lt;/span&gt; { &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; _sideB; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; SideC {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;get&lt;/span&gt; { &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; _sideC; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; Perimeter {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;get&lt;/span&gt; { &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; _sideA + _sideB + _sideC; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; PythagoreanTriple() : &lt;span style=&quot;color:blue&quot;&gt;this&lt;/span&gt;(1, 1, 1) { }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; PythagoreanTriple(&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; seed1, &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; seed2) : &lt;span style=&quot;color:blue&quot;&gt;this&lt;/span&gt;(seed1, seed2, 1) { }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; PythagoreanTriple(&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; seed1, &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; seed2, &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; size) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _seed1 = seed1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _seed2 = seed2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _size = size;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;calculateTriple();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;void&lt;/span&gt; calculateTriple() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; seed1pow2 = _seed1 * _seed1 * _size;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; seed2pow2 = _seed2 * _seed2 * _size;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _sideA = seed1pow2 - seed2pow2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _sideB = 2 * _seed1 * _seed2 * _size;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _sideC = seed1pow2 + seed2pow2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;override&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;bool&lt;/span&gt; Equals(&lt;span style=&quot;color:blue&quot;&gt;object&lt;/span&gt; obj) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:#2B91AF&quot;&gt;PythagoreanTriple&lt;/span&gt; p = obj &lt;span style=&quot;color:blue&quot;&gt;as&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;PythagoreanTriple&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;if&lt;/span&gt; (p == &lt;span style=&quot;color:blue&quot;&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;false&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; _seed1 == p._seed1 &amp;amp;&amp;amp; _seed2 == p._seed2 &amp;amp;&amp;amp; _size == p._size;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;override&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; GetHashCode() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; _sideA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;override&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;string&lt;/span&gt; ToString() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;string&lt;/span&gt;.Format(&lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot;({0}, {1}, {2})&amp;quot;&lt;/span&gt;, _sideA, _sideB, _sideC);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;SideA, SideB, SideC represent 3 numbers of Pythagorean triple. Seed1 and Seed2 represent 2 input numbers to calculate the triple. And Size is multiplier of each side. For instance, if Size is 2, SideA, SideB, SideC are double.&lt;br /&gt;&lt;br /&gt;To generate primitive Pythagorean triple, Seed1 and Seed2 must be coprime, Seed1+Seed2 must be odd value, and Size must be 1. To find whether 2 integers are coprime, that 2 integers must have &lt;a href=&quot;http://en.wikipedia.org/wiki/Greatest_common_divisor&quot; target=&quot;_blank&quot;&gt;Greatest Common Divisor&lt;/a&gt; (GCD) equals to 1. This is the formula to calculate GCD.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New; color: blue&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New&quot;&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; Gcd(&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; a, &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; b) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;while&lt;/span&gt; (b != 0) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; r = a % b;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a = b;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; b = r;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; a;&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Put this function into your extension class.&lt;br /&gt;&lt;br /&gt;Now start creating Pythagorean sequence. Just put this few lines of code to create class.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New; color: blue&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New&quot;&gt; &lt;span style=&quot;color:blue&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Pythagorean&lt;/span&gt; : &lt;span style=&quot;color:#2B91AF&quot;&gt;BaseSequence&lt;/span&gt;&amp;lt;&lt;span style=&quot;color:#2B91AF&quot;&gt;PythagoreanTriple&lt;/span&gt;&amp;gt; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;protected&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;override&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style=&quot;color:#2B91AF&quot;&gt;PythagoreanTriple&lt;/span&gt;&amp;gt; Enumerate() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;for&lt;/span&gt; (&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; m = 2; ; m++) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;for&lt;/span&gt; (&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; n = (m % 2 == 0) ? 1 : 2; n &amp;lt; m; n += 2) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;if&lt;/span&gt; (&lt;span style=&quot;color:#2B91AF&quot;&gt;Math2&lt;/span&gt;.Gcd(m, n) == 1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;yield&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;PythagoreanTriple&lt;/span&gt;(m, n);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You can notice that if m is even, n starting number is odd, and vice versa. And n is incresed by 2 every turn. This makes m+n always be odd number. And before creating new triple, we check that m and n is coprime. Therefore, this class will generate sequence of only primitive Pythagorean triple.&lt;br /&gt;&lt;br /&gt;To create non-primitive Pythagorean triple, you can set Size of PythagoreanTriple to any positive integer. To calculate Size, you can find from dividing target SideC with current SideC, or dividing target Perimeter with current Perimeter.&lt;br /&gt;&lt;br /&gt;Here is example from &lt;a href=&quot;http://projecteuler.net&quot; target=&quot;_blank&quot;&gt;projecteuler.net&lt;/a&gt;&lt;br /&gt;&lt;em&gt;Find product abc of Pythagorean triplet, for which a + b + c = 1000.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New; color: blue&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New&quot;&gt; p = &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Pythagorean&lt;/span&gt;().First(x =&amp;gt; 1000 % x.Perimeter == 0);&lt;br /&gt;p = &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;PythagoreanTriple&lt;/span&gt;(p.Seed1, p.Seed2, 1000 / p.Perimeter);&lt;br /&gt;&lt;span style=&quot;color:#2B91AF&quot;&gt;Console&lt;/span&gt;.WriteLine(p.SideA * p.SideB * p.SideC);&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//31875000&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Example above, we find first Pythagorean triple which its perimeter can be the divisor of 1000. Then, we create new Pythagorean triple from the triple we just found with size 1000/perimeter. Finally, print result sideA * sideB * sideC.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;If p is the perimeter of a right angle triangle, {a, b, c}, which value, for p ≤ 1000, has the most solutions?&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New; color: blue&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New&quot;&gt;[] list = &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt;[1000];&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; maxSeed1 = (&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt;)&lt;span style=&quot;color:#2B91AF&quot;&gt;Math&lt;/span&gt;.Sqrt(500); &lt;span style=&quot;color:green&quot;&gt;//maxSeed1 = Sqrt(targetPerimeter/2)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Pythagorean&lt;/span&gt;().TakeWhile(p =&amp;gt; p.Seed1 &amp;lt;= maxSeed1).ForEach(p =&amp;gt; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;for&lt;/span&gt; (&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; i = p.Perimeter; i &amp;lt; 1000; i += p.Perimeter)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; list[i]++;&lt;br /&gt;});&lt;br /&gt;&lt;span style=&quot;color:#2B91AF&quot;&gt;Console&lt;/span&gt;.WriteLine(0.To(999).OrderByDescending(x =&amp;gt; list[x]).First());&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//840&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This problem, we must find how many items in the sequence we should generate. We should generate until last triple which its perimeter &lt;= 1000. To find last seed1 value that its perimeter = 1000, use formula Sqrt(targetPerimeter/2). Now, for each triple we generate, mark in the list that which number its perimeter can be. And then sort the list, to find which number has the highest mark.&lt;br /&gt;&lt;br /&gt;This post is an end of infinite sequence series. Next, we will go to totally different extension methods topic, which is extension methods for delegate types.</content><link rel='replies' type='application/atom+xml' href='http://chaowchaow.blogspot.com/feeds/104570442488258321/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1350724202700062730/104570442488258321' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350724202700062730/posts/default/104570442488258321'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350724202700062730/posts/default/104570442488258321'/><link rel='alternate' type='text/html' href='http://chaowchaow.blogspot.com/2008/01/infinite-sequence-part-v.html' title='Infinite Sequence Part V - Pythagorean Triple'/><author><name>Chaow</name><uri>http://www.blogger.com/profile/07962486640447233732</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350724202700062730.post-2659735336559998997</id><published>2008-01-04T22:51:00.010+07:00</published><updated>2008-07-18T16:32:52.938+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="prime"/><category scheme="http://www.blogger.com/atom/ns#" term="projecteuler"/><category scheme="http://www.blogger.com/atom/ns#" term="sequence"/><title type='text'>Infinite Sequence Part IV - Prime</title><content type='html'>Countinue from &lt;a href=&quot;http://chaowchaow.blogspot.com/2007/12/infinite-sequence-part-iii.html&quot; target=&quot;_blank&quot;&gt;last post&lt;/a&gt;, Fibonacci, which is considerable a simple sequence, because it uses only 2 preceding numbers to generate next number. This post, we move on to harder sequence which next number has to generate from all preceding numbers. The sequence is &lt;a href=&quot;http://en.wikipedia.org/wiki/Prime_number&quot; target=&quot;_blank&quot;&gt;Prime&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Prime is natural number which there is only 2 natural number divisors. The numbers are 1 and itself. Prime below 100 are 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97.&lt;br /&gt;&lt;br /&gt;The technique to store prime that I used is &lt;a href=&quot;http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes&quot; target=&quot;_blank&quot;&gt;Sieve of Eratosthenes&lt;/a&gt;. I had optimized it by skip all even numbers. Memory usage for storing prime is adaptable. Initial capacity is 1,024 odd numbers and it can be extended to 1,073,741,824 odd numbers which cover all interger values.&lt;br /&gt;&lt;br /&gt;Here is the code for class to store prime:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: blue;&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt; &lt;span style=&quot;color:blue&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;PrimeStore&lt;/span&gt; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;const&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; defaultCapacity = 1024;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:#2B91AF&quot;&gt;BitArray&lt;/span&gt; _store;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; _lastIndex;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; PrimeStore() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _store = &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;BitArray&lt;/span&gt;(defaultCapacity, &lt;span style=&quot;color:blue&quot;&gt;true&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; PrimeStore(&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; capacity) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _store = &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;BitArray&lt;/span&gt;(capacity, &lt;span style=&quot;color:blue&quot;&gt;true&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;bool&lt;/span&gt; IsPrime(&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; num) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;if&lt;/span&gt; (num &amp;lt; 2)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;false&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;if&lt;/span&gt; (num == 2)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;true&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;if&lt;/span&gt; ((num &amp;amp; 1) == 0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;false&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; index = (num - 3) &amp;gt;&amp;gt; 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;testPrime(index);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; _store.Get(index);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;void&lt;/span&gt; testPrime(&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; index) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;if&lt;/span&gt; (index &amp;lt;= _lastIndex)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ensureCapacity(index);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;for&lt;/span&gt; (&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; prime; _lastIndex &amp;lt; index; _lastIndex++) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;if&lt;/span&gt; (_store.Get(_lastIndex)) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; prime = (_lastIndex &amp;lt;&amp;lt; 1) + 3;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; applyPrime(prime, _lastIndex);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;void&lt;/span&gt; ensureCapacity(&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; index) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; lastIndex = _store.Count - 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;if&lt;/span&gt; (index &amp;lt;= lastIndex)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; newCapacity = _store.Count;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;while&lt;/span&gt; (index &amp;gt;= newCapacity)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; newCapacity = newCapacity * 2;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; newSize = newCapacity / 32;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt;[] array = &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt;[newSize];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _store.CopyTo(array, 0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;for&lt;/span&gt; (&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; i = _store.Count / 32; i &amp;lt; newSize; i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; array[i] = -1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _store = &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;BitArray&lt;/span&gt;(array);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;for&lt;/span&gt; (&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; i = 0, prime, num; i &amp;lt; _lastIndex; i++) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;if&lt;/span&gt; (_store.Get(i)) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; prime = (i &amp;lt;&amp;lt; 1) + 3;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; num = lastIndex - i;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; applyPrime(prime, num - (num % prime) + i);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;void&lt;/span&gt; applyPrime(&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; prime, &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; index) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; index += prime;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; capacity = _store.Count;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;for&lt;/span&gt; (; index &amp;lt; capacity &amp;amp;&amp;amp; index &amp;gt; 0; index += prime)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _store.Set(index, &lt;span style=&quot;color:blue&quot;&gt;false&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Usage of PrimeStore class is easy. Just pass a number to IsPrime method.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New; color: blue&quot;&gt;bool&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New&quot;&gt; isPrime = &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;PrimeStore&lt;/span&gt;().IsPrime(34567);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;But our objective is not just for test a prime number. We will generate prime sequence. Our prime sequence will use PrimeStore to store prime numbers. Any prime numbers beyond PrimeStore&#39;s capacity will be calculated by testing there is no prime divisor for that numbers. &lt;br /&gt;&lt;br /&gt;To limit growth of PrimeStore, I also defined MaxStoredValue. Default value is 65,536. Generating prime below MaxStoredValue is fast. Generating prime beyond MaxStoredValue but below MaxStoredValue^2 is acceptable speed. Generating prime beyond MaxStoredValue^2 is considerable slow. Default value is suited with general prime generation.&lt;br /&gt;&lt;br /&gt;Here is the prime sequence code:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: blue;&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;;&quot;&gt; &lt;span style=&quot;color:blue&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Prime&lt;/span&gt; : &lt;span style=&quot;color:#2B91AF&quot;&gt;BaseSequence&lt;/span&gt;&amp;lt;&lt;span style=&quot;color:blue&quot;&gt;long&lt;/span&gt;&amp;gt; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:#2B91AF&quot;&gt;PrimeStore&lt;/span&gt; _primeStore;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;const&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;long&lt;/span&gt; maxStoredValue = 2147483647L;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; Prime() { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _primeStore = &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;PrimeStore&lt;/span&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; Prime(&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; capacity) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _primeStore = &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;PrimeStore&lt;/span&gt;(capacity);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;protected&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;override&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style=&quot;color:blue&quot;&gt;long&lt;/span&gt;&amp;gt; Enumerate() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;yield&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; 2L;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;long&lt;/span&gt; value = 3L;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;yield&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; value;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;while&lt;/span&gt; (&lt;span style=&quot;color:blue&quot;&gt;true&lt;/span&gt;) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;do&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; value += 2L;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;while&lt;/span&gt; (!Contains(value));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;yield&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; value;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;bool&lt;/span&gt; Contains(&lt;span style=&quot;color:blue&quot;&gt;long&lt;/span&gt; value) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;if&lt;/span&gt; (value &amp;lt; maxStoredValue)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; _primeStore.IsPrime((&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt;)value);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; Factors(value).First() == value;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style=&quot;color:blue&quot;&gt;long&lt;/span&gt;&amp;gt; Factors(&lt;span style=&quot;color:blue&quot;&gt;long&lt;/span&gt; value) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;if&lt;/span&gt; (value &amp;lt; 2L)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;yield&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;using&lt;/span&gt; (&lt;span style=&quot;color:#2B91AF&quot;&gt;IEnumerator&lt;/span&gt;&amp;lt;&lt;span style=&quot;color:blue&quot;&gt;long&lt;/span&gt;&amp;gt; enumerator = Enumerate().GetEnumerator()) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; enumerator.MoveNext();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;long&lt;/span&gt; factor = enumerator.Current;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;long&lt;/span&gt; pow = factor * factor;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;long&lt;/span&gt; num = value;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;long&lt;/span&gt; mod, num2;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;while&lt;/span&gt; (num &amp;gt;= pow) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; num2 = &lt;span style=&quot;color:#2B91AF&quot;&gt;Math&lt;/span&gt;.DivRem(num, factor, &lt;span style=&quot;color:blue&quot;&gt;out&lt;/span&gt; mod);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;if&lt;/span&gt; (mod == 0L) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; num = num2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;yield&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; factor;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;span style=&quot;color:&lt;br /&gt;blue&quot;&gt;else&lt;/span&gt; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; enumerator.MoveNext();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; factor = enumerator.Current;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pow = factor * factor;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;yield&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; num;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Other methods beside generating prime sequence are Contains method and Factors method. Contains method is to test whether a number is prime. And Factors method is to enumerate prime factors for a number.&lt;br /&gt;&lt;br /&gt;As usual, test prime sequence with &lt;a href=&quot;http://projecteuler.net/&quot; target=&quot;_blank&quot;&gt;projecteuler.net&lt;/a&gt;.&lt;br /&gt;&lt;em&gt;Find the largest prime factor of 317584931803.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New; color: #2B91AF&quot;&gt;Console&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New&quot;&gt;.WriteLine(&lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Prime&lt;/span&gt;().Factors(317584931803).Max());&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//3919&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Find the 10001&lt;sup&gt;st&lt;/sup&gt; prime.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New; color: #2B91AF&quot;&gt;Console&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New&quot;&gt;.WriteLine(&lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Prime&lt;/span&gt;().ElementAt(10000));&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//(10000 is index of position 10001st)&lt;br /&gt;//104743&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Even creating a prime sequence has many details, but using of prime sequence is simple and fast.&lt;br /&gt;&lt;br /&gt;Next we will create sequence which is not the number. Continue next post :)</content><link rel='replies' type='application/atom+xml' href='http://chaowchaow.blogspot.com/feeds/2659735336559998997/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1350724202700062730/2659735336559998997' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350724202700062730/posts/default/2659735336559998997'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350724202700062730/posts/default/2659735336559998997'/><link rel='alternate' type='text/html' href='http://chaowchaow.blogspot.com/2008/01/infinite-sequence-part-iv.html' title='Infinite Sequence Part IV - Prime'/><author><name>Chaow</name><uri>http://www.blogger.com/profile/07962486640447233732</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350724202700062730.post-2552424118683308114</id><published>2007-12-29T15:13:00.001+07:00</published><updated>2008-06-14T10:07:08.074+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="biginteger"/><category scheme="http://www.blogger.com/atom/ns#" term="fibonacci"/><category scheme="http://www.blogger.com/atom/ns#" term="projecteuler"/><category scheme="http://www.blogger.com/atom/ns#" term="sequence"/><title type='text'>Infinite Sequence Part III - Fibonacci</title><content type='html'>&lt;a href=&quot;http://chaowchaow.blogspot.com/2007/12/infinite-sequence-part-ii.html&quot; target=&quot;_blank&quot;&gt;Last post&lt;/a&gt;, I had described about how to create based class for infinite sequence, and create a simple generic sequence. This post, we will move on to &lt;a href=&quot;http://en.wikipedia.org/wiki/Fibonacci_number&quot; target=&quot;_blank&quot;&gt;Fibonacci&lt;/a&gt; sequence.&lt;br /&gt;&lt;br /&gt;Each Fibonacci number is the sum of 2 preceding number. First and second Fibonacci numbers are 0 and 1. Third Fibonacci number is the sum of First and Second (0+1) equal to 1. And forth Fibonacci number is the sum of Second and Third number (1+1) equal to 2. First 20 Fibonacci numbers are 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181.&lt;br /&gt;&lt;br /&gt;Now let&#39;s start coding Fibonacci.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New; color: blue&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New&quot;&gt; &lt;span style=&quot;color:blue&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Fibonacci&lt;/span&gt; : &lt;span style=&quot;color:#2B91AF&quot;&gt;BaseSequence&lt;/span&gt;&amp;lt;&lt;span style=&quot;color:#2B91AF&quot;&gt;BigInteger&lt;/span&gt;&amp;gt; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;protected&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;override&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style=&quot;color:#2B91AF&quot;&gt;BigInteger&lt;/span&gt;&amp;gt; Enumerate() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:#2B91AF&quot;&gt;BigInteger&lt;/span&gt; value = &lt;span style=&quot;color:#2B91AF&quot;&gt;BigInteger&lt;/span&gt;.Zero;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:#2B91AF&quot;&gt;BigInteger&lt;/span&gt; value2 = &lt;span style=&quot;color:#2B91AF&quot;&gt;BigInteger&lt;/span&gt;.One;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;yield&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; value;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;yield&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; value2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;while&lt;/span&gt; (&lt;span style=&quot;color:blue&quot;&gt;true&lt;/span&gt;) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; value += value2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;yield&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; value;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; value2 += value; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;yield&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; value2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Just few lines of code, Fibonacci sequence is finished! Value and value2 return value alternately. Value variable return value in odd position. And value2 return value in even position.&lt;br /&gt;&lt;br /&gt;Test Fibonacci sequence with &lt;a href=&quot;http://projecteuler.net&quot; target=&quot;_blank&quot;&gt;projecteuler.net&lt;/a&gt; questions.&lt;br /&gt;&lt;em&gt;Find the sum of all the even-valued terms in the Fibonacci sequence which do not exceed one million.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New; color: #2B91AF&quot;&gt;Console&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New&quot;&gt;.WriteLine(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Fibonacci&lt;/span&gt;().TakeWhile(x =&amp;gt; x &amp;lt; 1000000).Where(x =&amp;gt; x % 2 == 0).Sum()&lt;br /&gt;);&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//1089154&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;What is the first term in the Fibonacci sequence to contain 1000 digits?&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New; color: #2B91AF&quot;&gt;Console&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New&quot;&gt;.WriteLine(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Fibonacci&lt;/span&gt;().TakeWhile(x =&amp;gt; x.ToString(10).Length &amp;lt; 1000).Count()&lt;br /&gt;);&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//4782&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Next post, we will go to much harder sequence, which is Prime sequence.</content><link rel='replies' type='application/atom+xml' href='http://chaowchaow.blogspot.com/feeds/2552424118683308114/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1350724202700062730/2552424118683308114' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350724202700062730/posts/default/2552424118683308114'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350724202700062730/posts/default/2552424118683308114'/><link rel='alternate' type='text/html' href='http://chaowchaow.blogspot.com/2007/12/infinite-sequence-part-iii.html' title='Infinite Sequence Part III - Fibonacci'/><author><name>Chaow</name><uri>http://www.blogger.com/profile/07962486640447233732</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350724202700062730.post-6972090594390299405</id><published>2007-12-25T01:23:00.001+07:00</published><updated>2008-06-14T10:07:08.074+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="projecteuler"/><category scheme="http://www.blogger.com/atom/ns#" term="sequence"/><title type='text'>Infinite Sequence Part II - GenericSequence</title><content type='html'>&lt;a href=&quot;http://chaowchaow.blogspot.com/2007/12/infinite-sequence-part-i-introduction.html&quot; target=&quot;_blank&quot;&gt;Last post&lt;/a&gt;, I had introduce about infinite sequence. Infinite sequence is list that has infinity items. This part I will show how to create class for infinite sequence. Now let&#39;s start coding.&lt;br /&gt;&lt;br /&gt;Begin with creating the based class. Its based class name is BaseSequence and it is generic typed. This class represents based class of all sequences.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New&quot;&gt;&lt;span style=&quot;color: green&quot;&gt;//Fix: 2008-03-08 - Cut off unused ..OrDefault methods&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;abstract&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;BaseSequence&lt;/span&gt;&amp;lt;T&amp;gt; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;protected&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;abstract&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; Enumerate();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; T ElementAt(&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; index) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; Enumerate().ElementAt(index);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; T First() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; Enumerate().First();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; T First(&lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T, &lt;span style=&quot;color:blue&quot;&gt;bool&lt;/span&gt;&amp;gt; predicate) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; Enumerate().First(predicate);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; Take(&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; count) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; Enumerate().Take(count);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; TakeWhile(&lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T, &lt;span style=&quot;color:blue&quot;&gt;bool&lt;/span&gt;&amp;gt; predicate) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; Enumerate().TakeWhile(predicate);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; TakeWhile(&lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T, &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt;, &lt;span style=&quot;color:blue&quot;&gt;bool&lt;/span&gt;&amp;gt; predicate) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; Enumerate().TakeWhile(predicate);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Enumerate method will enumerate items indefinitely. Therefore, we have to declare it as protected. And we also have to provide methods that is able to enumerate and break from loop for a certain criteria. ElementAt method get item for a specific index. First method get the first item. Take method get list of items for a specific criteria.&lt;br /&gt;&lt;br /&gt;And now create an easy derived class called GenericSequence. This class lets user passes a function to generate next items. User can also pass seed value, in order to set the initial value.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New; color: blue&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New&quot;&gt; &lt;span style=&quot;color:blue&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;GenericSequence&lt;/span&gt;&amp;lt;T&amp;gt; : &lt;span style=&quot;color:#2B91AF&quot;&gt;BaseSequence&lt;/span&gt;&amp;lt;T&amp;gt; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T, T&amp;gt; _func;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; T _seed;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; GenericSequence(&lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T, T&amp;gt; func) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _seed = &lt;span style=&quot;color:blue&quot;&gt;default&lt;/span&gt;(T);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _func = func;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; GenericSequence(T seed, &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T, T&amp;gt; func) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _seed = seed;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _func = func;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;protected&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;override&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; Enumerate() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; T value = _seed;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;yield&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; value;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;while&lt;/span&gt; (&lt;span style=&quot;color:blue&quot;&gt;true&lt;/span&gt;) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; value = _func(value);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;yield&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; value;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now test the class with question from &lt;a href=&quot;http://projecteuler.net/&quot; target=&quot;_blank&quot;&gt;projecteuler.net&lt;/a&gt; again :)&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Find the longest sequence using a starting number under one million.&lt;br /&gt;Defined n = n/2 (n is even)&lt;br /&gt;and n = 3n + 1 (n is odd)&lt;br /&gt;Finish when n is 1&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New; color: green&quot;&gt;//y is even (y = y/2), y is odd (y = 3y + 1)&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New; color: #2B91AF&quot;&gt;Func&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New&quot;&gt;&amp;lt;&lt;span style=&quot;color:blue&quot;&gt;long&lt;/span&gt;, &lt;span style=&quot;color:blue&quot;&gt;long&lt;/span&gt;&amp;gt; sequenceFunc = y =&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (y % 2 == 0) ? y / 2 : y * 3 + 1;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//Count sequence length&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt;, &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt;&amp;gt; countSequence = x =&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;GenericSequence&lt;/span&gt;&amp;lt;&lt;span style=&quot;color:blue&quot;&gt;long&lt;/span&gt;&amp;gt;(x, sequenceFunc)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .TakeWhile(y =&amp;gt; y &amp;gt; 1)&amp;nbsp; &lt;span style=&quot;color:green&quot;&gt;//Take until y = 1&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Count();&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:green&quot;&gt;//Count the length&lt;br /&gt;&lt;br /&gt;//Print out&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#2B91AF&quot;&gt;Console&lt;/span&gt;.WriteLine(1.To(999999)&amp;nbsp; &lt;span style=&quot;color:green&quot;&gt;//Test all values &amp;lt; 1 million&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .OrderByDescending(countSequence)&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:green&quot;&gt;//sort by count length&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .First()&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:green&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//Get only highest count&lt;br /&gt;&lt;/span&gt;);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Or in short&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New; color: #2B91AF&quot;&gt;Console&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New&quot;&gt;.WriteLine(1.To(999999).OrderByDescending(x =&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;GenericSequence&lt;/span&gt;&amp;lt;&lt;span style=&quot;color:blue&quot;&gt;long&lt;/span&gt;&amp;gt;(x, y =&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (y % 2 == 0) ? y / 2 : y * 3 + 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ).TakeWhile(y =&amp;gt; y &amp;gt; 1).Count()&lt;br /&gt;).First());&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//837799&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We can completed the question in one statement, even it may looked complicated. Anyway, if you create many nested loops it is also complicated and even harder to read. &lt;br /&gt;&lt;br /&gt;Next post, we will create Fibonacci sequence ;)</content><link rel='replies' type='application/atom+xml' href='http://chaowchaow.blogspot.com/feeds/6972090594390299405/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1350724202700062730/6972090594390299405' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350724202700062730/posts/default/6972090594390299405'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350724202700062730/posts/default/6972090594390299405'/><link rel='alternate' type='text/html' href='http://chaowchaow.blogspot.com/2007/12/infinite-sequence-part-ii.html' title='Infinite Sequence Part II - GenericSequence'/><author><name>Chaow</name><uri>http://www.blogger.com/profile/07962486640447233732</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350724202700062730.post-6071157397092233386</id><published>2007-12-21T12:46:00.000+07:00</published><updated>2008-06-14T10:07:08.075+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="sequence"/><title type='text'>Infinite Sequence Part I - Introduction</title><content type='html'>Sequence includes finite sequence and infinite sequence. Finite sequence is a set. There are many classes in .NET that represent set such as Array, List, &amp; Collection. With classes, you can reuse its functionality. Such as you want to find whether an object is in a list you can write:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New; color: blue&quot;&gt;bool&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New&quot;&gt; exists = list.Contains(obj);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Or if you want to enumerate for first 10 objects:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New; color: blue&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New&quot;&gt; newList = list.Take(10);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Infinite sequence is infinity-members of list. Basic sample of infinite sequence is Natural numbers (1,2,3,...), Odd numbers (1,3,5,...), &amp; Even numbers (2,4,6,...). But how can you represent infinite sequence into class? Such as if I want to find whether is 4 in Odd numbers, can I write?:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New; color: blue&quot;&gt;bool&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New&quot;&gt; exists = oddNumbers.Contains(4);&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New; color: green&quot;&gt;//false&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Or take first 10 numbers in Odd sequence:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New; color: blue&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New&quot;&gt; tenOdd = oddNumbers.Take(10);&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New; color: green&quot;&gt;//{1,3,5,7,9,11,13,15,17,19}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Most of the time, if you deal with above questions, you may rather write:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New; color: blue&quot;&gt;bool&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New&quot;&gt; isOdd = 4 % 2 == 1&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;and&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New; color: blue&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New&quot;&gt; (&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; i = 1; i &amp;lt;= 19; i += 2)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;That means you have to know functionality of the sequence in order to use it. And you have to rewrite the function everytime. Odd and Even numbers are simple. How about Fibonacci and Prime sequence? Their incremental is not linear. And to check members in the list is more complex. &lt;br /&gt;&lt;br /&gt;Is it easier if we can check a number prime list the same as we check in simple List?&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New; color: blue&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New&quot;&gt; isPrime = prime.Contains(34567);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;And get the first 1000 Fibonacci value without having to write codes to generate Fibonacci value everytime.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New; color: blue&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New&quot;&gt; milFib = fib.Take(1000);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;How can you represent infinite sequence into class?&lt;br /&gt;Continue next post :)</content><link rel='replies' type='application/atom+xml' href='http://chaowchaow.blogspot.com/feeds/6071157397092233386/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1350724202700062730/6071157397092233386' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350724202700062730/posts/default/6071157397092233386'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350724202700062730/posts/default/6071157397092233386'/><link rel='alternate' type='text/html' href='http://chaowchaow.blogspot.com/2007/12/infinite-sequence-part-i-introduction.html' title='Infinite Sequence Part I - Introduction'/><author><name>Chaow</name><uri>http://www.blogger.com/profile/07962486640447233732</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350724202700062730.post-3438365226600726626</id><published>2007-12-19T22:37:00.001+07:00</published><updated>2008-06-14T10:07:08.075+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="biginteger"/><category scheme="http://www.blogger.com/atom/ns#" term="extension"/><category scheme="http://www.blogger.com/atom/ns#" term="projecteuler"/><title type='text'>BigInteger, an integer with unbounded length</title><content type='html'>Usaully, when you think of number, Int32 almost covers all requirements. Its maximum value is 2,147,483,647. It almost never overflow. Int32 is not enough? That&#39;s very rare case. But you can using Int64 which its maximum value is 9,223,372,036,854,775,807 which considers an extreamly large number. Is it possible that an operation will make Int64 be overflown? It is possible. In mathematics and cryptography, large precision calculation is needed, and data length of an integer can be extended indefinitely.&lt;br /&gt;&lt;br /&gt;Which type shall we use next to Int64? If your answer is Int128, the answer is wrong. Next class we gonna use has no length limitation. It is an integer with unbounded length. This type is called &lt;a href=&quot;http://blogs.msdn.com/bclteam/archive/2007/01/16/introducing-system-numeric-biginteger-inbar-gazit.aspx&quot; target=&quot;_blank&quot;&gt;BigInteger&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;BigInteger is not included in current C# package. But now you can find BigInteger in &lt;a href=&quot;http://silverlight.net/&quot; target=&quot;_blank&quot;&gt;Silverlight&lt;/a&gt; package. Once you install Silverlight, BigInteger can be found in [drive]:\Program Files\Microsoft Silverlight\Microsoft.Scripting.dll under the namespace Microsoft.Scripting.Math.&lt;br /&gt;&lt;br /&gt;Let&#39;s play around BigInteger (question from &lt;a href=&quot;http://projecteuler.net&quot; target=&quot;_blank&quot;&gt;projecteuler.net&lt;/a&gt;) :)&lt;br /&gt;&lt;em&gt;Find the sum of digits in 100!&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New; color: #2B91AF&quot;&gt;BigInteger&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New&quot;&gt; bigInt = 1;&lt;br /&gt;100.DownTo(2).ForEach(x =&amp;gt; bigInt *= x);&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:green&quot;&gt;//Factorial 100!&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color:#2B91AF&quot;&gt;Console&lt;/span&gt;.WriteLine(bigInt.ToString(10).Sum(c =&amp;gt; (&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt;)(c - &lt;span style=&quot;color:#A31515&quot;&gt;&#39;0&#39;&lt;/span&gt;)));&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:green&quot;&gt;//Sum of Digit&lt;br /&gt;//648&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;More question :)&lt;br /&gt;&lt;em&gt;What is the sum of the digits of the number 2&lt;sup&gt;1000&lt;/sup&gt;?&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New; color: #2B91AF&quot;&gt;BigInteger&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New&quot;&gt; bi = 1;&lt;br /&gt;1000.Times(x =&amp;gt; bi *= 2);&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:green&quot;&gt;//2&lt;sup&gt;1000&lt;/sup&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color:#2B91AF&quot;&gt;Console&lt;/span&gt;.WriteLine(bi.ToString(10).Sum(c =&amp;gt; (&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt;)(c - &lt;span style=&quot;color:#A31515&quot;&gt;&#39;0&#39;&lt;/span&gt;)));&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:green&quot;&gt;//Sum of Digit&lt;br /&gt;//1366&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Factorial of 100 and 2 power by 1000, Int64 is generally unable to handle above questions. But BigInteger can handle it easily and fast.&lt;br /&gt;&lt;br /&gt;As a bonus, I had written some Extensions for BigInteger. First method is for getting sum of a list of BigInteger.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New; color: blue&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New&quot;&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;BigInteger&lt;/span&gt; Sum(&lt;span style=&quot;color:blue&quot;&gt;this&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style=&quot;color:#2B91AF&quot;&gt;BigInteger&lt;/span&gt;&amp;gt; source) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:#2B91AF&quot;&gt;BigInteger&lt;/span&gt; num = &lt;span style=&quot;color:#2B91AF&quot;&gt;BigInteger&lt;/span&gt;.Zero;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;foreach&lt;/span&gt; (&lt;span style=&quot;color:#2B91AF&quot;&gt;BigInteger&lt;/span&gt; num2 &lt;span style=&quot;color:blue&quot;&gt;in&lt;/span&gt; source)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; num += num2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; num;&lt;br /&gt;}&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;BigInteger&lt;/span&gt; Sum&amp;lt;T&amp;gt;(&lt;span style=&quot;color:blue&quot;&gt;this&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; source, &lt;span style=&quot;color:#2B91AF&quot;&gt;Func&lt;/span&gt;&amp;lt;T,&lt;span style=&quot;color:#2B91AF&quot;&gt;BigInteger&lt;/span&gt;&amp;gt; selector) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; source.Select(selector).Sum();&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Usage:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New; color: blue&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New&quot;&gt; list = &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;BigInteger&lt;/span&gt;[] { 1, 2, 3 };&lt;br /&gt;&lt;span style=&quot;color:#2B91AF&quot;&gt;Console&lt;/span&gt;.WriteLine(list.Sum());&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//6&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Next method is for parsing string into BigInteger:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New&quot;&gt;&lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;BigInteger&lt;/span&gt; Parse(&lt;span style=&quot;color:blue&quot;&gt;string&lt;/span&gt; s) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;using&lt;/span&gt; (System.IO.&lt;span style=&quot;color:#2B91AF&quot;&gt;StringReader&lt;/span&gt; reader = &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; System.IO.&lt;span style=&quot;color:#2B91AF&quot;&gt;StringReader&lt;/span&gt;(s)) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;char&lt;/span&gt;[] buffer = &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;char&lt;/span&gt;[10];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; startIndex = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;uint&lt;/span&gt;[] multiplier = { 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 };&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; count = reader.ReadBlock(buffer, 0, 9);&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#2B91AF&quot;&gt;BigInteger&lt;/span&gt; ret = &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt;.Parse(&lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;string&lt;/span&gt;(buffer, 0, count));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;if&lt;/span&gt; (ret.IsNegative())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; startIndex = 1;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;while&lt;/span&gt; (count == 9) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; count = reader.ReadBlock(buffer, startIndex, 9);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret *= multiplier[count];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;ret += &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt;.Parse(&lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;string&lt;/span&gt;(buffer, 0, count + startIndex));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; ret;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;bool&lt;/span&gt; TryParse(&lt;span style=&quot;color:blue&quot;&gt;string&lt;/span&gt; s, &lt;span style=&quot;color:blue&quot;&gt;out&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;BigInteger&lt;/span&gt; result) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;try&lt;/span&gt; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; result = Parse(s);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;true&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;span style=&quot;color:blue&quot;&gt;catch&lt;/span&gt; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; result = &lt;span style=&quot;color:blue&quot;&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;false&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Usage&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New; color: #2B91AF&quot;&gt;BigInteger&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; line-height: 115%; font-family: Courier New&quot;&gt; i = &lt;span style=&quot;color:#2B91AF&quot;&gt;BigIntegerExtension&lt;/span&gt;.Parse(&lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot;1234567890&amp;quot;&lt;/span&gt;);&lt;br /&gt;&lt;span style=&quot;color:#2B91AF&quot;&gt;Console&lt;/span&gt;.WriteLine(i);&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//1234567890&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Next post, I will show you somethings bigger than BigInteger :)</content><link rel='replies' type='application/atom+xml' href='http://chaowchaow.blogspot.com/feeds/3438365226600726626/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1350724202700062730/3438365226600726626' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350724202700062730/posts/default/3438365226600726626'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350724202700062730/posts/default/3438365226600726626'/><link rel='alternate' type='text/html' href='http://chaowchaow.blogspot.com/2007/12/biginteger.html' title='BigInteger, an integer with unbounded length'/><author><name>Chaow</name><uri>http://www.blogger.com/profile/07962486640447233732</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350724202700062730.post-7821040562362992394</id><published>2007-12-16T06:45:00.001+07:00</published><updated>2008-06-14T10:07:08.075+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="enumerable"/><category scheme="http://www.blogger.com/atom/ns#" term="extension"/><category scheme="http://www.blogger.com/atom/ns#" term="projecteuler"/><title type='text'>How to use Extension Methods to extend C# language</title><content type='html'>Start my first blog with coding!&lt;br /&gt;&lt;br /&gt;Usually, when we want to extend a type, we need to create a new derived type. But creating a new derived type, sometimes it is not suitable. Sometimes the extensions are so small, sometimes types are sealed and unable to be extended. Another solution is you can create new static methods. But those methods are not become parts of the type. New Visual Studio 2008 has a new feature enables you to add new methods without having to derive a type and able to create new methods that will become a part of the type. This new feature called &quot;&lt;a href=&quot;http://en.wikipedia.org/wiki/Extension_method&quot; target=&quot;_blank&quot;&gt;Extension Methods&lt;/a&gt;&quot;. &lt;br /&gt;&lt;br /&gt;Interesting point is, we can use &quot;Extension Methods&quot; to enhance built-in types like int or IEnumerable. And that could change style of coding which totally different from C# 2.0. Do you know &lt;a href=&quot;http://www.ruby-lang.org/&quot; target=&quot;_blank&quot;&gt;Ruby&lt;/a&gt;? Ruby is a programming language that is short and easy. Let&#39;s make C# to be as easy as Ruby.&lt;br /&gt;&lt;br /&gt;Start with foreach. When you enumerate items in a list you use:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family:Courier New;font-size:10.0pt;color:blue;&quot;&gt;foreach&lt;/span&gt;&lt;span style=&quot;font-family:Courier New;font-size:10.0pt;&quot;&gt; (&lt;span style=&quot;color:#2b91af;&quot;&gt;Object&lt;/span&gt; item &lt;span style=&quot;color:blue;&quot;&gt;in&lt;/span&gt; list)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;But not in Ruby, in Ruby we just write:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family:Courier New;font-size:10.0pt;&quot;&gt;list.each{|item| ...}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;How easy! To make code like Ruby, put this source on your extension class.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family:Courier New;font-size:10.0pt;color:blue;&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;font-family:Courier New;font-size:10.0pt;&quot;&gt; &lt;span style=&quot;color:blue;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:blue;&quot;&gt;void&lt;/span&gt; ForEach&amp;lt;T&amp;gt;(&lt;span style=&quot;color:blue;&quot;&gt;this&lt;/span&gt; &lt;span style=&quot;color:#2b91af;&quot;&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; source, &lt;span style=&quot;color:#2b91af;&quot;&gt;Action&lt;/span&gt;&amp;lt;T&amp;gt; action) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue;&quot;&gt;foreach&lt;/span&gt; (T item &lt;span style=&quot;color:blue;&quot;&gt;in&lt;/span&gt; source)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; action(item);&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:Courier New;font-size:10.0pt;color:blue;&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;font-family:Courier New;font-size:10.0pt;&quot;&gt; &lt;span style=&quot;color:blue;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:blue;&quot;&gt;void&lt;/span&gt; ForEach&amp;lt;T&amp;gt;(&lt;span style=&quot;color:blue;&quot;&gt;this&lt;/span&gt; &lt;span style=&quot;color:#2b91af;&quot;&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; source, &lt;span style=&quot;color:#2b91af;&quot;&gt;Action&lt;/span&gt;&amp;lt;T, &lt;span style=&quot;color:blue;&quot;&gt;int&lt;/span&gt;&amp;gt; action) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue;&quot;&gt;int&lt;/span&gt; i = 0;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue;&quot;&gt;foreach&lt;/span&gt; (T item &lt;span style=&quot;color:blue;&quot;&gt;in&lt;/span&gt; source)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; action(item, i++);&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;After extension, you can write:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family:Courier New;font-size:10.0pt;&quot;&gt;list.ForEach(item =&amp;gt; ...);&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family:Courier New;font-size:10.0pt;&quot;&gt;list.ForEach((item,index)=&amp;gt; ...);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Here is the example:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family:Courier New;font-size:10.0pt;color:blue;&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;font-family:Courier New;font-size:10.0pt;&quot;&gt;[] persons = &lt;span style=&quot;color:blue;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color:blue;&quot;&gt;string&lt;/span&gt;[] {&lt;span style=&quot;color:#a31515;&quot;&gt;&quot;Jack&quot;&lt;/span&gt;, &lt;span style=&quot;color:#a31515;&quot;&gt;&quot;Lisa&quot;&lt;/span&gt;, &lt;span style=&quot;color:#a31515;&quot;&gt;&quot;Ryan&quot;&lt;/span&gt;};&lt;br /&gt;persons.ForEach(person =&amp;gt; &lt;span style=&quot;color:#2b91af;&quot;&gt;Console&lt;/span&gt;.WriteLine(&lt;span style=&quot;color:#a31515;&quot;&gt;&quot;Hello {0}!&quot;&lt;/span&gt;, person));&lt;br /&gt;&lt;span style=&quot;color:green;&quot;&gt;//Hello Jack!&lt;br /&gt;//Hello Lisa!&lt;br /&gt;//Hello Ryan!&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family:Courier New;font-size:10.0pt;&quot;&gt;persons.ForEach((person, index) =&amp;gt; &lt;span style=&quot;color:#2b91af;&quot;&gt;Console&lt;/span&gt;.WriteLine(&lt;span style=&quot;color:#a31515;&quot;&gt;&quot;{0}. {1}&quot;&lt;/span&gt;, index + 1, person));&lt;br /&gt;&lt;span style=&quot;color:green;&quot;&gt;//1. Jack&lt;br /&gt;//2. Lisa&lt;br /&gt;//3. Ryan&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Is that ok with you? If you like Ruby style go to next method. When we run number 0 to 2 (run 3 loop) we usaully write:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New; color: blue&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New&quot;&gt; (&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; i = 0; i &amp;lt;= 2; i++)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ruby is much easily:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family:Courier New;font-size:10.0pt;&quot;&gt;0..2&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;or&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family:Courier New;font-size:10.0pt;&quot;&gt;3.times{|x| ..}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Jealous? Put this source on your extension class:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New; color: blue&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New&quot;&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt;&amp;gt; To(&lt;span style=&quot;color:blue&quot;&gt;this&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; from, &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; to) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;for&lt;/span&gt; (&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; x = from; x &amp;lt;= to; x++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;yield&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; x;&lt;br /&gt;}&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt;&amp;gt; DownTo(&lt;span style=&quot;color:blue&quot;&gt;this&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; from, &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; to) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;for&lt;/span&gt; (&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; x = from; x &amp;gt;= to; x--)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;yield&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; x;&lt;br /&gt;}&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt;&amp;gt; StepTo(&lt;span style=&quot;color:blue&quot;&gt;this&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; from, &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; to, &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; step) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;if&lt;/span&gt; (step &amp;gt; 0) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;for&lt;/span&gt; (&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; x = from; x &amp;lt;= to; x += step)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;yield&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; x;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;span style=&quot;color:blue&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;if&lt;/span&gt; (step &amp;lt; 0) {&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:blue&quot;&gt;for&lt;/span&gt; (&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; x = from; x &amp;gt;= to; x += step)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;yield&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;return&lt;/span&gt; x;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;span style=&quot;color:blue&quot;&gt;else&lt;/span&gt; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;throw&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;ArgumentException&lt;/span&gt;(&lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot;Step cannot be zero.&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot;step&amp;quot;&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;span style=&quot;color:blue&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;void&lt;/span&gt; Times(&lt;span style=&quot;color:blue&quot;&gt;this&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; num, &lt;span style=&quot;color:#2B91AF&quot;&gt;Action&lt;/span&gt;&amp;lt;&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt;&amp;gt; action) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color:blue&quot;&gt;for&lt;/span&gt; (&lt;span style=&quot;color:blue&quot;&gt;int&lt;/span&gt; x = 0; x &amp;lt; num; x++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; action(x);&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now you can write:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New; color: blue&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New&quot;&gt;[] persons = &lt;span style=&quot;color:blue&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color:blue&quot;&gt;string&lt;/span&gt;[] { &lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot;Jack&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot;Lisa&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color:#A31515&quot;&gt;&amp;quot;Ryan&amp;quot;&lt;/span&gt; };&lt;br /&gt;0.To(2).ForEach(i =&amp;gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Console&lt;/span&gt;.WriteLine(persons[i]));&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//Jack&lt;br /&gt;//Lisa&lt;br /&gt;//Ryan&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;2.DownTo(0).ForEach(i =&amp;gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Console&lt;/span&gt;.WriteLine(persons[i]));&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//Ryan&lt;br /&gt;//Lisa&lt;br /&gt;//Jack&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;0.StepTo(2, 2).ForEach(i =&amp;gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Console&lt;/span&gt;.WriteLine(persons[i]));&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//Ryan&lt;br /&gt;//Jack&lt;br /&gt;//(run 0 to 2 with step 2)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;3.Times(i =&amp;gt; &lt;span style=&quot;color:#2B91AF&quot;&gt;Console&lt;/span&gt;.WriteLine(persons[i]));&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//Jack&lt;br /&gt;//Lisa&lt;br /&gt;//Ryan&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Try practical use, with question from &lt;a href=&quot;http://projecteuler.net&quot; target=&quot;_blank&quot;&gt;projecteuler.net&lt;/a&gt;.&lt;br /&gt;&lt;em&gt;Add all the natural numbers below 1000 that are multiples of 3 or 5.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New; color: #2B91AF&quot;&gt;Console&lt;/span&gt;&lt;span style=&quot;font-size: 10.0pt; font-family: Courier New&quot;&gt;.WriteLine(1.&lt;strong&gt;To&lt;/strong&gt;(999).Where(x =&amp;gt; (x % 3 == 0) || (x % 5 == 0)).Sum());&lt;br /&gt;&lt;span style=&quot;color:green&quot;&gt;//233168&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now we can completed question above with only one line of code. If you use C# 2.0, you will never write code like this. There are more several methods that you can extend C# from Ruby (or any other languages). Make your code shorter, your life will be easier.</content><link rel='replies' type='application/atom+xml' href='http://chaowchaow.blogspot.com/feeds/7821040562362992394/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1350724202700062730/7821040562362992394' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350724202700062730/posts/default/7821040562362992394'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350724202700062730/posts/default/7821040562362992394'/><link rel='alternate' type='text/html' href='http://chaowchaow.blogspot.com/2007/12/basic-method-extensions.html' title='How to use Extension Methods to extend C# language'/><author><name>Chaow</name><uri>http://www.blogger.com/profile/07962486640447233732</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>