<?xml version='1.0' encoding='utf-8'?>
<feed xmlns='http://www.w3.org/2005/Atom'>
 
 <title>Eric Woroshow</title>
 <link href='http://ericw.ca/atom.xml' rel='self'/>
 <link href='http://ericw.ca/'/>
 <updated>2011-12-12T23:30:24-08:00</updated>
 <id>http://ericw.ca</id>
 <author>
   <name>Eric Woroshow</name>
   <email>eric@ericw.ca</email>
 </author>

 
 <entry>
   <title>Powers of Four in C#</title>
   <link href='http://ericw.ca/notes/powers-of-four-in-csharp.html'/>
   <updated>2010-09-17T00:00:00-07:00</updated>
   <id>http://ericw.ca/notes/powers-of-four-in-csharp</id>
   <content type='html'>&lt;p&gt;I recently implemented a function in C# to check if an unsigned integer is a power of four as a part of my new game and I wanted to share two possible implementations. The first relies on the fact that a power of four (1) has only a single bit set and (2) has an even number of zero bits after the one.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='csharp'&gt;    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='k'&gt;static&lt;/span&gt; &lt;span class='kt'&gt;bool&lt;/span&gt; &lt;span class='nf'&gt;IsPowerOfFour&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kt'&gt;uint&lt;/span&gt; &lt;span class='n'&gt;n&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
    &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;n&lt;/span&gt; &lt;span class='p'&gt;!=&lt;/span&gt; &lt;span class='m'&gt;0&lt;/span&gt; &lt;span class='p'&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;n&lt;/span&gt; &lt;span class='p'&gt;&amp;amp;&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;n&lt;/span&gt; &lt;span class='p'&gt;-&lt;/span&gt; &lt;span class='m'&gt;1&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt; &lt;span class='p'&gt;==&lt;/span&gt; &lt;span class='m'&gt;0&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='c1'&gt;// single bit set&lt;/span&gt;
        &lt;span class='p'&gt;{&lt;/span&gt;
            &lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;count&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='m'&gt;0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
            &lt;span class='k'&gt;while&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;n&lt;/span&gt; &lt;span class='p'&gt;&amp;gt;&lt;/span&gt; &lt;span class='m'&gt;1&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
            &lt;span class='p'&gt;{&lt;/span&gt;
                &lt;span class='n'&gt;n&lt;/span&gt; &lt;span class='p'&gt;&amp;gt;&amp;gt;=&lt;/span&gt; &lt;span class='m'&gt;1&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
                &lt;span class='n'&gt;count&lt;/span&gt; &lt;span class='p'&gt;+=&lt;/span&gt; &lt;span class='m'&gt;1&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
            &lt;span class='p'&gt;}&lt;/span&gt;
            &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;count&lt;/span&gt; &lt;span class='p'&gt;%&lt;/span&gt; &lt;span class='m'&gt;2&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;==&lt;/span&gt; &lt;span class='m'&gt;0&lt;/span&gt; &lt;span class='p'&gt;?&lt;/span&gt; &lt;span class='k'&gt;true&lt;/span&gt; &lt;span class='p'&gt;:&lt;/span&gt; &lt;span class='k'&gt;false&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='c1'&gt;// even zero bits&lt;/span&gt;
        &lt;span class='p'&gt;}&lt;/span&gt;
        &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='k'&gt;false&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;
    
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;For 32-bit unsigned integers we can employ some bit manipulation to acheive the same effect, by checking that we have a power of two that is also a power of four.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='csharp'&gt;    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='k'&gt;static&lt;/span&gt; &lt;span class='kt'&gt;bool&lt;/span&gt; &lt;span class='nf'&gt;IsPowerOfFour&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kt'&gt;uint&lt;/span&gt; &lt;span class='n'&gt;n&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
    &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;n&lt;/span&gt; &lt;span class='p'&gt;&amp;amp;&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;n&lt;/span&gt; &lt;span class='p'&gt;-&lt;/span&gt; &lt;span class='m'&gt;1&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt; &lt;span class='p'&gt;==&lt;/span&gt; &lt;span class='m'&gt;0&lt;/span&gt; &lt;span class='p'&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;n&lt;/span&gt; &lt;span class='p'&gt;&amp;amp;&lt;/span&gt; &lt;span class='m'&gt;0&lt;/span&gt;&lt;span class='n'&gt;x5555555&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;!=&lt;/span&gt; &lt;span class='m'&gt;0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;
    
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;</content>
 </entry>
 
 <entry>
   <title>Bresenham's Line Algorithm in C#</title>
   <link href='http://ericw.ca/notes/bresenhams-line-algorithm-in-csharp.html'/>
   <updated>2010-05-20T00:00:00-07:00</updated>
   <id>http://ericw.ca/notes/bresenhams-line-algorithm-in-csharp</id>
   <content type='html'>&lt;p&gt;I recently implemented &lt;a href='http://en.wikipedia.org/wiki/Bresenham&amp;apos;s_line_algorithm'&gt;Bresenham&amp;#8217;s line algorithm&lt;/a&gt; in C# as part of a new game I am developing. I thought I would share my implementation. I particularly like the interface of returning the points on the line as an IEnumerable.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='csharp'&gt;    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='k'&gt;static&lt;/span&gt; &lt;span class='n'&gt;IEnumerable&lt;/span&gt;&lt;span class='p'&gt;&amp;lt;&lt;/span&gt;&lt;span class='n'&gt;Point&lt;/span&gt;&lt;span class='p'&gt;&amp;gt;&lt;/span&gt; &lt;span class='n'&gt;GetPointsOnLine&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;x0&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;y0&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;x1&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;y1&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
    &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='kt'&gt;bool&lt;/span&gt; &lt;span class='n'&gt;steep&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='n'&gt;Math&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Abs&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;y1&lt;/span&gt; &lt;span class='p'&gt;-&lt;/span&gt; &lt;span class='n'&gt;y0&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;&amp;gt;&lt;/span&gt; &lt;span class='n'&gt;Math&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Abs&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;x1&lt;/span&gt; &lt;span class='p'&gt;-&lt;/span&gt; &lt;span class='n'&gt;x0&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
        &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;steep&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
        &lt;span class='p'&gt;{&lt;/span&gt;
            &lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;t&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
            &lt;span class='n'&gt;t&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='n'&gt;x0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='c1'&gt;// swap x0 and y0&lt;/span&gt;
            &lt;span class='n'&gt;x0&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='n'&gt;y0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
            &lt;span class='n'&gt;y0&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='n'&gt;t&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
            &lt;span class='n'&gt;t&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='n'&gt;x1&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='c1'&gt;// swap x1 and y1&lt;/span&gt;
            &lt;span class='n'&gt;x1&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='n'&gt;y1&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
            &lt;span class='n'&gt;y1&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='n'&gt;t&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
        &lt;span class='p'&gt;}&lt;/span&gt;
        &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;x0&lt;/span&gt; &lt;span class='p'&gt;&amp;gt;&lt;/span&gt; &lt;span class='n'&gt;x1&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
        &lt;span class='p'&gt;{&lt;/span&gt;
            &lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;t&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
            &lt;span class='n'&gt;t&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='n'&gt;x0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='c1'&gt;// swap x0 and x1&lt;/span&gt;
            &lt;span class='n'&gt;x0&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='n'&gt;x1&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
            &lt;span class='n'&gt;x1&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='n'&gt;t&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
            &lt;span class='n'&gt;t&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='n'&gt;y0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='c1'&gt;// swap y0 and y1&lt;/span&gt;
            &lt;span class='n'&gt;y0&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='n'&gt;y1&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
            &lt;span class='n'&gt;y1&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='n'&gt;t&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
        &lt;span class='p'&gt;}&lt;/span&gt;
        &lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;dx&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='n'&gt;x1&lt;/span&gt; &lt;span class='p'&gt;-&lt;/span&gt; &lt;span class='n'&gt;x0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
        &lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;dy&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='n'&gt;Math&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;Abs&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;y1&lt;/span&gt; &lt;span class='p'&gt;-&lt;/span&gt; &lt;span class='n'&gt;y0&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
        &lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;error&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='n'&gt;dx&lt;/span&gt; &lt;span class='p'&gt;/&lt;/span&gt; &lt;span class='m'&gt;2&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
        &lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;ystep&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;y0&lt;/span&gt; &lt;span class='p'&gt;&amp;lt;&lt;/span&gt; &lt;span class='n'&gt;y1&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;?&lt;/span&gt; &lt;span class='m'&gt;1&lt;/span&gt; &lt;span class='p'&gt;:&lt;/span&gt; &lt;span class='p'&gt;-&lt;/span&gt;&lt;span class='m'&gt;1&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
        &lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;y&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='n'&gt;y0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
        &lt;span class='k'&gt;for&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;x&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='n'&gt;x0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='n'&gt;x&lt;/span&gt; &lt;span class='p'&gt;&amp;lt;=&lt;/span&gt; &lt;span class='n'&gt;x1&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='n'&gt;x&lt;/span&gt;&lt;span class='p'&gt;++)&lt;/span&gt;
        &lt;span class='p'&gt;{&lt;/span&gt;
            &lt;span class='k'&gt;yield&lt;/span&gt; &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='nf'&gt;Point&lt;/span&gt;&lt;span class='p'&gt;((&lt;/span&gt;&lt;span class='n'&gt;steep&lt;/span&gt; &lt;span class='p'&gt;?&lt;/span&gt; &lt;span class='n'&gt;y&lt;/span&gt; &lt;span class='p'&gt;:&lt;/span&gt; &lt;span class='n'&gt;x&lt;/span&gt;&lt;span class='p'&gt;),&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;steep&lt;/span&gt; &lt;span class='p'&gt;?&lt;/span&gt; &lt;span class='n'&gt;x&lt;/span&gt; &lt;span class='p'&gt;:&lt;/span&gt; &lt;span class='n'&gt;y&lt;/span&gt;&lt;span class='p'&gt;));&lt;/span&gt;
            &lt;span class='n'&gt;error&lt;/span&gt; &lt;span class='p'&gt;=&lt;/span&gt; &lt;span class='n'&gt;error&lt;/span&gt; &lt;span class='p'&gt;-&lt;/span&gt; &lt;span class='n'&gt;dy&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
            &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;error&lt;/span&gt; &lt;span class='p'&gt;&amp;lt;&lt;/span&gt; &lt;span class='m'&gt;0&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
            &lt;span class='p'&gt;{&lt;/span&gt;
                &lt;span class='n'&gt;y&lt;/span&gt; &lt;span class='p'&gt;+=&lt;/span&gt; &lt;span class='n'&gt;ystep&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
                &lt;span class='n'&gt;error&lt;/span&gt; &lt;span class='p'&gt;+=&lt;/span&gt; &lt;span class='n'&gt;dx&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
            &lt;span class='p'&gt;}&lt;/span&gt;
        &lt;span class='p'&gt;}&lt;/span&gt;
        &lt;span class='k'&gt;yield&lt;/span&gt; &lt;span class='k'&gt;break&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;
    
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;</content>
 </entry>
 
 <entry>
   <title>Smallest Palindrome Bases in Haskell</title>
   <link href='http://ericw.ca/notes/smallest-palindrome-bases-in-haskell.html'/>
   <updated>2009-12-26T00:00:00-08:00</updated>
   <id>http://ericw.ca/notes/smallest-palindrome-bases-in-haskell</id>
   <content type='html'>&lt;p&gt;Everybody loves palindromes, right? I do, at least. That&amp;#8217;s why I was excited when I learned that every number can be a palindrome when it&amp;#8217;s written in the appropriate base. There is a trivial proof for this property: any number N &amp;gt; 3 is a palindrome in base N-1 because it may be written &amp;#8220;11&amp;#8221;. So here is my solution, in Haskell, to this &lt;a href='http://www.codechef.com/problems/K2'&gt;CodeChef problem&lt;/a&gt;, that finds the smallest base that makes any given number a palindrome.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='haskell'&gt;    &lt;span class='n'&gt;isPalindromeInBase&lt;/span&gt; &lt;span class='ow'&gt;::&lt;/span&gt; &lt;span class='kt'&gt;Integer&lt;/span&gt; &lt;span class='ow'&gt;-&amp;gt;&lt;/span&gt; &lt;span class='kt'&gt;Integer&lt;/span&gt; &lt;span class='ow'&gt;-&amp;gt;&lt;/span&gt; &lt;span class='kt'&gt;Bool&lt;/span&gt;
    &lt;span class='n'&gt;isPalindromeInBase&lt;/span&gt; &lt;span class='n'&gt;value&lt;/span&gt; &lt;span class='n'&gt;base&lt;/span&gt; &lt;span class='ow'&gt;=&lt;/span&gt; &lt;span class='n'&gt;step&lt;/span&gt; &lt;span class='n'&gt;leftmost&lt;/span&gt; &lt;span class='mi'&gt;1&lt;/span&gt;
        &lt;span class='kr'&gt;where&lt;/span&gt; &lt;span class='n'&gt;leftmost&lt;/span&gt; &lt;span class='ow'&gt;=&lt;/span&gt; &lt;span class='n'&gt;base&lt;/span&gt; &lt;span class='o'&gt;^&lt;/span&gt; &lt;span class='n'&gt;floor&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;log&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;fromInteger&lt;/span&gt; &lt;span class='n'&gt;value&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='o'&gt;/&lt;/span&gt; &lt;span class='n'&gt;log&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;fromInteger&lt;/span&gt; &lt;span class='n'&gt;base&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;
              &lt;span class='n'&gt;step&lt;/span&gt; &lt;span class='n'&gt;left&lt;/span&gt; &lt;span class='n'&gt;right&lt;/span&gt;
                  &lt;span class='o'&gt;|&lt;/span&gt; &lt;span class='n'&gt;left&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;=&lt;/span&gt; &lt;span class='n'&gt;right&lt;/span&gt;             &lt;span class='ow'&gt;=&lt;/span&gt; &lt;span class='kt'&gt;True&lt;/span&gt;
                  &lt;span class='o'&gt;|&lt;/span&gt; &lt;span class='n'&gt;digit&lt;/span&gt; &lt;span class='n'&gt;left&lt;/span&gt; &lt;span class='o'&gt;==&lt;/span&gt; &lt;span class='n'&gt;digit&lt;/span&gt; &lt;span class='n'&gt;right&lt;/span&gt; &lt;span class='ow'&gt;=&lt;/span&gt; &lt;span class='n'&gt;step&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;left&lt;/span&gt; &lt;span class='p'&gt;`&lt;/span&gt;&lt;span class='n'&gt;div&lt;/span&gt;&lt;span class='p'&gt;`&lt;/span&gt; &lt;span class='n'&gt;base&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;right&lt;/span&gt; &lt;span class='o'&gt;*&lt;/span&gt; &lt;span class='n'&gt;base&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
                  &lt;span class='o'&gt;|&lt;/span&gt; &lt;span class='n'&gt;otherwise&lt;/span&gt;                 &lt;span class='ow'&gt;=&lt;/span&gt; &lt;span class='kt'&gt;False&lt;/span&gt;
              &lt;span class='n'&gt;digit&lt;/span&gt; &lt;span class='n'&gt;position&lt;/span&gt; &lt;span class='ow'&gt;=&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;value&lt;/span&gt; &lt;span class='p'&gt;`&lt;/span&gt;&lt;span class='n'&gt;div&lt;/span&gt;&lt;span class='p'&gt;`&lt;/span&gt; &lt;span class='n'&gt;position&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;`&lt;/span&gt;&lt;span class='n'&gt;mod&lt;/span&gt;&lt;span class='p'&gt;`&lt;/span&gt; &lt;span class='n'&gt;base&lt;/span&gt;
    
    &lt;span class='n'&gt;smallestPalindromeBase&lt;/span&gt; &lt;span class='ow'&gt;::&lt;/span&gt; &lt;span class='kt'&gt;Integer&lt;/span&gt; &lt;span class='ow'&gt;-&amp;gt;&lt;/span&gt; &lt;span class='kt'&gt;Integer&lt;/span&gt;
    &lt;span class='n'&gt;smallestPalindromeBase&lt;/span&gt; &lt;span class='mi'&gt;1&lt;/span&gt; &lt;span class='ow'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;2&lt;/span&gt;
    &lt;span class='n'&gt;smallestPalindromeBase&lt;/span&gt; &lt;span class='mi'&gt;2&lt;/span&gt; &lt;span class='ow'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;3&lt;/span&gt;
    &lt;span class='n'&gt;smallestPalindromeBase&lt;/span&gt; &lt;span class='n'&gt;value&lt;/span&gt; &lt;span class='ow'&gt;=&lt;/span&gt; &lt;span class='n'&gt;step&lt;/span&gt; &lt;span class='mi'&gt;2&lt;/span&gt;
        &lt;span class='kr'&gt;where&lt;/span&gt; &lt;span class='n'&gt;step&lt;/span&gt; &lt;span class='n'&gt;base&lt;/span&gt; 
                  &lt;span class='o'&gt;|&lt;/span&gt; &lt;span class='n'&gt;base&lt;/span&gt; &lt;span class='o'&gt;&amp;gt;=&lt;/span&gt; &lt;span class='n'&gt;value&lt;/span&gt; &lt;span class='o'&gt;||&lt;/span&gt; &lt;span class='n'&gt;isPalindromeInBase&lt;/span&gt; &lt;span class='n'&gt;value&lt;/span&gt; &lt;span class='n'&gt;base&lt;/span&gt; &lt;span class='ow'&gt;=&lt;/span&gt; &lt;span class='n'&gt;base&lt;/span&gt;
                  &lt;span class='o'&gt;|&lt;/span&gt; &lt;span class='n'&gt;otherwise&lt;/span&gt;                                      &lt;span class='ow'&gt;=&lt;/span&gt; &lt;span class='n'&gt;step&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;base&lt;/span&gt; &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
    
    &lt;span class='n'&gt;main&lt;/span&gt; &lt;span class='ow'&gt;=&lt;/span&gt; &lt;span class='n'&gt;interact&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;unlines&lt;/span&gt; &lt;span class='o'&gt;.&lt;/span&gt; &lt;span class='n'&gt;map&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;show&lt;/span&gt; &lt;span class='o'&gt;.&lt;/span&gt; &lt;span class='n'&gt;smallestPalindromeBase&lt;/span&gt; &lt;span class='o'&gt;.&lt;/span&gt; &lt;span class='n'&gt;read&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='o'&gt;.&lt;/span&gt; &lt;span class='n'&gt;tail&lt;/span&gt; &lt;span class='o'&gt;.&lt;/span&gt; &lt;span class='n'&gt;lines&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
    
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;This is certainly not the fastest solution possible. Indeed it is downright naive. But hopefully the logic is clear.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Naive Knight's Tour in Haskell</title>
   <link href='http://ericw.ca/notes/naive-knights-tour-in-haskell.html'/>
   <updated>2009-03-11T00:00:00-07:00</updated>
   <id>http://ericw.ca/notes/naive-knights-tour-in-haskell</id>
   <content type='html'>&lt;p&gt;So tonight I was helping a friend with a CS 134 assignment that involved a recursive solution to the &lt;a href='http://en.wikipedia.org/wiki/Knight%27s_Tour'&gt;Knight&amp;#8217;s Tour&lt;/a&gt; problem. The assignment included a rather ugly solution in Java and I wondered what a comparable solution in Haskell might look like. I spent the past few minutes hacking together such a function.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='haskell'&gt;    &lt;span class='n'&gt;tourTo&lt;/span&gt; &lt;span class='ow'&gt;::&lt;/span&gt; &lt;span class='kt'&gt;Int&lt;/span&gt; &lt;span class='ow'&gt;-&amp;gt;&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kt'&gt;Int&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;&lt;span class='kt'&gt;Int&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='ow'&gt;-&amp;gt;&lt;/span&gt; &lt;span class='p'&gt;[[(&lt;/span&gt;&lt;span class='kt'&gt;Int&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;&lt;span class='kt'&gt;Int&lt;/span&gt;&lt;span class='p'&gt;)]]&lt;/span&gt;
    &lt;span class='n'&gt;tourTo&lt;/span&gt; &lt;span class='n'&gt;n&lt;/span&gt; &lt;span class='n'&gt;finish&lt;/span&gt; &lt;span class='ow'&gt;=&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='n'&gt;pos&lt;/span&gt;&lt;span class='kt'&gt;:&lt;/span&gt;&lt;span class='n'&gt;path&lt;/span&gt; &lt;span class='o'&gt;|&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;pos&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;&lt;span class='n'&gt;path&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='ow'&gt;&amp;lt;-&lt;/span&gt; &lt;span class='n'&gt;tour&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;n&lt;/span&gt;&lt;span class='o'&gt;*&lt;/span&gt;&lt;span class='n'&gt;n&lt;/span&gt;&lt;span class='p'&gt;)]&lt;/span&gt;
        &lt;span class='kr'&gt;where&lt;/span&gt; &lt;span class='n'&gt;tour&lt;/span&gt; &lt;span class='mi'&gt;1&lt;/span&gt; &lt;span class='ow'&gt;=&lt;/span&gt; &lt;span class='p'&gt;[(&lt;/span&gt;&lt;span class='n'&gt;finish&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='kt'&gt;[]&lt;/span&gt;&lt;span class='p'&gt;)]&lt;/span&gt;
              &lt;span class='n'&gt;tour&lt;/span&gt; &lt;span class='n'&gt;k&lt;/span&gt; &lt;span class='ow'&gt;=&lt;/span&gt; &lt;span class='p'&gt;[(&lt;/span&gt;&lt;span class='n'&gt;pos&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;pos&lt;/span&gt;&lt;span class='kt'&gt;:&lt;/span&gt;&lt;span class='n'&gt;path&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='o'&gt;|&lt;/span&gt;
                           &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;pos&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;path&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='ow'&gt;&amp;lt;-&lt;/span&gt; &lt;span class='n'&gt;tour&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;k&lt;/span&gt;&lt;span class='o'&gt;-&lt;/span&gt;&lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='p'&gt;),&lt;/span&gt;
                           &lt;span class='n'&gt;pos&amp;#39;&lt;/span&gt; &lt;span class='ow'&gt;&amp;lt;-&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;filter&lt;/span&gt; &lt;span class='p'&gt;(`&lt;/span&gt;&lt;span class='n'&gt;notElem&lt;/span&gt;&lt;span class='p'&gt;`&lt;/span&gt; &lt;span class='n'&gt;path&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;jumps&lt;/span&gt; &lt;span class='n'&gt;n&lt;/span&gt; &lt;span class='n'&gt;pos&lt;/span&gt;&lt;span class='p'&gt;))]&lt;/span&gt;
              &lt;span class='n'&gt;jumps&lt;/span&gt; &lt;span class='n'&gt;n&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;r&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;c&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='ow'&gt;=&lt;/span&gt; &lt;span class='n'&gt;filter&lt;/span&gt; &lt;span class='n'&gt;onBoard&lt;/span&gt;
                  &lt;span class='p'&gt;[(&lt;/span&gt;&lt;span class='n'&gt;r&lt;/span&gt;&lt;span class='o'&gt;+&lt;/span&gt;&lt;span class='mi'&gt;2&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;c&lt;/span&gt;&lt;span class='o'&gt;+&lt;/span&gt;&lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='p'&gt;),&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;r&lt;/span&gt;&lt;span class='o'&gt;+&lt;/span&gt;&lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;c&lt;/span&gt;&lt;span class='o'&gt;+&lt;/span&gt;&lt;span class='mi'&gt;2&lt;/span&gt;&lt;span class='p'&gt;),&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;r&lt;/span&gt;&lt;span class='o'&gt;-&lt;/span&gt;&lt;span class='mi'&gt;2&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;c&lt;/span&gt;&lt;span class='o'&gt;+&lt;/span&gt;&lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='p'&gt;),&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;r&lt;/span&gt;&lt;span class='o'&gt;+&lt;/span&gt;&lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;c&lt;/span&gt;&lt;span class='o'&gt;-&lt;/span&gt;&lt;span class='mi'&gt;2&lt;/span&gt;&lt;span class='p'&gt;),&lt;/span&gt;
                   &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;r&lt;/span&gt;&lt;span class='o'&gt;+&lt;/span&gt;&lt;span class='mi'&gt;2&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;c&lt;/span&gt;&lt;span class='o'&gt;-&lt;/span&gt;&lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='p'&gt;),&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;r&lt;/span&gt;&lt;span class='o'&gt;-&lt;/span&gt;&lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;c&lt;/span&gt;&lt;span class='o'&gt;+&lt;/span&gt;&lt;span class='mi'&gt;2&lt;/span&gt;&lt;span class='p'&gt;),&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;r&lt;/span&gt;&lt;span class='o'&gt;-&lt;/span&gt;&lt;span class='mi'&gt;2&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;c&lt;/span&gt;&lt;span class='o'&gt;-&lt;/span&gt;&lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='p'&gt;),&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;r&lt;/span&gt;&lt;span class='o'&gt;-&lt;/span&gt;&lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;c&lt;/span&gt;&lt;span class='o'&gt;-&lt;/span&gt;&lt;span class='mi'&gt;2&lt;/span&gt;&lt;span class='p'&gt;)]&lt;/span&gt;
                  &lt;span class='kr'&gt;where&lt;/span&gt; &lt;span class='n'&gt;onBoard&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;r&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;c&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='ow'&gt;=&lt;/span&gt; &lt;span class='n'&gt;r&lt;/span&gt; &lt;span class='o'&gt;&amp;gt;=&lt;/span&gt; &lt;span class='mi'&gt;1&lt;/span&gt; &lt;span class='o'&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class='n'&gt;c&lt;/span&gt; &lt;span class='o'&gt;&amp;gt;=&lt;/span&gt; &lt;span class='mi'&gt;1&lt;/span&gt; &lt;span class='o'&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class='n'&gt;r&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;=&lt;/span&gt; &lt;span class='n'&gt;n&lt;/span&gt; &lt;span class='o'&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class='n'&gt;c&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;=&lt;/span&gt; &lt;span class='n'&gt;n&lt;/span&gt;
    
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;It works (as far as I can tell) but it&amp;#8217;s unbearably slow. Two optimizations come to mind: using a map rather than a list to store the visited squares and using a heuristic to select the next move location. The latter is implemented in the Java version; if motivation strikes I&amp;#8217;ll post a better/faster(/harder/stronger) version.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Quirky Java</title>
   <link href='http://ericw.ca/notes/quirky-java.html'/>
   <updated>2009-02-22T00:00:00-08:00</updated>
   <id>http://ericw.ca/notes/quirky-java</id>
   <content type='html'>&lt;p&gt;This term I&amp;#8217;m taking a course on compiler construction, &lt;a href='http://www.student.cs.uwaterloo.ca/~cs444/'&gt;CS 444&lt;/a&gt;. For the course I, along with my group members &lt;a href='http://www.eng.uwaterloo.ca/~pfeiner/'&gt;Peter&lt;/a&gt; and &lt;a href='http://www.student.cs.uwaterloo.ca/~i3stewar/'&gt;Ian&lt;/a&gt;, am developing a compiler for a subset of Java. So far we have finished the &lt;a href='http://en.wikipedia.org/wiki/Lexical_analyzer'&gt;scanner&lt;/a&gt; and &lt;a href='http://en.wikipedia.org/wiki/LALR'&gt;parser&lt;/a&gt;. It&amp;#8217;s been an illuminating experience learning about the quirkiness hidden deep in the &lt;a href='http://java.sun.com/docs/books/jls/'&gt;Java Language Specification&lt;/a&gt; and I wanted to share a few of the more esoteric constructs we discovered.&lt;/p&gt;

&lt;p&gt;I successfully compiled all of the following examples on my aging Windows XP laptop with javac 1.6.0_04. First, a single semicolon is valid Java file! So&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='java'&gt;    &lt;span class='c1'&gt;// in Quirky.java&lt;/span&gt;
    &lt;span class='o'&gt;;&lt;/span&gt;
    
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;is a perfectly valid and so is&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='java'&gt;    &lt;span class='c1'&gt;// in Quirky.java&lt;/span&gt;
    &lt;span class='o'&gt;;&lt;/span&gt;
    &lt;span class='kd'&gt;class&lt;/span&gt; &lt;span class='nc'&gt;Quirky&lt;/span&gt; &lt;span class='o'&gt;{&lt;/span&gt;
        &lt;span class='o'&gt;;&lt;/span&gt;
    &lt;span class='o'&gt;}&lt;/span&gt;
    
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Javac will happily generate bytecode for both files. More single-character strangeness: a single $ or _ are valid Java identifiers. Hence, with a wanton willingness to abuse the language,&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='java'&gt;    &lt;span class='c1'&gt;// in $.java&lt;/span&gt;
    &lt;span class='kd'&gt;class&lt;/span&gt; &lt;span class='err'&gt;$ {&lt;/span&gt;
        &lt;span class='kd'&gt;class&lt;/span&gt; &lt;span class='err'&gt;$$ {&lt;/span&gt;
            &lt;span class='n'&gt;$&lt;/span&gt; &lt;span class='n'&gt;$&lt;/span&gt;&lt;span class='o'&gt;(&lt;/span&gt;&lt;span class='n'&gt;$&lt;/span&gt; &lt;span class='n'&gt;$&lt;/span&gt;&lt;span class='o'&gt;)&lt;/span&gt; &lt;span class='o'&gt;{&lt;/span&gt; &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='kc'&gt;null&lt;/span&gt;&lt;span class='o'&gt;;&lt;/span&gt; &lt;span class='o'&gt;}&lt;/span&gt;
        &lt;span class='o'&gt;}&lt;/span&gt;
    &lt;span class='o'&gt;}&lt;/span&gt;
    &lt;span class='kd'&gt;class&lt;/span&gt; &lt;span class='nc'&gt;_&lt;/span&gt; &lt;span class='o'&gt;{&lt;/span&gt;
        &lt;span class='n'&gt;_&lt;/span&gt; &lt;span class='nf'&gt;_&lt;/span&gt;&lt;span class='o'&gt;(&lt;/span&gt;&lt;span class='n'&gt;_&lt;/span&gt; &lt;span class='n'&gt;_&lt;/span&gt;&lt;span class='o'&gt;)&lt;/span&gt; &lt;span class='o'&gt;{&lt;/span&gt; &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='kc'&gt;null&lt;/span&gt;&lt;span class='o'&gt;;&lt;/span&gt; &lt;span class='o'&gt;}&lt;/span&gt;
    &lt;span class='o'&gt;}&lt;/span&gt;
    
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;can be compiled into $.class, $$$$.class and _.class! Finally the array brackets can appear in unexpected places as&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='java'&gt;    &lt;span class='c1'&gt;// in Quirky.java&lt;/span&gt;
    &lt;span class='kd'&gt;class&lt;/span&gt; &lt;span class='nc'&gt;Quirky&lt;/span&gt; &lt;span class='o'&gt;{&lt;/span&gt;
        &lt;span class='kt'&gt;int&lt;/span&gt;&lt;span class='o'&gt;[]&lt;/span&gt; &lt;span class='nf'&gt;twoDim&lt;/span&gt;&lt;span class='o'&gt;()&lt;/span&gt; &lt;span class='o'&gt;[]&lt;/span&gt; &lt;span class='o'&gt;{&lt;/span&gt; &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='kc'&gt;null&lt;/span&gt;&lt;span class='o'&gt;;&lt;/span&gt; &lt;span class='o'&gt;}&lt;/span&gt;
    &lt;span class='o'&gt;}&lt;/span&gt;
    
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;generates a method twoDim that returns a two-dimensional array int[][].&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Project Euler Problems 4-8</title>
   <link href='http://ericw.ca/notes/project-euler-4-8.html'/>
   <updated>2009-01-12T00:00:00-08:00</updated>
   <id>http://ericw.ca/notes/project-euler-4-8</id>
   <content type='html'>&lt;p&gt;More Haskell, more &lt;a href='http://projecteuler.net/'&gt;Project Euler&lt;/a&gt;. Again I thought I would share my solutions to the next few problems. I should point out in advance that, for the most part, these are naive solutions. I plan on taking a second pass later to devise more clever approaches.&lt;/p&gt;

&lt;h4 id='problem_4'&gt;Problem 4&lt;/h4&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='haskell'&gt;    &lt;span class='n'&gt;answer&lt;/span&gt; &lt;span class='ow'&gt;=&lt;/span&gt; &lt;span class='n'&gt;maximum&lt;/span&gt; &lt;span class='o'&gt;.&lt;/span&gt; &lt;span class='n'&gt;filter&lt;/span&gt; &lt;span class='n'&gt;isPalindrome&lt;/span&gt; &lt;span class='o'&gt;$&lt;/span&gt; &lt;span class='n'&gt;products&lt;/span&gt;
        &lt;span class='kr'&gt;where&lt;/span&gt; &lt;span class='n'&gt;products&lt;/span&gt; &lt;span class='ow'&gt;=&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt; &lt;span class='n'&gt;x&lt;/span&gt;&lt;span class='o'&gt;*&lt;/span&gt;&lt;span class='n'&gt;y&lt;/span&gt; &lt;span class='o'&gt;|&lt;/span&gt; &lt;span class='n'&gt;x&lt;/span&gt; &lt;span class='ow'&gt;&amp;lt;-&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='mi'&gt;111&lt;/span&gt;&lt;span class='o'&gt;..&lt;/span&gt;&lt;span class='mi'&gt;999&lt;/span&gt;&lt;span class='p'&gt;],&lt;/span&gt; &lt;span class='n'&gt;y&lt;/span&gt; &lt;span class='ow'&gt;&amp;lt;-&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='n'&gt;x&lt;/span&gt;&lt;span class='o'&gt;..&lt;/span&gt;&lt;span class='mi'&gt;999&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='p'&gt;]&lt;/span&gt;
              &lt;span class='n'&gt;isPalindrome&lt;/span&gt; &lt;span class='n'&gt;n&lt;/span&gt; &lt;span class='ow'&gt;=&lt;/span&gt; &lt;span class='n'&gt;n&lt;/span&gt; &lt;span class='o'&gt;==&lt;/span&gt; &lt;span class='n'&gt;reverse&lt;/span&gt; &lt;span class='n'&gt;n&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;
                &lt;span class='kr'&gt;where&lt;/span&gt; &lt;span class='n'&gt;reverse&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt; &lt;span class='n'&gt;r&lt;/span&gt; &lt;span class='ow'&gt;=&lt;/span&gt; &lt;span class='n'&gt;r&lt;/span&gt;
                      &lt;span class='n'&gt;reverse&lt;/span&gt; &lt;span class='n'&gt;n&lt;/span&gt; &lt;span class='n'&gt;r&lt;/span&gt; &lt;span class='ow'&gt;=&lt;/span&gt; &lt;span class='n'&gt;reverse&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;n&lt;/span&gt; &lt;span class='p'&gt;`&lt;/span&gt;&lt;span class='n'&gt;div&lt;/span&gt;&lt;span class='p'&gt;`&lt;/span&gt; &lt;span class='mi'&gt;10&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;r&lt;/span&gt; &lt;span class='o'&gt;*&lt;/span&gt; &lt;span class='mi'&gt;10&lt;/span&gt; &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='n'&gt;n&lt;/span&gt; &lt;span class='p'&gt;`&lt;/span&gt;&lt;span class='n'&gt;mod&lt;/span&gt;&lt;span class='p'&gt;`&lt;/span&gt; &lt;span class='mi'&gt;10&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
    
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h4 id='problem_5'&gt;Problem 5&lt;/h4&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='haskell'&gt;    &lt;span class='n'&gt;answer&lt;/span&gt; &lt;span class='ow'&gt;=&lt;/span&gt; &lt;span class='n'&gt;head&lt;/span&gt; &lt;span class='o'&gt;.&lt;/span&gt; &lt;span class='n'&gt;filter&lt;/span&gt; &lt;span class='n'&gt;good&lt;/span&gt; &lt;span class='o'&gt;$&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='mi'&gt;20&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;&lt;span class='mi'&gt;40&lt;/span&gt;&lt;span class='o'&gt;..&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
        &lt;span class='kr'&gt;where&lt;/span&gt; &lt;span class='n'&gt;good&lt;/span&gt; &lt;span class='n'&gt;n&lt;/span&gt; &lt;span class='ow'&gt;=&lt;/span&gt; &lt;span class='n'&gt;not&lt;/span&gt; &lt;span class='o'&gt;$&lt;/span&gt; &lt;span class='n'&gt;any&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;\&lt;/span&gt;&lt;span class='n'&gt;t&lt;/span&gt; &lt;span class='ow'&gt;-&amp;gt;&lt;/span&gt; &lt;span class='n'&gt;n&lt;/span&gt; &lt;span class='p'&gt;`&lt;/span&gt;&lt;span class='n'&gt;rem&lt;/span&gt;&lt;span class='p'&gt;`&lt;/span&gt; &lt;span class='n'&gt;t&lt;/span&gt; &lt;span class='o'&gt;/=&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='mi'&gt;2&lt;/span&gt;&lt;span class='o'&gt;..&lt;/span&gt;&lt;span class='mi'&gt;19&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
    
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h4 id='problem_6'&gt;Problem 6&lt;/h4&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='haskell'&gt;    &lt;span class='n'&gt;answer&lt;/span&gt; &lt;span class='ow'&gt;=&lt;/span&gt; &lt;span class='n'&gt;squareSum&lt;/span&gt; &lt;span class='o'&gt;-&lt;/span&gt; &lt;span class='n'&gt;sumSquare&lt;/span&gt;
        &lt;span class='kr'&gt;where&lt;/span&gt; &lt;span class='n'&gt;squareSum&lt;/span&gt; &lt;span class='ow'&gt;=&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;sum&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='o'&gt;..&lt;/span&gt;&lt;span class='mi'&gt;100&lt;/span&gt;&lt;span class='p'&gt;])&lt;/span&gt; &lt;span class='o'&gt;^&lt;/span&gt; &lt;span class='mi'&gt;2&lt;/span&gt;
              &lt;span class='n'&gt;sumSquare&lt;/span&gt; &lt;span class='ow'&gt;=&lt;/span&gt; &lt;span class='n'&gt;sum&lt;/span&gt; &lt;span class='o'&gt;$&lt;/span&gt; &lt;span class='n'&gt;map&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='o'&gt;^&lt;/span&gt;&lt;span class='mi'&gt;2&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='o'&gt;..&lt;/span&gt;&lt;span class='mi'&gt;100&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
    
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h4 id='problem_7'&gt;Problem 7&lt;/h4&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='haskell'&gt;    &lt;span class='n'&gt;primes&lt;/span&gt; &lt;span class='ow'&gt;::&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='kt'&gt;Integer&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
    &lt;span class='n'&gt;primes&lt;/span&gt; &lt;span class='ow'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;2&lt;/span&gt;&lt;span class='kt'&gt;:&lt;/span&gt;&lt;span class='mi'&gt;3&lt;/span&gt;&lt;span class='kt'&gt;:&lt;/span&gt;&lt;span class='n'&gt;primes&amp;#39;&lt;/span&gt;
        &lt;span class='kr'&gt;where&lt;/span&gt; &lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='kt'&gt;:&lt;/span&gt;&lt;span class='n'&gt;p&lt;/span&gt;&lt;span class='kt'&gt;:&lt;/span&gt;&lt;span class='n'&gt;candidates&lt;/span&gt; &lt;span class='ow'&gt;=&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='mi'&gt;6&lt;/span&gt;&lt;span class='o'&gt;*&lt;/span&gt;&lt;span class='n'&gt;k&lt;/span&gt;&lt;span class='o'&gt;+&lt;/span&gt;&lt;span class='n'&gt;r&lt;/span&gt; &lt;span class='o'&gt;|&lt;/span&gt; &lt;span class='n'&gt;k&lt;/span&gt; &lt;span class='ow'&gt;&amp;lt;-&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='o'&gt;..&lt;/span&gt;&lt;span class='p'&gt;],&lt;/span&gt; &lt;span class='n'&gt;r&lt;/span&gt; &lt;span class='ow'&gt;&amp;lt;-&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;&lt;span class='mi'&gt;5&lt;/span&gt;&lt;span class='p'&gt;]]&lt;/span&gt;
              &lt;span class='n'&gt;primes&amp;#39;&lt;/span&gt;        &lt;span class='ow'&gt;=&lt;/span&gt; &lt;span class='n'&gt;p&lt;/span&gt; &lt;span class='kt'&gt;:&lt;/span&gt; &lt;span class='n'&gt;filter&lt;/span&gt; &lt;span class='n'&gt;isPrime&lt;/span&gt; &lt;span class='n'&gt;candidates&lt;/span&gt;
              &lt;span class='n'&gt;isPrime&lt;/span&gt; &lt;span class='n'&gt;n&lt;/span&gt;      &lt;span class='ow'&gt;=&lt;/span&gt; &lt;span class='n'&gt;all&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;not&lt;/span&gt; &lt;span class='o'&gt;.&lt;/span&gt; &lt;span class='n'&gt;divides&lt;/span&gt; &lt;span class='n'&gt;n&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='o'&gt;$&lt;/span&gt; &lt;span class='n'&gt;takeWhile&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;\&lt;/span&gt;&lt;span class='n'&gt;p&lt;/span&gt;&lt;span class='ow'&gt;-&amp;gt;&lt;/span&gt; &lt;span class='n'&gt;p&lt;/span&gt;&lt;span class='o'&gt;*&lt;/span&gt;&lt;span class='n'&gt;p&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;=&lt;/span&gt; &lt;span class='n'&gt;n&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='n'&gt;primes&amp;#39;&lt;/span&gt;
              &lt;span class='n'&gt;divides&lt;/span&gt; &lt;span class='n'&gt;n&lt;/span&gt; &lt;span class='n'&gt;p&lt;/span&gt;    &lt;span class='ow'&gt;=&lt;/span&gt; &lt;span class='n'&gt;n&lt;/span&gt; &lt;span class='p'&gt;`&lt;/span&gt;&lt;span class='n'&gt;mod&lt;/span&gt;&lt;span class='p'&gt;`&lt;/span&gt; &lt;span class='n'&gt;p&lt;/span&gt; &lt;span class='o'&gt;==&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;
    &lt;span class='n'&gt;answer&lt;/span&gt; &lt;span class='ow'&gt;=&lt;/span&gt; &lt;span class='n'&gt;primes&lt;/span&gt; &lt;span class='o'&gt;!!&lt;/span&gt; &lt;span class='mi'&gt;10001&lt;/span&gt;
    
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h4 id='problem_8'&gt;Problem 8&lt;/h4&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='haskell'&gt;    &lt;span class='kr'&gt;import&lt;/span&gt; &lt;span class='nn'&gt;Char&lt;/span&gt;
    &lt;span class='n'&gt;largestDigitProduct&lt;/span&gt; &lt;span class='n'&gt;d&lt;/span&gt; &lt;span class='n'&gt;n&lt;/span&gt; &lt;span class='ow'&gt;=&lt;/span&gt; &lt;span class='n'&gt;maximum&lt;/span&gt; &lt;span class='n'&gt;products&lt;/span&gt;
        &lt;span class='kr'&gt;where&lt;/span&gt; &lt;span class='n'&gt;products&lt;/span&gt; &lt;span class='ow'&gt;=&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt; &lt;span class='n'&gt;digitProduct&lt;/span&gt; &lt;span class='n'&gt;x&lt;/span&gt; &lt;span class='n'&gt;digits&lt;/span&gt; &lt;span class='o'&gt;|&lt;/span&gt; &lt;span class='n'&gt;x&lt;/span&gt; &lt;span class='ow'&gt;&amp;lt;-&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='o'&gt;..&lt;/span&gt;&lt;span class='mi'&gt;995&lt;/span&gt;&lt;span class='p'&gt;]]&lt;/span&gt;
              &lt;span class='n'&gt;digitProduct&lt;/span&gt; &lt;span class='n'&gt;t&lt;/span&gt; &lt;span class='n'&gt;ds&lt;/span&gt; &lt;span class='ow'&gt;=&lt;/span&gt; &lt;span class='n'&gt;product&lt;/span&gt; &lt;span class='o'&gt;$&lt;/span&gt; &lt;span class='n'&gt;take&lt;/span&gt; &lt;span class='n'&gt;d&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;drop&lt;/span&gt; &lt;span class='n'&gt;t&lt;/span&gt; &lt;span class='n'&gt;ds&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
              &lt;span class='n'&gt;digits&lt;/span&gt; &lt;span class='ow'&gt;=&lt;/span&gt; &lt;span class='n'&gt;map&lt;/span&gt; &lt;span class='n'&gt;digitToInt&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;show&lt;/span&gt; &lt;span class='n'&gt;n&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
    &lt;span class='n'&gt;answer&lt;/span&gt; &lt;span class='ow'&gt;=&lt;/span&gt; &lt;span class='n'&gt;largestDigitProduct&lt;/span&gt; &lt;span class='mi'&gt;5&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;&lt;/span&gt;&lt;span class='n'&gt;number&lt;/span&gt;&lt;span class='o'&gt;&amp;gt;&lt;/span&gt;
    
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;</content>
 </entry>
 
 <entry>
   <title>Project Euler Problems 1-3</title>
   <link href='http://ericw.ca/notes/project-euler-1-3.html'/>
   <updated>2008-10-15T00:00:00-07:00</updated>
   <id>http://ericw.ca/notes/project-euler-1-3</id>
   <content type='html'>&lt;p&gt;Tonight I&amp;#8217;ve been using Haskell to tackle &lt;a href='http://projecteuler.net/'&gt;Project Euler&lt;/a&gt;. I thought I would share my solutions to the first three problems.&lt;/p&gt;

&lt;h4 id='problem_1'&gt;Problem 1&lt;/h4&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='haskell'&gt;    &lt;span class='n'&gt;naiveAnswer&lt;/span&gt; &lt;span class='ow'&gt;=&lt;/span&gt; &lt;span class='n'&gt;sum&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='n'&gt;x&lt;/span&gt; &lt;span class='o'&gt;|&lt;/span&gt; &lt;span class='n'&gt;x&lt;/span&gt; &lt;span class='ow'&gt;&amp;lt;-&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='o'&gt;..&lt;/span&gt;&lt;span class='mi'&gt;999&lt;/span&gt;&lt;span class='p'&gt;],&lt;/span&gt; &lt;span class='n'&gt;x&lt;/span&gt; &lt;span class='p'&gt;`&lt;/span&gt;&lt;span class='n'&gt;mod&lt;/span&gt;&lt;span class='p'&gt;`&lt;/span&gt; &lt;span class='mi'&gt;3&lt;/span&gt; &lt;span class='o'&gt;==&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt; &lt;span class='o'&gt;||&lt;/span&gt; &lt;span class='n'&gt;x&lt;/span&gt; &lt;span class='p'&gt;`&lt;/span&gt;&lt;span class='n'&gt;mod&lt;/span&gt;&lt;span class='p'&gt;`&lt;/span&gt; &lt;span class='mi'&gt;5&lt;/span&gt; &lt;span class='o'&gt;==&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
    &lt;span class='n'&gt;betterAnswer&lt;/span&gt; &lt;span class='ow'&gt;=&lt;/span&gt; &lt;span class='n'&gt;sumDiv&lt;/span&gt; &lt;span class='mi'&gt;3&lt;/span&gt; &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='n'&gt;sumDiv&lt;/span&gt; &lt;span class='mi'&gt;5&lt;/span&gt; &lt;span class='o'&gt;-&lt;/span&gt; &lt;span class='n'&gt;sumDiv&lt;/span&gt; &lt;span class='mi'&gt;15&lt;/span&gt;
        &lt;span class='kr'&gt;where&lt;/span&gt; &lt;span class='n'&gt;sumDiv&lt;/span&gt; &lt;span class='n'&gt;n&lt;/span&gt; &lt;span class='ow'&gt;=&lt;/span&gt; &lt;span class='n'&gt;sum&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='n'&gt;n&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;&lt;span class='n'&gt;n&lt;/span&gt;&lt;span class='o'&gt;+&lt;/span&gt;&lt;span class='n'&gt;n&lt;/span&gt;&lt;span class='o'&gt;..&lt;/span&gt;&lt;span class='mi'&gt;999&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;
    
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h4 id='problem_2'&gt;Problem 2&lt;/h4&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='haskell'&gt;    &lt;span class='n'&gt;fibs&lt;/span&gt; &lt;span class='ow'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;1&lt;/span&gt; &lt;span class='kt'&gt;:&lt;/span&gt; &lt;span class='mi'&gt;1&lt;/span&gt; &lt;span class='kt'&gt;:&lt;/span&gt; &lt;span class='n'&gt;zipWith&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='o'&gt;+&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='n'&gt;fibs&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;tail&lt;/span&gt; &lt;span class='n'&gt;fibs&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
    &lt;span class='n'&gt;answer&lt;/span&gt; &lt;span class='ow'&gt;=&lt;/span&gt; &lt;span class='n'&gt;sum&lt;/span&gt; &lt;span class='o'&gt;.&lt;/span&gt; &lt;span class='n'&gt;takeWhile&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='o'&gt;&amp;lt;&lt;/span&gt; &lt;span class='mi'&gt;4000000&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='o'&gt;.&lt;/span&gt; &lt;span class='n'&gt;filter&lt;/span&gt; &lt;span class='n'&gt;even&lt;/span&gt; &lt;span class='o'&gt;$&lt;/span&gt; &lt;span class='n'&gt;fibs&lt;/span&gt;
    
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h4 id='problem_3'&gt;Problem 3&lt;/h4&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='haskell'&gt;    &lt;span class='n'&gt;largestFactor&lt;/span&gt; &lt;span class='ow'&gt;::&lt;/span&gt; &lt;span class='kt'&gt;Integer&lt;/span&gt; &lt;span class='ow'&gt;-&amp;gt;&lt;/span&gt; &lt;span class='kt'&gt;Integer&lt;/span&gt;
    &lt;span class='n'&gt;largestFactor&lt;/span&gt; &lt;span class='n'&gt;n&lt;/span&gt; &lt;span class='ow'&gt;=&lt;/span&gt; &lt;span class='n'&gt;search&lt;/span&gt; &lt;span class='n'&gt;n&lt;/span&gt; &lt;span class='mi'&gt;1&lt;/span&gt; &lt;span class='mi'&gt;2&lt;/span&gt;
        &lt;span class='kr'&gt;where&lt;/span&gt; &lt;span class='n'&gt;search&lt;/span&gt; &lt;span class='n'&gt;q&lt;/span&gt; &lt;span class='n'&gt;f&lt;/span&gt; &lt;span class='n'&gt;d&lt;/span&gt; &lt;span class='o'&gt;|&lt;/span&gt; &lt;span class='n'&gt;q&lt;/span&gt; &lt;span class='o'&gt;==&lt;/span&gt; &lt;span class='mi'&gt;1&lt;/span&gt;         &lt;span class='ow'&gt;=&lt;/span&gt; &lt;span class='n'&gt;f&lt;/span&gt;
                           &lt;span class='o'&gt;|&lt;/span&gt; &lt;span class='n'&gt;q&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;&lt;/span&gt; &lt;span class='n'&gt;d&lt;/span&gt;&lt;span class='o'&gt;*&lt;/span&gt;&lt;span class='n'&gt;d&lt;/span&gt;        &lt;span class='ow'&gt;=&lt;/span&gt; &lt;span class='n'&gt;q&lt;/span&gt;
                           &lt;span class='o'&gt;|&lt;/span&gt; &lt;span class='n'&gt;q&lt;/span&gt; &lt;span class='p'&gt;`&lt;/span&gt;&lt;span class='n'&gt;mod&lt;/span&gt;&lt;span class='p'&gt;`&lt;/span&gt; &lt;span class='n'&gt;d&lt;/span&gt; &lt;span class='o'&gt;==&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt; &lt;span class='ow'&gt;=&lt;/span&gt; &lt;span class='n'&gt;loop&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;q&lt;/span&gt;&lt;span class='p'&gt;`&lt;/span&gt;&lt;span class='n'&gt;div&lt;/span&gt;&lt;span class='p'&gt;`&lt;/span&gt;&lt;span class='n'&gt;d&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='n'&gt;d&lt;/span&gt; &lt;span class='n'&gt;d&lt;/span&gt;
                           &lt;span class='o'&gt;|&lt;/span&gt; &lt;span class='n'&gt;otherwise&lt;/span&gt;      &lt;span class='ow'&gt;=&lt;/span&gt; &lt;span class='n'&gt;loop&lt;/span&gt; &lt;span class='n'&gt;q&lt;/span&gt; &lt;span class='n'&gt;f&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;d&lt;/span&gt;&lt;span class='o'&gt;+&lt;/span&gt;&lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
    &lt;span class='n'&gt;answer&lt;/span&gt; &lt;span class='ow'&gt;=&lt;/span&gt; &lt;span class='n'&gt;largestFactor&lt;/span&gt; &lt;span class='mi'&gt;600851475143&lt;/span&gt;
    
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;I&amp;#8217;d love to hear any comments on how Haskell-y these solutions are.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>A Tiny Guide to GCC Inline Assembly</title>
   <link href='http://ericw.ca/notes/a-tiny-guide-to-gcc-inline-assembly.html'/>
   <updated>2008-06-12T00:00:00-07:00</updated>
   <id>http://ericw.ca/notes/a-tiny-guide-to-gcc-inline-assembly</id>
   <content type='html'>&lt;p&gt;So I&amp;#8217;m working on a real-time operating system for school, and in the process I&amp;#8217;ve needed to write a ton of IA32 inline assembly. GCC&amp;#8217;s inline assembly syntax isn&amp;#8217;t immediately straightforward so it&amp;#8217;s been an interesting process of trial, error, and documentation to piece together the specifics. This guide presents my accumulated knowledge on the subject.&lt;/p&gt;

&lt;h2 id='assembly_syntax'&gt;Assembly Syntax&lt;/h2&gt;

&lt;p&gt;GCC uses AT&amp;amp;T assembly syntax. The highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;instruction source, destination&lt;/strong&gt;&lt;br /&gt;The first operand is the source, the second is the destination.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;%register&lt;/strong&gt;&lt;br /&gt;Register names are prefixed with a percent sign. (Or a &lt;code&gt;%%&lt;/code&gt; in certain circumstances; see the second on operands below.)&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;$literal&lt;/strong&gt;&lt;br /&gt;Literal values are prefixed with a dollar sign. The literal &lt;code&gt;$10&lt;/code&gt; specifies decimal 10 while &lt;code&gt;$0x10&lt;/code&gt; specifies hexadecimal 16.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;instruction{b,w,l}&lt;/strong&gt;&lt;br /&gt;The instruction suffix denotes the operand size. The &lt;code&gt;b&lt;/code&gt;, &lt;code&gt;w&lt;/code&gt;, and &lt;code&gt;l&lt;/code&gt; specify byte (8-bit), word (16-bit), and long word (32-bit) memory references. (Always include the size! If you omit it the GNU assembler will attempt to guess for you which is usually a Bad Idea.)&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;segment:offset(base, index, scale)&lt;/strong&gt;&lt;br /&gt;Memory access syntax. Note that the offset and scale constants are &lt;em&gt;not&lt;/em&gt; prefixed with &lt;code&gt;$&lt;/code&gt; but the register references still need a &lt;code&gt;%&lt;/code&gt;.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;ljmp/lcall $segment, $offset&lt;/strong&gt;&lt;br /&gt;Control transfer instructions may be prefixed with an &lt;code&gt;l&lt;/code&gt; to indicate a far jump to another code segment. (Similarly, there is &lt;code&gt;lret $stackadjust&lt;/code&gt;.)&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;*branch-address&lt;/strong&gt;&lt;br /&gt;Branch addressing using literals or registers is prefixed with an asterisk.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here are a few examples of valid code that illustrate these points.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='gas'&gt;    &lt;span class='nf'&gt;pushl&lt;/span&gt; &lt;span class='nv'&gt;%eax&lt;/span&gt;
    &lt;span class='nf'&gt;movl&lt;/span&gt; &lt;span class='no'&gt;$8&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nv'&gt;%ebx&lt;/span&gt;
    &lt;span class='nf'&gt;movb&lt;/span&gt; &lt;span class='no'&gt;$0x11&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nv'&gt;%al&lt;/span&gt;
    &lt;span class='nf'&gt;movl&lt;/span&gt; &lt;span class='nv'&gt;%es&lt;/span&gt;&lt;span class='p'&gt;:&lt;/span&gt;&lt;span class='mi'&gt;16&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;%ebx&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nv'&gt;%edi&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mi'&gt;4&lt;/span&gt;&lt;span class='p'&gt;),&lt;/span&gt; &lt;span class='nv'&gt;%eax&lt;/span&gt;
    &lt;span class='nf'&gt;ret&lt;/span&gt; &lt;span class='p'&gt;*&lt;/span&gt;&lt;span class='mi'&gt;100&lt;/span&gt;
    &lt;span class='nf'&gt;jmp&lt;/span&gt; &lt;span class='p'&gt;*&lt;/span&gt;&lt;span class='nv'&gt;%ecx&lt;/span&gt;
    &lt;span class='nf'&gt;lcall&lt;/span&gt; &lt;span class='no'&gt;$0x10&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='no'&gt;farcalllabel&lt;/span&gt;
    
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h2 id='inline_syntax'&gt;Inline Syntax&lt;/h2&gt;

&lt;p&gt;The basic format for GCC inline assembly is as follows.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='c'&gt;    &lt;span class='n'&gt;__asm__&lt;/span&gt;
    &lt;span class='n'&gt;__volatile__&lt;/span&gt;      &lt;span class='cm'&gt;/* optional */&lt;/span&gt;
    &lt;span class='p'&gt;(&lt;/span&gt;
    &lt;span class='n'&gt;assembly&lt;/span&gt; &lt;span class='n'&gt;code&lt;/span&gt;
    &lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='n'&gt;output&lt;/span&gt; &lt;span class='n'&gt;operands&lt;/span&gt; &lt;span class='cm'&gt;/* optional */&lt;/span&gt;
    &lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='n'&gt;input&lt;/span&gt; &lt;span class='n'&gt;operands&lt;/span&gt;  &lt;span class='cm'&gt;/* optional */&lt;/span&gt;
    &lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='n'&gt;clobber&lt;/span&gt; &lt;span class='n'&gt;list&lt;/span&gt;    &lt;span class='cm'&gt;/* optional */&lt;/span&gt;
    &lt;span class='p'&gt;);&lt;/span&gt;
    
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;For example, below is code to turn on bit 1 in &lt;code&gt;flag&lt;/code&gt; then store the value in &lt;code&gt;new_flag&lt;/code&gt;.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='c'&gt;    &lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;flag&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;new_flag&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='n'&gt;__asm__&lt;/span&gt;
    &lt;span class='p'&gt;(&lt;/span&gt;
    &lt;span class='s'&gt;&amp;quot;movl %1, %%eax &lt;/span&gt;&lt;span class='se'&gt;\n&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;&lt;/span&gt;
    &lt;span class='s'&gt;&amp;quot;orw $2, %%ax &lt;/span&gt;&lt;span class='se'&gt;\n&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;&lt;/span&gt;
    &lt;span class='s'&gt;&amp;quot;movl %%ax, %0 &lt;/span&gt;&lt;span class='se'&gt;\n&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;&lt;/span&gt;
    &lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;=r&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;new_flag&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='cm'&gt;/* output */&lt;/span&gt;
    &lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;r&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;flag&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;      &lt;span class='cm'&gt;/* input */&lt;/span&gt;
    &lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;%eax&amp;quot;&lt;/span&gt;         &lt;span class='cm'&gt;/* clobbered register */&lt;/span&gt;
    &lt;span class='p'&gt;);&lt;/span&gt;
    
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h4 id='preamble'&gt;Preamble&lt;/h4&gt;

&lt;p&gt;The &lt;code&gt;__asm__&lt;/code&gt; keyword marks the start of the inline assembly statement. While using &lt;code&gt;asm&lt;/code&gt; without the underscores is also valid in some contexts, it will not compile with the &lt;code&gt;-std=c99&lt;/code&gt; option. Moreover, the underscores prevent conflicts with &lt;code&gt;asm&lt;/code&gt; defined elsewhere in your code.&lt;/p&gt;

&lt;p&gt;The optional &lt;code&gt;__volatile__&lt;/code&gt; keyword indicates the assembly code has important side-effects and guarantees GCC will not delete it if it is reachable. It does not, however, guarantee that the assembly code will not be moved relative to other code.&lt;/p&gt;

&lt;h4 id='code'&gt;Code&lt;/h4&gt;

&lt;p&gt;The assembly code specifies the instructions to execute. Each instruction (or label) is enclosed within double quotes and terminated by a newline.&lt;/p&gt;

&lt;h4 id='operands'&gt;Operands&lt;/h4&gt;

&lt;p&gt;The general pattern for an operand is &lt;code&gt;&amp;quot;constraint&amp;quot;(expression)&lt;/code&gt; and multiple operands are separated by commas.&lt;/p&gt;

&lt;p&gt;In the assembly code each operand is reference by number, where &lt;code&gt;%0&lt;/code&gt; is the first output operand, &lt;code&gt;%1&lt;/code&gt; is the second, and so on, and &lt;code&gt;%N-1&lt;/code&gt; is the last input operand. Because the operands are indicated by a percent sign the register names must now be prefixed with two percent signs, like &lt;code&gt;%%eax&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;C expressions provide the input and output operands for the assembly code. An output expression (an lvalue) specifies where a result should be stored. An input expression specifies either a location (lvalue) or value (rvalue) as input to the code.&lt;/p&gt;

&lt;p&gt;Constraints help to decided the addressing mode and registers used for the input and output operands. Of the many constraints available, only a few are used frequently. These we discuss below.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;m&lt;/strong&gt;: The operand is stored in memory, at any memory address. (Instructions will operate on the data directly in memory.)&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;r&lt;/strong&gt;: The operand is stored in a general-purpose register. (GCC generates code to transfer the operand to or from memory and the register it chooses.)&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;i&lt;/strong&gt;: The operand is an immediate integer.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;0,&amp;#8230;,9&lt;/strong&gt;: The operand matches the operand with the specified number. (GCC will use the same variable for both operands. The two operands that match must be one input-only operand and one output-only operand.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Constraints may also have modifiers which provide additional control over the behavior of the operands. Three common constraints are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;=&lt;/strong&gt;: Operand is write-only&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;+&lt;/strong&gt;: Operand is both read and written&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;&amp;amp;&lt;/strong&gt;: Operand is clobbered early (i.e., is modified before the instruction is finished using the input operands, meaning it may not lie in a register used as an input operand or any part of memory)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id='clobber_list'&gt;Clobber List&lt;/h4&gt;

&lt;p&gt;The clobber list should contain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The registers modified, either explicitly or implicitly, by your code.&lt;/li&gt;

&lt;li&gt;If your code modifies the condition code register, &amp;#8220;cc&amp;#8221;.&lt;/li&gt;

&lt;li&gt;If your code modifies memory, &amp;#8220;memory&amp;#8221;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The clobber list informs GCC of the state potentially changed by your code so it won&amp;#8217;t make incorrect assumptions about the state and break things (always a Bad Thing).&lt;/p&gt;

&lt;h2 id='examples'&gt;Examples&lt;/h2&gt;

&lt;p&gt;To further illustrate all the stuff stuffed into this guide, I&amp;#8217;ve pulled a few examples from my operating system.&lt;/p&gt;

&lt;p&gt;To load the interrupt descriptor table register:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='c'&gt;    &lt;span class='kt'&gt;void&lt;/span&gt; &lt;span class='nf'&gt;set_idt&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;idt_pointer_t&lt;/span&gt; &lt;span class='o'&gt;*&lt;/span&gt;&lt;span class='n'&gt;ptr&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='n'&gt;__asm__&lt;/span&gt; &lt;span class='n'&gt;__volatile__&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;
        &lt;span class='s'&gt;&amp;quot;lidt %0 &lt;/span&gt;&lt;span class='se'&gt;\n&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;&lt;/span&gt; &lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;m&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;ptr&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;
    
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;To set the kernel code segment:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='c'&gt;    &lt;span class='kt'&gt;void&lt;/span&gt; &lt;span class='nf'&gt;set_kcs&lt;/span&gt; &lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='n'&gt;__asm__&lt;/span&gt; &lt;span class='n'&gt;__volatile__&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;
        &lt;span class='s'&gt;&amp;quot;ljmp %0, $farjmp &lt;/span&gt;&lt;span class='se'&gt;\n&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;&lt;/span&gt;
        &lt;span class='s'&gt;&amp;quot;farjmp: &lt;/span&gt;&lt;span class='se'&gt;\n&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;&lt;/span&gt;
        &lt;span class='s'&gt;&amp;quot;nop &lt;/span&gt;&lt;span class='se'&gt;\n&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;&lt;/span&gt;
        &lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;i&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;KERNEL_SEG_CODE&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;
    
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;To move bytes:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='c'&gt;    &lt;span class='kt'&gt;void&lt;/span&gt; &lt;span class='nf'&gt;kcopy&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kt'&gt;unsigned&lt;/span&gt; &lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;src&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='kt'&gt;unsigned&lt;/span&gt; &lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;dst&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
                &lt;span class='kt'&gt;unsigned&lt;/span&gt; &lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;nbytes&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='n'&gt;__asm__&lt;/span&gt; &lt;span class='n'&gt;__volatile__&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;
        &lt;span class='s'&gt;&amp;quot;cld &lt;/span&gt;&lt;span class='se'&gt;\n&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;&lt;/span&gt;
        &lt;span class='s'&gt;&amp;quot;rep &lt;/span&gt;&lt;span class='se'&gt;\n&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;&lt;/span&gt;
        &lt;span class='s'&gt;&amp;quot;movsb &lt;/span&gt;&lt;span class='se'&gt;\n&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;&lt;/span&gt;
        &lt;span class='o'&gt;:&lt;/span&gt;
        &lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;S&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;src&lt;/span&gt;&lt;span class='p'&gt;),&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;D&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;dst&lt;/span&gt;&lt;span class='p'&gt;),&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;c&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;nbytes&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
        &lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;%esi&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;%edi&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;%ecx&amp;quot;&lt;/span&gt; &lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;
    
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h2 id='references'&gt;References&lt;/h2&gt;

&lt;p&gt;I pulled this information from a variety of sources, chief among them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href='http://gcc.gnu.org/onlinedocs/gcc-4.3.0/gcc/Extended-Asm.html#Extended-Asm'&gt;GCC Extended Asm manual&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://sourceware.org/binutils/docs-2.18/as/index.html'&gt;GNU as manual&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html'&gt;GCC-Inline-Assemby-HOWTO&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://sig9.com/articles/att-syntax'&gt;AT&amp;amp;T Assembly Syntax&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content>
 </entry>
 
 
</feed>

