<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="text">RM</title><link rel="alternate" type="text/html" href="http://rmandvikar.blogspot.com/" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/rmandvikar" /><subtitle type="html">dumb Software Engineer</subtitle><author><name>RM</name><email>noreply@blogger.com</email><uri>http://www.blogger.com/profile/17713440099650366770</uri></author><updated>2011-12-12T08:35:25+00:00</updated><generator uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/">84</openSearch:totalResults><openSearch:startIndex xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/">1</openSearch:startIndex><openSearch:itemsPerPage xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/">25</openSearch:itemsPerPage><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="rmandvikar" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><id>tag:blogger.com,1999:blog-10096563</id><entry><title type="text">csharptrie project on Google Code</title><link rel="alternate" type="text/html" href="http://rmandvikar.blogspot.com/2010/10/csharptrie-project-on-google-code.html" /><category term="data structures" /><author><name>hIpPy</name><email>noreply@blogger.com</email><uri>http://www.blogger.com/profile/09878938744633565042</uri></author><updated>2010-10-06T21:52:21-07:00</updated><id>tag:blogger.com,1999:blog-10096563.post-306500104716721409</id><content type="html">Added project&amp;nbsp;&lt;a href="http://code.google.com/p/csharptrie/"&gt;csharptrie&lt;/a&gt;&amp;nbsp;-&amp;nbsp;a C# implementation of trie data structure&amp;nbsp;to Google Code.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10096563-306500104716721409?l=rmandvikar.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/rmandvikar?a=VofpHaXUlsU:6UoG2t6vygQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rmandvikar?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><app:edited xmlns:app="http://www.w3.org/2007/app">2010-10-06T21:52:21.340-07:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></entry><entry><title type="text">building tree view from given child-parent pairs in hashmap</title><link rel="alternate" type="text/html" href="http://rmandvikar.blogspot.com/2010/08/building-tree-view-from-given-child.html" /><category term="data structures" /><category term="algorithms" /><author><name>hIpPy</name><email>noreply@blogger.com</email><uri>http://www.blogger.com/profile/09878938744633565042</uri></author><updated>2010-08-23T15:50:22-07:00</updated><id>tag:blogger.com,1999:blog-10096563.post-4055842331609037360</id><content type="html">Ex: The child-parent pairs are in a hashmap 'childParentMap' as shown below. The root node is with value 0.&lt;br /&gt;
1 -&amp;gt; 0&lt;br /&gt;
2 -&amp;gt; 1&lt;br /&gt;
3 -&amp;gt; 2&lt;br /&gt;
4 -&amp;gt; 2&lt;br /&gt;
5 -&amp;gt; 0&lt;br /&gt;
&lt;br /&gt;
The tree node data structure has an int value and list of children tree nodes.&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
class TreeNode:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int value&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; IList children&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; //constructor&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; TreeNode(int value):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; this.value = value&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; children = new List()&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
The code first traverses through the childParentMap hashmap to build the value-&amp;gt;TreeNode hashmap 'valueNodeMap'. It traverses through it again to get child and parent values, their equivalent nodes and adds the child node to the parent node. The root node with value 0 is created separately (root of the tree). &lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
TreeNode createTreeView(Hashmap childParentMap):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; // build value-&amp;gt;TreeNode map&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Hashmap valueNodeMap = new Hashmap()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (KeyValuePair kvPair in childParentMap):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; int value = kvPair.Key&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; TreeNode node = new TreeNode(value)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if !valueNodeMap.ContainsKey(value):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; valueNodeMap.Add(value, node)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; // add root value 0 and root node to valueNodeMap&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int rootValue = 0;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; TreeNode rootNode = new TreeNode(rootValue);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; valueNodeMap.Add(rootValue, rootNode);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; // for child and parent values, find equivalent nodes and &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; // add child node as child to parent node&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (KeyValuePair kvPair in childParentMap):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; int childValue = kvPair.Key &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; int parentValue = kvPair.Value&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; TreeNode childNode = valueNodeMap[childValue]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; TreeNode parentNode = valueNodeMap[parentValue]&lt;br /&gt;
&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; parentNode.children.Add(childNode)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; // return root&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return rootNode &lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Time is O(n). &lt;br /&gt;
&lt;br /&gt;
There is a recursive solution too but it takes O(n^2) time. &lt;br /&gt;
&lt;br /&gt;
The code is similar to building a graph from an adjacency list. &lt;br /&gt;
&lt;br /&gt;
[H/T ai, as, sc, jf, se]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10096563-4055842331609037360?l=rmandvikar.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/rmandvikar?a=Vck9d7_xpDA:3NmBBXMdWJQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rmandvikar?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-23T15:50:22.702-07:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><title type="text">bracket matching</title><link rel="alternate" type="text/html" href="http://rmandvikar.blogspot.com/2010/08/bracket-matching.html" /><category term="algorithms" /><author><name>hIpPy</name><email>noreply@blogger.com</email><uri>http://www.blogger.com/profile/09878938744633565042</uri></author><updated>2010-08-06T17:54:53-07:00</updated><id>tag:blogger.com,1999:blog-10096563.post-6160259006663661878</id><content type="html">Check for brackets matching - curly, square, round, {}[]() - and return boolean.&lt;br /&gt;
ex: return true for&lt;br /&gt;
{}&lt;br /&gt;
{[()]}&lt;br /&gt;
{()[]}&lt;br /&gt;
return false for&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
bool bracketMatching(char[] str):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; bool result = true&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Stack stack = new Stack()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; //close-open bracket map&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Hashmap bracketMap = new Hashmap()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; bracketMap.Add('}', '{')&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; bracketMap.Add(')', '(')&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; bracketMap.Add(']', '[')&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (char c in str):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (c == '{' || c == '[' || c == '('):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; stack.Push(c)&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (c == '}' || c == ']' || c == ')'): &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (stack.isEmpty&lt;/code&gt;&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;()&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;):&lt;/span&gt;&lt;br /&gt;
&lt;code&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; result = false&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; break&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //tos should be open bracket and c close bracket&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; char tos = stack.Pop()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (tos != bracketMap[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; result = false&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; break&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!stack.isEmpty()):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; result = false&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return result&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
[Hat tip to BR]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10096563-6160259006663661878?l=rmandvikar.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/rmandvikar?a=G_yAWPST868:c88-sYTay6Q:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rmandvikar?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-06T17:54:53.395-07:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><title type="text">codejam 2010 qualifications</title><link rel="alternate" type="text/html" href="http://rmandvikar.blogspot.com/2010/05/codejam-2010-qualifications.html" /><category term="algorithms" /><category term="code" /><author><name>hIpPy</name><email>noreply@blogger.com</email><uri>http://www.blogger.com/profile/09878938744633565042</uri></author><updated>2010-05-22T15:31:29-07:00</updated><id>tag:blogger.com,1999:blog-10096563.post-392166948186924356</id><content type="html">&lt;a href="http://code.google.com/codejam/contest/dashboard?c=433101#"&gt;qualifications problems&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;A Snapper Chain&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
The snappers are same as incrementing binary bits. The overflow is discarded. ANDing K with 111...N bits gives the state of the snappers after K snaps. The count of&amp;nbsp;1 bits&amp;nbsp;of that number if same as N means the state is ON else OFF.&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman';"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;code&gt; string &lt;b&gt;snapperChain&lt;/b&gt;(int n, int k)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int nbit = (int) Math.Pow(2, n) - 1;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int result = nbit &amp;amp; k;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int count1 = count1bits(result);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (count1 == n)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return "ON";&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return "OFF";&lt;br /&gt;
&lt;br /&gt;
int count1bits(int num)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int n = num;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int count = 0;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; while (n != 0)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; n = n &amp;amp; (n - 1);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; count++;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return count;&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;B Fair Warning&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
I used this &lt;a href="http://intx.codeplex.com/"&gt;IntX&lt;/a&gt; code for 64+ bits data structure. The trick is to subtract the min of the array and find their gcd - which gives Tmax. ymin is calculated then. One way is to sort the array and find the gcd from index 1...N. Another way is to find the min and put checks for 0 in gcd function.&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
string &lt;b&gt;fairWarning&lt;/b&gt;(IntX[] input)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; IntX Tmax = -1;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; IntX ymin = -1;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; //Array.Sort(input);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; IntX min = minf(input);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; for (int i = 0; i &amp;lt; input.Length; i++)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; input[i] = input[i] - min;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Tmax = gcdf(input);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (Tmax == 0 || (min % Tmax) == 0)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ymin = 0;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ymin = Tmax - (min % Tmax);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return ymin.ToString()&lt;br /&gt;
&lt;br /&gt;
//min of array&lt;br /&gt;
IntX minf(IntX[] input)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; IntX min = input[0];&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; for (int i = 0; i &amp;lt; input.Length; i++)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (input[i] &amp;lt; min)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; min = input[i];&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return min;&lt;br /&gt;
&lt;br /&gt;
//gcd of array&lt;br /&gt;
IntX gcdf(IntX[] input)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; IntX a = input[0];&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; for (int i = 1; i &amp;lt; input.Length; i++)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; IntX b = input[i];&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (i &amp;lt; input.Length-1 &amp;amp;&amp;amp; a == 0)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; i++;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; a = input[i];&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (i &amp;lt; input.Length-1 &amp;amp;&amp;amp; b == 0)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; i++;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; b = input[i];&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; a = gcdf(a, b);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return a;&lt;br /&gt;
&lt;br /&gt;
//gcd of a, b&lt;br /&gt;
IntX gcdf(IntX a, IntX b)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (a == 0 &amp;amp;&amp;amp; b == 0)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; throw new ArgumentException();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; while (b != 0)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; IntX t = a % b;&lt;br /&gt;
&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; b = t;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return a;&lt;br /&gt;
&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;C Theme Park&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Limits&lt;br /&gt;
1 &amp;lt;= T &amp;lt;= 50&lt;br /&gt;
gi &amp;lt;= k&lt;br /&gt;
&lt;br /&gt;
Small dataset&lt;br /&gt;
1 &amp;lt;= R &amp;lt;= 1000&lt;br /&gt;
1 &amp;lt;= k &amp;lt;= 100&lt;br /&gt;
1 &amp;lt;= N &amp;lt;= 10&lt;br /&gt;
1 &amp;lt;= gi &amp;lt;= 10&lt;br /&gt;
&lt;br /&gt;
Large dataset&lt;br /&gt;
1 &amp;lt;= R &amp;lt;= 10^8&lt;br /&gt;
1 &amp;lt;= k &amp;lt;= 10^9&lt;br /&gt;
1 &amp;lt;= N &amp;lt;= 1000&lt;br /&gt;
1 &amp;lt;= gi &amp;lt;= 10^7&lt;br /&gt;
&lt;br /&gt;
My first solution was of O(R*N) time i.e. 10^8 * 10^3 which does not work for large dataset. The trick is to&amp;nbsp;first&amp;nbsp;calculate and cache the sums and save the next group position which takes O(N*N) time i.e. 10^6 and then add the sums in O(R) time i.e. 10^8 - the sum is calculated for each position i of N in cache[]&amp;nbsp;and the next group index in nextCacheIndex[].&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
Int64 &lt;b&gt;themePark&lt;/b&gt;(Int64 R, Int64 k, Int64[] q)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Int64 totalMoney = 0;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Int64 groups = q.Length;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Int64[] cache = new Int64[q.Length];&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Int64[] nextCacheIndex = new Int64[q.Length];&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; for (Int64 i = 0; i &amp;lt; groups; i++)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Int64 sum = 0;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Int64 nextIndex = i;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Int64 groupCount = 0;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //while sum &amp;lt;= k and not at the end of the *current* queue &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; while ((sum + q[nextIndex] &amp;lt;= k) &amp;amp;&amp;amp; (groupCount &amp;lt; groups))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; sum += q[nextIndex];&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; nextIndex = (nextIndex + 1) % groups;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; groupCount++;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; cache[i] = sum;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; nextCacheIndex[i] = nextIndex;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Int64 index = 0;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; for (Int64 r = 0; r &amp;lt; R; r++)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; totalMoney += cache[index];&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; index = nextCacheIndex[index];&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return totalMoney;&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
[codejam]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10096563-392166948186924356?l=rmandvikar.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/rmandvikar?a=--kLmuSSmhk:jitPr-x-gww:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rmandvikar?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-22T15:31:29.599-07:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><title type="text">permutations and combinations of string - derivative</title><link rel="alternate" type="text/html" href="http://rmandvikar.blogspot.com/2010/05/permutations-and-combinations-of-string.html" /><category term="algorithms" /><author><name>hIpPy</name><email>noreply@blogger.com</email><uri>http://www.blogger.com/profile/09878938744633565042</uri></author><updated>2010-05-14T23:23:26-07:00</updated><id>tag:blogger.com,1999:blog-10096563.post-2242212813559155214</id><content type="html">This is a derivative of&amp;nbsp;&lt;a href="http://rmandvikar.blogspot.com/2008/07/permutations-and-combinations-of-string.html"&gt;permutations&lt;/a&gt; of a string. For digits [1, 2, 3], we want [1, 12, 21, 123, 132, 213, 231, 312, 321]. The permute_wrapper loops through the input array to permute the sub-array with limit marking its end.&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
def permute_wrapper(digits):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; input = [i for i in range(1, digits+1)]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; print(input)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; output = [0 for x in range(len(input))]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; flags = [False for x in range(len(input))]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; depth = 0&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;&lt;i&gt;for i in range(len(input)):&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; permute_(input, &lt;b&gt;&lt;i&gt;i+1&lt;/i&gt;&lt;/b&gt;, output, flags, depth, nums)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return nums&lt;br /&gt;
&lt;br /&gt;
def permute_(input, &lt;b&gt;&lt;i&gt;limit&lt;/i&gt;&lt;/b&gt;, output, flags, depth, nums):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if depth == &lt;b&gt;&lt;i&gt;limit&lt;/i&gt;&lt;/b&gt;:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; num = 0&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; factor = 1&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; for i in range(&lt;b&gt;&lt;i&gt;limit&lt;/i&gt;&lt;/b&gt;, 0, -1):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; num = num + output[i - 1] * factor&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; factor *= 10&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; nums.append(num)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return None&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; for i in range(&lt;b&gt;&lt;i&gt;limit&lt;/i&gt;&lt;/b&gt;):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if flags[i] == True:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; continue&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; flags[i] = True&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; output[depth] = input[i]&lt;br /&gt;
&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; permute_(input, &lt;b&gt;&lt;i&gt;limit&lt;/i&gt;&lt;/b&gt;, output, flags, depth + 1, nums)&lt;br /&gt;
&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; flags[i] = False&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
For combinations of digits, &lt;a href="http://rmandvikar.blogspot.com/2008/07/permutations-and-combinations-of-string.html"&gt;instead of using a string buffer&lt;/a&gt; for output, an int array is used. index is used to keep track of where to insert the digit. The number is between index and 0 of output array.&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
def combine_wrapper(digits):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; input = [i for i in range(1, digits+1)]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; print(input)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; output = [0 for x in range(len(input))]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; start = 0&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;&lt;i&gt;index &lt;/i&gt;= 0&lt;/b&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; combine_(input, output, start, &lt;b&gt;&lt;i&gt;index&lt;/i&gt;&lt;/b&gt;, nums)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return nums&lt;br /&gt;
&lt;br /&gt;
def combine_(input, output, start, &lt;b&gt;&lt;i&gt;index&lt;/i&gt;&lt;/b&gt;, nums):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if start == len(input):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return None&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; for i in range(start, len(input), 1):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; output[&lt;b&gt;&lt;i&gt;index&lt;/i&gt;&lt;/b&gt;] = input[i]&lt;br /&gt;
&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; num = 0&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; factor = 1&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; for x in range(&lt;b&gt;&lt;i&gt;index&lt;/i&gt;&lt;/b&gt;, -1, -1):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; num = num + output[x] * factor&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; factor *= 10&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; nums.append(num)&lt;br /&gt;
&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; &lt;b&gt;&lt;i&gt;index+=1&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; combine_(input, output, i + 1, &lt;b&gt;&lt;i&gt;index&lt;/i&gt;&lt;/b&gt;, nums)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;&lt;i&gt;index-=1&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10096563-2242212813559155214?l=rmandvikar.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/rmandvikar?a=x1d4YAReJPA:qVWAYVBDAN0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rmandvikar?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-14T23:23:26.672-07:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><title type="text">nine-digit polydivisible number with 1 to 9 exactly once: 381654729</title><link rel="alternate" type="text/html" href="http://rmandvikar.blogspot.com/2010/05/nine-digit-polydivisible-number-with-1.html" /><category term="algorithms" /><author><name>hIpPy</name><email>noreply@blogger.com</email><uri>http://www.blogger.com/profile/09878938744633565042</uri></author><updated>2010-05-14T22:52:25-07:00</updated><id>tag:blogger.com,1999:blog-10096563.post-3160209117686674761</id><content type="html">&lt;i&gt;Arrange the digits 1 to 9 in order so that the first two digits form a multiple of 2, the first three digits form a multiple of 3, the first four digits form a multiple of 4 etc. and finally the entire number is a multiple of 9. It contains the digits 1 to 9 exactly once each. [&lt;a href="http://en.wikipedia.org/wiki/Polydivisible_number#Background"&gt;Polydivisible number&lt;/a&gt;]&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
There are 9^9 9-digit numbers; 9^9 = 387420489. There are only 9! numbers with 1-9 appearing only once; 9! = 362880 (1000 times smaller set). So, the trick is to find those 9! first (using &lt;a href="http://rmandvikar.blogspot.com/2008/07/permutations-and-combinations-of-string.html"&gt;permutations&lt;/a&gt;&amp;nbsp;or otherwise) and then check for polydivisiblity. 381654729 is the only number.&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;#checks if a number is polydivisible&lt;br /&gt;
#polydivCheck(381654729)&lt;br /&gt;
def polydivCheck(n, digts):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; for i in range(digts, 0, -1):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (n % i != 0):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return False&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; n = int(n / 10)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return True&lt;br /&gt;
&lt;br /&gt;
#finds permutation for array 'input' and puts the numbers in list 'nums'&lt;br /&gt;
def permute(digits, input, output, flags, depth, nums):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if depth == len(input):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; num = 0&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; factor = 1&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; for i in range(digits, 0, -1):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; num = num + output[i - 1] * factor&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; factor *= 10&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; nums.append(num)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; for i in range(len(input)):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if flags[i] == True:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; continue&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; flags[i] = True&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; output[depth] = input[i]&lt;br /&gt;
&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; permute(digits, input, output, flags, depth + 1, nums)&lt;br /&gt;
&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; flags[i] = False&lt;br /&gt;
&lt;br /&gt;
#wrapper function to call the recursive 'permute' function&lt;br /&gt;
def permute_wrapper(digits):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; input = [i for i in range(1, digits+1)]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; output = [0 for x in range(len(input))]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; flags = [False for x in range(len(input))]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; depth = 0&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; nums = []&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; permute(digits, input, output, flags, depth, nums);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return nums&lt;br /&gt;
&lt;br /&gt;
#calls 'permute_wrapper' and for each number checks for polydivisibility&lt;br /&gt;
def getPolydivNums(digits):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; nums = permute_wrapper(digits)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; numbers=[]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; for num in nums:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if polydivCheck(num, digits):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; numbers.append(num)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return numbers&lt;br /&gt;
&lt;br /&gt;
#start(9)&lt;br /&gt;
def start(digits):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; nums = getPolydivNums(digits)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; for n in nums:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; print(n)&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
[Hat tip to JF]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10096563-3160209117686674761?l=rmandvikar.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/rmandvikar?a=ZNwdXbyZBmI:4s7JXQF4B4Y:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rmandvikar?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-14T22:52:25.126-07:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><title type="text">print all word combinations from phone number</title><link rel="alternate" type="text/html" href="http://rmandvikar.blogspot.com/2009/09/print-all-word-combinations-from-phone.html" /><category term="algorithms" /><author><name>hIpPy</name><email>noreply@blogger.com</email><uri>http://www.blogger.com/profile/09878938744633565042</uri></author><updated>2010-05-02T08:01:53-07:00</updated><id>tag:blogger.com,1999:blog-10096563.post-2441135000135517666</id><content type="html">Print all words combinations from phone number.&lt;br /&gt;
ex: 111-1111 -&amp;gt; AAA-AAAA, AAA-AAAB ... CCC-CCCC&lt;br /&gt;
&lt;br /&gt;
char charkeyMap(int digit, int position)&lt;br /&gt;
ex:&lt;br /&gt;
charkeyMap(1, 0) = 'A'&lt;br /&gt;
charkeyMap(1, 1) = 'B'&lt;br /&gt;
charkeyMap(1, 2) = 'C'&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
void printCombinations(int[] in):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; char[] out = new char[in.length]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; //first combination ex: 111-1111 -&amp;gt; AAA-AAAA&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; for(int i = in.length -1; i &amp;gt;= 0; i--):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; out[i] = charkeyMap(in[i], 0)&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int i&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; while (true):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; out.print()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; i = in.length - 1;&lt;br /&gt;
&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; while (true):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //if A then B&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if out[i] == charkeyMap(in[i], 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; out[i] = charkeyMap(in[i], 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; break&lt;br /&gt;
&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; //if B then C&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if out[i] == charkeyMap(in[i], 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; out[i] = charkeyMap(in[i], 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; break&lt;br /&gt;
&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; //if C then A and let it loop for the adjacent digit&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if out[i] == charkeyMap(in[i], 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; out[i] = charkeyMap(in[i], 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; //let it loop&lt;br /&gt;
&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; i--&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if i &amp;lt; 0 break&lt;br /&gt;
&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; if i &amp;lt; 0 break&lt;br /&gt;
&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10096563-2441135000135517666?l=rmandvikar.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/rmandvikar?a=4U8C58annQI:Ntd9ONJ3sOE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rmandvikar?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-02T08:01:53.136-07:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total></entry><entry><title type="text">fix duplicates in sorted array</title><link rel="alternate" type="text/html" href="http://rmandvikar.blogspot.com/2009/09/fix-duplicates-in-sorted-array.html" /><category term="algorithms" /><author><name>hIpPy</name><email>noreply@blogger.com</email><uri>http://www.blogger.com/profile/09878938744633565042</uri></author><updated>2009-09-26T13:02:01-07:00</updated><id>tag:blogger.com,1999:blog-10096563.post-5855360831690706560</id><content type="html">12233344445 -&amp;gt; 12345&lt;br /&gt;&lt;br /&gt;&lt;code&gt; &lt;br /&gt;//using 3 pointers&lt;br /&gt;fixDuplicatesInSortedArray(Integer[] a):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; start = 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end = 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; destination = 0&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while(start &amp;lt; a.length):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; while(end &amp;lt; a.length &amp;amp;&amp;amp; a[end] == a[start]):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; end++&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; end--&lt;br /&gt;&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; //copy the distinct element&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; a[destination] = a[start]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; destination++&lt;br /&gt;&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; start = end + 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; end = start&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //null out the rest&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while destination &amp;lt; a.length:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; a[destination] = null&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return&lt;br /&gt;&lt;br /&gt;//using 2 pointers&lt;br /&gt;fixDuplicatesInSortedArray(Integer[] a):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; prev = 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; curr = 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while curr &amp;lt; a.length():&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; while curr &amp;lt; a.length &amp;amp;&amp;amp; a[curr] == c[prev]:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; curr++&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if curr == a.length() break&lt;br /&gt;&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; prev++&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; a[prev] = a[curr]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; curr++&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //null out the rest&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; prev++&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while prev &amp;lt; a.length:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; a[prev] = null&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;[Hat tip to MG]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10096563-5855360831690706560?l=rmandvikar.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/rmandvikar?a=q2MIdJ5XJK4:fLY72dBt0_4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rmandvikar?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-26T13:02:01.351-07:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><title type="text">topical arguments</title><link rel="alternate" type="text/html" href="http://rmandvikar.blogspot.com/2009/09/topical-arguments.html" /><category term="humor" /><author><name>hIpPy</name><email>noreply@blogger.com</email><uri>http://www.blogger.com/profile/09878938744633565042</uri></author><updated>2009-09-17T08:23:49-07:00</updated><id>tag:blogger.com,1999:blog-10096563.post-377765887615480352</id><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_9AXCwRt0usM/SrHH0RKAf-I/AAAAAAAAP48/OT4q5hJJUyw/s1600-h/topical+arguments.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_9AXCwRt0usM/SrHH0RKAf-I/AAAAAAAAP48/OT4q5hJJUyw/s400/topical+arguments.jpg" title="'That's not true' wins." /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="text-align: left;clear: both; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="text-align: left;clear: both; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="text-align: left;clear: both; "&gt;&lt;span class="Apple-style-span"   style="font-family:Arial, sans-serif;color:#333333;"&gt;[Hats off to xkcd - images from &lt;a href="http://xkcd.com/630/"&gt;Time Travel&lt;/a&gt;, &lt;a href="http://xkcd.com/593/"&gt;Voynich Manuscript&lt;/a&gt;]&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10096563-377765887615480352?l=rmandvikar.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/rmandvikar?a=uJ7Evsqzuuc:VbiR4Dj1fRo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rmandvikar?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-17T08:23:49.450-07:00</app:edited><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_9AXCwRt0usM/SrHH0RKAf-I/AAAAAAAAP48/OT4q5hJJUyw/s72-c/topical+arguments.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><title type="text">induction too</title><link rel="alternate" type="text/html" href="http://rmandvikar.blogspot.com/2009/07/induction-too.html" /><category term="puzzles" /><category term="humor" /><author><name>hIpPy</name><email>noreply@blogger.com</email><uri>http://www.blogger.com/profile/09878938744633565042</uri></author><updated>2009-07-26T00:05:52-07:00</updated><id>tag:blogger.com,1999:blog-10096563.post-5635083369237436739</id><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_9AXCwRt0usM/Smv8rbWSKTI/AAAAAAAANBk/dfOZj5kQoFI/s1600-h/fpp.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_9AXCwRt0usM/Smv8rbWSKTI/AAAAAAAANBk/dfOZj5kQoFI/s400/fpp.jpg" title="'Rational' is another word for Perfectly Logical Being. He was already dead when he said that." /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
My lame attempt at &lt;a href="http://en.wikipedia.org/wiki/Pirate_game"&gt;this&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[Hats off to &lt;a href="http://xkcd.com/"&gt;xkcd&lt;/a&gt; - images from &lt;a href="http://xkcd.com/468/"&gt;Fetishes&lt;/a&gt;, &lt;a href="http://xkcd.com/559/"&gt;No Pun Intended&lt;/a&gt;, &lt;a href="http://xkcd.com/593/"&gt;Voynich Manuscript&lt;/a&gt;, &lt;a href="http://xkcd.com/589/"&gt;Designated Drivers&lt;/a&gt;]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10096563-5635083369237436739?l=rmandvikar.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/rmandvikar?a=BlWi51ExUDY:c1Q3Ur8lhfE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rmandvikar?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-26T00:05:52.176-07:00</app:edited><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_9AXCwRt0usM/Smv8rbWSKTI/AAAAAAAANBk/dfOZj5kQoFI/s72-c/fpp.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><title type="text">Head First Design Patterns book</title><link rel="alternate" type="text/html" href="http://rmandvikar.blogspot.com/2009/07/head-first-design-patterns-book.html" /><category term="design" /><category term="books" /><author><name>hIpPy</name><email>noreply@blogger.com</email><uri>http://www.blogger.com/profile/09878938744633565042</uri></author><updated>2009-07-12T22:03:00-07:00</updated><id>tag:blogger.com,1999:blog-10096563.post-6202202959112896454</id><content type="html">Head First Design Patterns (&lt;a href="http://oreilly.com/catalog/9780596007126/"&gt;link&lt;/a&gt;) book: It is such a nice read. A must read for Software Engineers. It is, although, a preface to the GoF book.&lt;br /&gt;
&lt;br /&gt;
It is very visual, simple to read, easy to understand, highly exemplified. And it is fun to read.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10096563-6202202959112896454?l=rmandvikar.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/rmandvikar?a=MBvBDm8cgtc:tzX80Lb3E50:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rmandvikar?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-12T22:03:00.290-07:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><title type="text">dfs, bfs without recurssion</title><link rel="alternate" type="text/html" href="http://rmandvikar.blogspot.com/2009/06/dfs-bfs-without-recurssion.html" /><category term="data structures" /><category term="algorithms" /><author><name>hIpPy</name><email>noreply@blogger.com</email><uri>http://www.blogger.com/profile/09878938744633565042</uri></author><updated>2009-06-15T17:31:51-07:00</updated><id>tag:blogger.com,1999:blog-10096563.post-5006666729897016336</id><content type="html">&lt;b&gt;BFS (Breath First Search) without recurssion: &lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
BFS is a first in first out search. So, a non-recursive version of BFS can be done using a queue.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;void bfs_nonrecursive(Node root) : &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Queue queue = new Queue()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; while (true): &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; curr = queue.pop()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if curr == null:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; break&lt;br /&gt;
&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; queue.push(curr.left)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; queue.push(curr.right)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; curr.printValue()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
Time: Since each node is visited once, O(n) time is required.&lt;br /&gt;
&lt;br /&gt;
Space: We save the nodes at each level. We have to save a maximum of n/2 nodes for the last level. i.e. O(n) space is needed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;DFS (Depth First Search) without recurssion: &lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
DFS is a first in last out search. It is a&amp;nbsp;recursive&amp;nbsp;process. Recursion uses a stack implicitly. So,&amp;nbsp;a non-recursive version of DFS&amp;nbsp;can be done using a stack. Since we want to hold off visiting a particular node until all of its children are visited, we have to push the node again on the stack. We need to differentiate when we revisit the node ("backtracking" in recursion) so that we do not push its children&amp;nbsp;again on the stack. For that we use a Hashmap data structure which serves as a flag to denote if a node is already visited and its children are added to the stack.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: monospace;"&gt;void dfs_nonrecursive(Node root) :&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;code&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; Stack stack = new Stack()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; stack.push(root)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Hashmap visited = new Hashmap()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; while true :&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; curr = stack.pop()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if curr == null:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; break&lt;br /&gt;
&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; //if curr has children and curr not in visited&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (curr.left != null || curr.right != null) &amp;amp;&amp;amp; visited.get(curr) == null :&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; stack.push(curr)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; stack.push(right)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; stack.push(left)&lt;br /&gt;
&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; visited.put(curr)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; continue&lt;br /&gt;
&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; curr.printValue()&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Time: We visit the non-leaf nodes (n/2) twice and the leaf nodes (n/2) once. So, 2*(n/2) + n/2 = O(3n/2) i.e. still O(n) time.&lt;br /&gt;
&lt;br /&gt;
Space: Hashmap visited saves references to the non-leaf nodes only. For tree of n nodes, visited would saves 2^logn-1 = n/2 still O(n) space. The stack would save only O(logn) nodes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10096563-5006666729897016336?l=rmandvikar.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/rmandvikar?a=5ICrPgS9Yi4:tvh61lDCNE4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rmandvikar?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-15T17:31:51.967-07:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><title type="text">Induction</title><link rel="alternate" type="text/html" href="http://rmandvikar.blogspot.com/2009/06/induction.html" /><category term="puzzles" /><category term="humor" /><author><name>hIpPy</name><email>noreply@blogger.com</email><uri>http://www.blogger.com/profile/09878938744633565042</uri></author><updated>2009-06-15T13:35:25-07:00</updated><id>tag:blogger.com,1999:blog-10096563.post-8983659666428442280</id><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_9AXCwRt0usM/SidJ9zH10FI/AAAAAAAAKcA/0ljV7ldabv8/s1600-h/cheating+husbands+puzzle.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_9AXCwRt0usM/SidJ9zH10FI/AAAAAAAAKcA/0ljV7ldabv8/s400/cheating+husbands+puzzle.png" title="Correction: Make that Cheating Husband #50." /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;PS: For information, read Josephine's problem (Cheating Husbands Puzzle) over &lt;a href="http://en.wikipedia.org/wiki/Induction_puzzle"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;[Hats off to &lt;a href="http://xkcd.com/"&gt;xkcd&lt;/a&gt; - images from &lt;a href="http://xkcd.com/53/"&gt;Hobby&lt;/a&gt; and &lt;a href="http://xkcd.com/487/"&gt;Numerical Sex Positions&lt;/a&gt;]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10096563-8983659666428442280?l=rmandvikar.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/rmandvikar?a=cdZY8f5-DN8:_Y09s-v4n1E:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rmandvikar?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-15T13:35:25.422-07:00</app:edited><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_9AXCwRt0usM/SidJ9zH10FI/AAAAAAAAKcA/0ljV7ldabv8/s72-c/cheating+husbands+puzzle.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><title type="text">Windows 7</title><link rel="alternate" type="text/html" href="http://rmandvikar.blogspot.com/2009/04/windows-7.html" /><category term="installation" /><author><name>hIpPy</name><email>noreply@blogger.com</email><uri>http://www.blogger.com/profile/09878938744633565042</uri></author><updated>2009-05-06T00:17:12-07:00</updated><id>tag:blogger.com,1999:blog-10096563.post-7626138853100350811</id><content type="html">A few days back, I posted about &lt;a href="http://rmandvikar.blogspot.com/2009/01/intrepid-ibex.html"&gt;installing Ubuntu on my laptop&lt;/a&gt; instead of going with Vista. After some really onerous trials at installing XP went in vain&amp;nbsp;AGAIN, I decided to go with Windows 7 beta (fingers crossed).&lt;br /&gt;
&lt;br /&gt;
That said I can safely say from my experience is - Lenovo's ThinkPad support is a farce and ridiculously incompetent (I heard previously that ThinkPads' support made it a ThinkPad).&lt;br /&gt;
&lt;br /&gt;
It is about 120 days after that I am able to get Windows on my laptop. &lt;i&gt;The laptop is about 120 days old.&lt;/i&gt;&amp;nbsp;I refuse to pay for recovery DVDs.&amp;nbsp;I refuse to install Vista.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: #0b5394;"&gt;Update: The only issue I have had so far with Windows 7 is the sound did not work as default (Volume Control Options - Sound Devices - check Speakers).&lt;/div&gt;&lt;br /&gt;
&lt;span style="color: #0b5394;"&gt;Update 5/6: Updated to RC (build 7100) from beta build 7077 from&amp;nbsp;&lt;/span&gt;&lt;a href="http://lifehacker.com/5240931/lifehackers-guide-to-upgrading-to-windows-7-rc"&gt;&lt;span style="color: #0b5394;"&gt;here&lt;/span&gt;&lt;/a&gt;&lt;span style="color: #0b5394;"&gt;&amp;nbsp;and&amp;nbsp;&lt;/span&gt;&lt;a href="http://www.nirmaltv.com/2009/05/02/how-to-upgrade-from-windows-7-beta-to-rc-build/"&gt;&lt;span style="color: #0b5394;"&gt;here&lt;/span&gt;&lt;/a&gt;&lt;span style="color: #0b5394;"&gt;.&amp;nbsp;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10096563-7626138853100350811?l=rmandvikar.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/rmandvikar?a=JTfxZlEavLs:gusdwbf0-jY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rmandvikar?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-06T00:17:12.294-07:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><title type="text">+c</title><link rel="alternate" type="text/html" href="http://rmandvikar.blogspot.com/2009/04/c.html" /><category term="tech" /><author><name>hIpPy</name><email>noreply@blogger.com</email><uri>http://www.blogger.com/profile/09878938744633565042</uri></author><updated>2009-05-01T11:15:23-07:00</updated><id>tag:blogger.com,1999:blog-10096563.post-4086390808635622072</id><content type="html">I bit the bullet. Took the leap. Faced the music. Peed in the wind.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I switched to Chrome (&lt;span style="font-size: x-small;"&gt;Dev Channel&lt;/span&gt;) as default browser.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #0b5394;"&gt;Update:&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #0b5394;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="color: #0b5394;"&gt;I made my Chrome's launch icon --incognito.&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="color: #0b5394;"&gt;I made my default browser registry setting as --incognito for http and https.&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="color: #0b5394;"&gt;I made all the above changes on all the machines I use.&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="color: #0b5394;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="color: #0b5394;"&gt;Some people do not like history. Some people do not like thumbnails. Some people do not like autocomplete for the URL bar. Some people like to type.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="color: #0b5394;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="color: #0b5394;"&gt;Chrome developers, please provide a simple way to always open in incognito - and get a nice spot in heaven. Remember karma.&amp;nbsp;Remember - 'Don't do evil'. ;)&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10096563-4086390808635622072?l=rmandvikar.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/rmandvikar?a=mjoy9afJkm4:l56UxR4wrvg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rmandvikar?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-01T11:15:23.611-07:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><title type="text">Is this an original or copy?</title><link rel="alternate" type="text/html" href="http://rmandvikar.blogspot.com/2009/03/is-this-original-or-copy.html" /><category term="humor" /><author><name>hIpPy</name><email>noreply@blogger.com</email><uri>http://www.blogger.com/profile/09878938744633565042</uri></author><updated>2009-03-12T21:30:52-07:00</updated><id>tag:blogger.com,1999:blog-10096563.post-4233509764623390797</id><content type="html">I created a copy for you and I want to keep the original. But I got it mixed up and now &lt;b&gt;I do not know which one is the copy and which one is the original&lt;/b&gt;. &lt;br /&gt;
&lt;br /&gt;
(silence)&lt;br /&gt;
&lt;br /&gt;
It is the same paper quality. And, I did not mark on the originals with a red/blue pen or highlighter or pencil. &lt;b&gt;They both&amp;nbsp;are same in every aspect&lt;/b&gt;&lt;i&gt;. &lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
(silence)&lt;br /&gt;
&lt;br /&gt;
Damn! &lt;b&gt;I will just make another copy and give that to you!&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
(silence)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PS: There have been numerous occasions where I can relate to this event (like how one should know if the current problem relates to an NP-complete problem :D).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10096563-4233509764623390797?l=rmandvikar.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/rmandvikar?a=BHpBYBXVBls:mZPCfEMdLbA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rmandvikar?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-12T21:30:52.931-07:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><title type="text">sudoku evil</title><link rel="alternate" type="text/html" href="http://rmandvikar.blogspot.com/2009/03/sudoku-evil.html" /><category term="puzzles" /><author><name>hIpPy</name><email>noreply@blogger.com</email><uri>http://www.blogger.com/profile/09878938744633565042</uri></author><updated>2009-03-03T20:23:32-08:00</updated><id>tag:blogger.com,1999:blog-10096563.post-2194072641414266206</id><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_9AXCwRt0usM/Sam-wBl4_XI/AAAAAAAAGfM/P_Pc7tRpfNQ/s1600-h/sudoku_evil.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_9AXCwRt0usM/Sam-wBl4_XI/AAAAAAAAGfM/P_Pc7tRpfNQ/s400/sudoku_evil.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;[&lt;a href="http://www.websudoku.com/"&gt;web sudoku&lt;/a&gt;]&lt;/div&gt;&lt;br /&gt;
Sometime back, I had solved this sudoku. After filling in the few blanks in blue, it did not budge. So I had assumed the positions of the 1-3 &lt;i&gt;pair&lt;/i&gt; in the top right square. &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;With any sudoku, you should not have to assume.&lt;/b&gt; I tried it again and found it to be true. &lt;br /&gt;
&lt;br /&gt;
I was stuck again at the same state. In the bottom right square, 3 and 5, even though possible in different blocks, &lt;i&gt;paired&lt;/i&gt;. After that, &lt;i&gt;it fell apart&lt;/i&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10096563-2194072641414266206?l=rmandvikar.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/rmandvikar?a=edJh8fJdKF8:uoH8XTW4xQM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rmandvikar?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-03T20:23:32.981-08:00</app:edited><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_9AXCwRt0usM/Sam-wBl4_XI/AAAAAAAAGfM/P_Pc7tRpfNQ/s72-c/sudoku_evil.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><title type="text">Nice Video on Credit Crisis</title><link rel="alternate" type="text/html" href="http://rmandvikar.blogspot.com/2009/02/nice-video-on-credit-crisis.html" /><author><name>hIpPy</name><email>noreply@blogger.com</email><uri>http://www.blogger.com/profile/09878938744633565042</uri></author><updated>2009-02-22T19:30:57-08:00</updated><id>tag:blogger.com,1999:blog-10096563.post-9195589995975420921</id><content type="html">&lt;div style="text-align: center;"&gt;&lt;object height="225" width="400"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=3261363&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=3261363&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="225"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://vimeo.com/3261363"&gt;The Crisis of Credit Visualized&lt;/a&gt; from &lt;a href="http://vimeo.com/jonathanjarvis"&gt;Jonathan Jarvis&lt;/a&gt; on &lt;a href="http://vimeo.com/"&gt;Vimeo&lt;/a&gt;.&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
This is a nice work by &lt;a href="http://jonnyj.net/m5"&gt;Jonathan Jarvis&lt;/a&gt; who provides a &lt;u&gt;simple&lt;/u&gt; and &lt;u&gt;logical&lt;/u&gt; explanation of the current Credit Crisis.&lt;br /&gt;
&lt;br /&gt;
Key points the video focuses on are: &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Terms involved in credit crisis: Sub-prime Mortgages, Collatarized Debt Obligation, Credit Default Swaps and Frozen Credit Market. &lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;How Home Owners (Main Street) and Investors (Wall Street) were connected through the Investment Banks. &lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;How credit and leverage normally works and how Investment Banks abused it.&lt;/li&gt;
&lt;li&gt;The entities involved in Housing market: Home Owners, Broker, Lender, Investment Banks, Investors. &lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;What is Collaterized Debt Obligation (&lt;i&gt;a bunch of Safe, OK and Risky mortgages&lt;/i&gt;). &lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;How Investment Banks sold the so-called safe investments (mortgages with AAA ratings provided by Rating Agencies) to the Investors interested only in safe investments.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;How the Lenders sold the defaulted &lt;b&gt;Prime Mortgages&lt;/b&gt; to "less responsible" Home Owners (the turning point) as &lt;b&gt;Sub-prime Mortgages&lt;/b&gt; which were later bought by Investment Banks. (&lt;i&gt;The "less responsible" Home Owners eventually defaulted too leading to the vicious cycle.)&lt;/i&gt; &lt;/li&gt;
&lt;li&gt;Why the Housing prices went down (&lt;i&gt;due to more supply of houses in the market than demand&lt;/i&gt;) and how it led to the crash of the Housing Market (&lt;i&gt;either Home Owners defaulted or forsake the depreciating asset&lt;/i&gt;). &lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;How Investment Banks (and even Investors) are left with such currently risky Housing assets that no one else (Investors, others Banks, etc.) wants to buy. This led to the &lt;b style="color: #cc0000;"&gt;Frozen Credit Market&lt;/b&gt;.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10096563-9195589995975420921?l=rmandvikar.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/rmandvikar?a=y1Yb0SaZz0o:tz2tIgtEcSU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rmandvikar?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-22T19:30:57.615-08:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><title type="text">List</title><link rel="alternate" type="text/html" href="http://rmandvikar.blogspot.com/2009/02/list.html" /><category term="data structures" /><author><name>hIpPy</name><email>noreply@blogger.com</email><uri>http://www.blogger.com/profile/09878938744633565042</uri></author><updated>2009-04-08T20:53:05-07:00</updated><id>tag:blogger.com,1999:blog-10096563.post-7941302561969658564</id><content type="html">The List with basic APIs:&lt;br /&gt;
&lt;br /&gt;
boolean add(Object)&lt;br /&gt;
void add(Object, index)&lt;br /&gt;
Object remove(index)&lt;br /&gt;
int size() &lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
class &lt;span style="color: blue;"&gt;List&lt;/span&gt;:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;//data members&lt;/b&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int end//end element, zero-based&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Object[] list//array&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;//constructors&lt;/b&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; List():&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; list = new Object[10] //default = 10&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; end = -1&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; List(int size):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; list = new Object[size]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; end = -1&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;//methods&lt;/b&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;boolean add(element)&lt;/span&gt;:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //return false if element does not satisfy certain conditions&lt;br /&gt;
&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; //increase array size if maxed out&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if list.length() = end+1 :&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //create new array and copy elements from current array&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; sizeNew = &lt;i&gt;getNewSize()&lt;/i&gt; //determine the new size&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; listNew = new Object[sizeNew]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; for i = 0 to end :&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; listNew[i] = list[i]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; list = listNew&lt;br /&gt;
&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; end++&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; list[end] = element&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return true&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;void add(element, index)&lt;/span&gt;:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if index &amp;gt; end :&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; throw exception('out of bounds')&lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //increase array size if maxed out&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if list.length() = end+1 :&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //create new array and copy elements from current array&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; sizeNew = &lt;i&gt;getNewSize()&lt;/i&gt; //determine the new size&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; listNew = new Object[sizeNew]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; for i = 0 to end :&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; listNew[i] = list[i]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; list = listNew&lt;br /&gt;
&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; //shift elements&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; for int i = end down to index :&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; list[i+1] = list[i] &lt;br /&gt;
&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; end++&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; list[index] = element&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;Object remove(index)&lt;/span&gt;:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if end &amp;lt; 0 :&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; throw exception('list empty')&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if index &amp;gt; end :&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; throw exception('out of bounds')&lt;br /&gt;
&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; removedObject = list[index]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //shift elements&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; for int i = index to end-1 :&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; list[i] = list[i+1]&lt;br /&gt;
&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; list[end] = null&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; end--&lt;br /&gt;
&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; return removedObject&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;int size()&lt;/span&gt;:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return end+1 &lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
[Hat tip to TL]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10096563-7941302561969658564?l=rmandvikar.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/rmandvikar?a=9oPa2AoEmuY:mj6iXH6KjPw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rmandvikar?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-08T20:53:05.465-07:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></entry><entry><title type="text">typing</title><link rel="alternate" type="text/html" href="http://rmandvikar.blogspot.com/2009/02/typing.html" /><category term="tech" /><author><name>hIpPy</name><email>noreply@blogger.com</email><uri>http://www.blogger.com/profile/09878938744633565042</uri></author><updated>2009-04-08T20:53:31-07:00</updated><id>tag:blogger.com,1999:blog-10096563.post-726883721503358697</id><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://upload.wikimedia.org/wikipedia/commons/4/40/Touch_typing.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="138" src="http://upload.wikimedia.org/wikipedia/commons/4/40/Touch_typing.png" width="420" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;[from wikipedia]&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Recently, I read &lt;a href="http://www.codinghorror.com/blog/archives/001188.html"&gt;too&lt;/a&gt; many &lt;a href="http://steve-yegge.blogspot.com/2008/09/programmings-dirtiest-little-secret.html"&gt;good&lt;/a&gt; articles on &lt;a href="http://www.codinghorror.com/blog/archives/001221.html"&gt;this&lt;/a&gt; topic and I thought I should write on it too due to its importance. :D&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;The keyboard is the most used &lt;i&gt;input&lt;/i&gt; interface with the computer (even more than the mouse).&lt;/b&gt; So typing speed does matter. &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Touch typing is typing without the sight of the keys&lt;/b&gt;. Above is the layout of the &lt;b&gt;zones&lt;/b&gt; for each finger (QWERTY). Some people can correctly touch-type fast without sticking to these zones. They have invented their own typing technique and would not want to change zones now. However, if they do, it would certainly boost their speed in the long run. &lt;br /&gt;
&lt;br /&gt;
I always recommend touch typing to others. And sticking to the zones. &lt;br /&gt;
&lt;br /&gt;
There should be enough &lt;a href="http://www.typeonline.co.uk/lesson1.html"&gt;sites&lt;/a&gt; to learn touch-typing and speed testing. And there is Typing of the Dead :D. For programmers, &lt;b&gt;70 rpm&lt;/b&gt; (as per Steve Yegge) should be achievable. &lt;br /&gt;
&lt;br /&gt;
Recently, I found that I was using the wrong fingers for two keys and I am trying hard to switch - and it is turning out to be hard. The more you are used to, the harder it is to correct. So correct early. Use both hands for combination keys (ex: Shift key for caps). &lt;b&gt;I think Typing 101 is a really good investment.&lt;/b&gt; &lt;br /&gt;
&lt;br /&gt;
A difference of keys throws me off and for that reason I always dread the keyboard design in laptops (not to mention the difference from vendor to vendor).&lt;br /&gt;
&lt;br /&gt;
I read about ergonomic keyboards which increase typing to some extent (and reduce muscle strain). I might look into &lt;a href="http://www.amazon.com/dp/B000A6PPOK/"&gt;one&lt;/a&gt;. But I would need to carry it around then. :D&lt;br /&gt;
&lt;br /&gt;
I read about &lt;a href="http://en.wikipedia.org/wiki/Dvorak_Simplified_Keyboard"&gt;Dvorak Simplified Keyboard&lt;/a&gt; and I think it would have been a &lt;a href="http://en.wikipedia.org/wiki/Typewriter#Typing_speed_records_and_speed_contests"&gt;great experience&lt;/a&gt; to have used it. I would have been able to compare my speeds on both layouts. However, the inability to use the Ctrl X, C, V keys is a con. Which leads me to speculate that Dvorak keyboard is more for typists than programmers.&lt;br /&gt;
&lt;br /&gt;
Again to reiterate.&lt;b&gt; We are typists first, programmers second. &lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[Hat&amp;nbsp;tip&amp;nbsp;to Jeff Atwood, Steve Yegge]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10096563-726883721503358697?l=rmandvikar.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/rmandvikar?a=232VNfgM6NM:p-nl5NAOMPI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rmandvikar?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-08T20:53:31.176-07:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><title type="text">heapsort</title><link rel="alternate" type="text/html" href="http://rmandvikar.blogspot.com/2009/02/heapsort.html" /><category term="algorithms" /><author><name>hIpPy</name><email>noreply@blogger.com</email><uri>http://www.blogger.com/profile/09878938744633565042</uri></author><updated>2009-02-07T14:53:51-08:00</updated><id>tag:blogger.com,1999:blog-10096563.post-7655134985022719192</id><content type="html">In heapsort,&lt;br /&gt;
- First put the elements of the array in a heap property (max-heap has the greater elements as parents) so that the first element is the max.&lt;br /&gt;
- The first element (root of heap) is swapped with the last element of the array (last leaf node of the heap) and the array is again put in heap property by sifting up or sifting down. &lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
heapSort(array) :&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; //get max at root&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;maxheapify&lt;/span&gt;(array)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; end = array.length() -1&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; while end &amp;gt; 0 :&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; // put max at the end&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; swap(0, end)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; end--&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; // put heap in max-heap order again&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;siftDown&lt;/span&gt;(0, end) // or &lt;/code&gt;&lt;code&gt;&lt;span style="color: #38761d;"&gt;siftUp&lt;/span&gt;(0, end)&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Sift-Down version&lt;/b&gt;: The sift-down version sifts the root or start down the heap. It takes O(n) time.&lt;br /&gt;
&lt;br /&gt;
The sift-down version takes O(n) time.&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;maxHeapify&lt;/span&gt;(array) :&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; start = (length-2) /2 //last parent node&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; while start &amp;gt;= 0 :&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;siftDown&lt;/span&gt;(start, length-1)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; start--&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: blue;"&gt;siftDown&lt;/span&gt;(start, end) :&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; root = start&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; lastLeaf = end&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; while root*2 +1 &amp;lt;= lastLeaf :&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; child = root*2 +1&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (child+1 &amp;lt;= lastLeaf) and (a[child+1] &amp;gt; a[child]) : &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; child = child+1&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if a[root] &amp;lt; a[child] : &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; swap(a[root], a[child])&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; root = child&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; else :&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Sift-Up version&lt;/b&gt;: The sift-up version builds the heap top-down as if starting with an empty heap and inserting new nodes. The child or end is sifted up to the root. &lt;br /&gt;
&lt;br /&gt;
&lt;span style="background-color: yellow;"&gt;The sift-up version is slower and takes O(nlogn) time.&lt;/span&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
&lt;span style="color: #38761d;"&gt;maxHeapify&lt;/span&gt;(array) :&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; end = 1&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; while end &amp;lt; length :&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #38761d;"&gt;siftUp&lt;/span&gt;(0, end)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; end++&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #38761d;"&gt;siftUp&lt;/span&gt;(start, end) :&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; root = start&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; child = end&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; while child &amp;gt; root :&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; parent = child-1 /2&lt;br /&gt;
&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; if a[parent] &amp;lt; a[child] :&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; swap (a[parent], a[child])&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; child = parent&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; else :&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
The heap-sort with either version has &lt;b&gt;O(nlogn)&lt;/b&gt; time efficiency.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10096563-7655134985022719192?l=rmandvikar.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/rmandvikar?a=aMbfAKGxvhg:jo0DAaP-214:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rmandvikar?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-07T14:53:51.538-08:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><title type="text">Gmail with new ways to label mail</title><link rel="alternate" type="text/html" href="http://rmandvikar.blogspot.com/2009/02/gmail-with-new-ways-to-label-mail.html" /><category term="tech" /><author><name>hIpPy</name><email>noreply@blogger.com</email><uri>http://www.blogger.com/profile/09878938744633565042</uri></author><updated>2009-02-05T06:49:35-08:00</updated><id>tag:blogger.com,1999:blog-10096563.post-8245465810144366971</id><content type="html">&lt;a href="http://gmailblog.blogspot.com/2009/02/new-ways-to-label-with-move-to-and-auto.html"&gt;Gmail&lt;/a&gt; has &lt;a href="http://rmandvikar.blogspot.com/2008/07/suggest-feature-for-gmail.html"&gt;heard&lt;/a&gt; me and have rolled out faster ways to label conversation. However, applying multiple labels to a conversation is still tedious. &lt;br /&gt;
&lt;br /&gt;
I have mixed thoughts of the new look that comes with the buttons. It is an irony to Gmail's clean interface. &lt;br /&gt;
&lt;br /&gt;
The simulation of 'folders with the move to' - I do not use it, so it &lt;a href="http://googlesystem.blogspot.com/2008/04/so-when-do-we-get-folders-in-gmail.html"&gt;does not matter to me&lt;/a&gt;. It is a little noise on screen. But it seems like a lot of people desire it for Gmail to have come up with a compromise. &lt;span style="color: #0b5394;"&gt;Update: On another note, if &lt;/span&gt;&lt;a href="http://www.43folders.com/izero" style="color: #0b5394;"&gt;Inbox&lt;/a&gt;&lt;span style="color: #0b5394;"&gt; &lt;/span&gt;&lt;a href="http://video.google.com/videoplay?docid=973149761529535925" style="color: #0b5394;"&gt;Zero&lt;/a&gt;&lt;span style="color: #0b5394;"&gt; is &lt;/span&gt;&lt;a href="http://lifehacker.com/380044/top-10-email-productivity-boosters" style="color: #0b5394;"&gt;a&lt;/a&gt;&lt;span style="color: #0b5394;"&gt; &lt;/span&gt;&lt;a href="http://lifehacker.com/software/email/merlin-mann-presents-inbox-zero-282544.php" style="color: #0b5394;"&gt;great&lt;/a&gt;&lt;span style="color: #0b5394;"&gt; &lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/Getting_Things_Done" style="color: #0b5394;"&gt;deal&lt;/a&gt;&lt;span style="color: #0b5394;"&gt; for you, this would be really helpful. &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10096563-8245465810144366971?l=rmandvikar.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/rmandvikar?a=NMvbw83DoYo:Affe0MXDPuk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rmandvikar?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-05T06:49:35.256-08:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><title type="text">Find the distinct words from a text file</title><link rel="alternate" type="text/html" href="http://rmandvikar.blogspot.com/2009/02/find-distinct-words-from-text-file.html" /><category term="data structures" /><category term="algorithms" /><author><name>hIpPy</name><email>noreply@blogger.com</email><uri>http://www.blogger.com/profile/09878938744633565042</uri></author><updated>2009-02-01T20:23:05-08:00</updated><id>tag:blogger.com,1999:blog-10096563.post-1791873781211429165</id><content type="html">I'm repeating this post from &lt;a href="http://rmandvikar.blogspot.com/2008/10/trie-examples.html"&gt;here&lt;/a&gt;, but I think it deserves it because of its elegance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
The data structure of the trie and its &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;addWord()&lt;/span&gt; method remains the same.&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
class trieNode:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; trieNode[26] children&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; char c&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int countPrefix // words with prefix from root to current node&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int countWord // complete words for this current node &lt;br /&gt;
&lt;br /&gt;
void addWord(trieNode node, string word): &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //end of the word&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (word = ""):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; node.countWord = node.countWord +1&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //do stuff with current node&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; node.countPrefix = node.countPrefix + 1&lt;br /&gt;
&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; //go to next node &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; char first = firstChar(word)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (node.children[first] == null):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; node.children[first] = new trieNode()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; addWord(node.children[first], firstCharRemoved(word))&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Another example is to &lt;b&gt;find the distinct words from a text file&lt;/b&gt;. At first, I thought of a Hashmap which acts like a boolean array for the words as index. In which case, the time required is O(n) and space required is that of the distinct words. With Trie, the solution is better and elegant in terms of space required, time required is O(length). In case of words 'anon', 'an', 'a', the Trie formed (''-&lt;u&gt;a&lt;/u&gt;-&lt;u&gt;n&lt;/u&gt;-o-&lt;u&gt;n&lt;/u&gt;) would just need space for a-n-o-n. Thus, the advantages of Trie would show over a Hashmap when many words have overlapping prefixes. Once the Trie is formed, a DFS would print the distinct words as follows. &lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
//do DFS on the trie&lt;br /&gt;
StringBuilder sb = new StringBuilder()&lt;br /&gt;
dfs(root, sb)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void dfs(trieNode node, StringBuilder sb):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; sb.append(node.c)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (node.countWord &amp;gt; 0):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; print(sb)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; for (trieNode child : node.children)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (child != null):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; dfs(child, sb)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; sb.length = sb.length -1 &lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
[Hat tip to B.]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10096563-1791873781211429165?l=rmandvikar.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/rmandvikar?a=msBW1guNvG8:1s6VJ0gA9LI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rmandvikar?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-01T20:23:05.481-08:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><title type="text">Google's and gmail's malware and spam issues for today</title><link rel="alternate" type="text/html" href="http://rmandvikar.blogspot.com/2009/01/googles-and-gmails-malware-and-spam.html" /><category term="tech" /><author><name>hIpPy</name><email>noreply@blogger.com</email><uri>http://www.blogger.com/profile/09878938744633565042</uri></author><updated>2009-01-31T19:41:13-08:00</updated><id>tag:blogger.com,1999:blog-10096563.post-5029600742933150919</id><content type="html">Though &lt;a href="http://googleblog.blogspot.com/2009/01/this-site-may-harm-your-computer-on.html"&gt;this&lt;/a&gt; is not as scary, there is a lot of "hubbub" about it - &lt;i&gt;Google marked my site as malware&lt;/i&gt;. It is obvious that it must have been a human error.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;&lt;span style="background-color: white;"&gt;&lt;span style="color: #0b5394;"&gt;&lt;span style="border-collapse: collapse;"&gt;&lt;span style="color: black;"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="background-color: white;"&gt;&lt;span style="color: #0b5394;"&gt;We work with a non-profit called &lt;a href="http://stopbadware.org/"&gt;StopBadware.org&lt;/a&gt; to come up with criteria for maintaining this list, and to provide simple processes for webmasters to remove their site from the list.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="border-collapse: collapse;"&gt;&lt;span style="color: #0b5394;"&gt;We periodically update that list and released one such update to the site this morning.&lt;span style="color: #0b5394;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="background-color: white;"&gt;&lt;span style="color: #0b5394;"&gt;&lt;span style="border-collapse: collapse;"&gt;&lt;span style="color: black;"&gt; Unfortunately (and here's the human error), the URL of '/' was mistakenly checked in as a value to the file and '/' expands to all URLs.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote&gt;... &lt;/blockquote&gt;&lt;blockquote&gt;&lt;span style="background-color: white;"&gt;&lt;span style="color: #0b5394;"&gt;&lt;span style="border-collapse: collapse;"&gt;&lt;span style="color: black;"&gt;We will carefully investigate this incident and put more robust file checks in place to prevent it from happening again."&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote&gt;- Marissa Mayer&lt;/blockquote&gt;&lt;br /&gt;
The original post from Google was updated (&lt;span style="color: #0b5394;"&gt;updated text in blue&lt;/span&gt;) and it looks like Google is trying (though it might not be intentional) to shift blame on &lt;span style="color: #0b5394;"&gt;StopBadware.org&lt;/span&gt;&lt;span style="background-color: white;"&gt;&lt;span style="color: #0b5394;"&gt;&lt;span style="color: black;"&gt;.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
It's not human error to include &lt;a href="http://en.wikipedia.org/wiki/Monkey_test"&gt;even junk input to a program&lt;/a&gt;. &lt;b&gt;It's a human error NOT to check it though&lt;/b&gt; - URL '/' is a valid input in this case.&lt;br /&gt;
&lt;br /&gt;
Almost 6 hours later, &lt;a href="http://gmailblog.blogspot.com/2009/01/this-mornings-spam-filter-issue.html"&gt;Gmail issues a statement&lt;/a&gt; saying that it uses Google's malware filters and mail might have went to spam. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_9AXCwRt0usM/SYUQ9VPT_4I/AAAAAAAAGW4/Bi_KUjELHaM/s1600-h/gmail+legitmate+mail+as+spam.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_9AXCwRt0usM/SYUQ9VPT_4I/AAAAAAAAGW4/Bi_KUjELHaM/s400/gmail+legitmate+mail+as+spam.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Now this is scary because it happened to me (nobody searches my blog :P). Below is a cool thing though. I have a soft corner for Gmail's spam team - I think it is quite under-appreciated. &lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;"&lt;b&gt;We're working to roll out an automated fix to put these legitimate messages back into your inboxes, and we expect this to happen within a day.&lt;/b&gt; In the meantime, if you were expecting a critical message this morning, please check your spam folder. (We tune our spam filters well enough that ordinarily you should never have to check your spam folder.)"&lt;/blockquote&gt;&lt;blockquote&gt;- Gmail Blog&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10096563-5029600742933150919?l=rmandvikar.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/rmandvikar?a=CY2BVnq9cMI:nUR6kceH7_c:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rmandvikar?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-31T19:41:13.025-08:00</app:edited><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_9AXCwRt0usM/SYUQ9VPT_4I/AAAAAAAAGW4/Bi_KUjELHaM/s72-c/gmail+legitmate+mail+as+spam.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry><title type="text">1.10 MBps</title><link rel="alternate" type="text/html" href="http://rmandvikar.blogspot.com/2009/01/110-mbps.html" /><category term="thoughts" /><author><name>hIpPy</name><email>noreply@blogger.com</email><uri>http://www.blogger.com/profile/09878938744633565042</uri></author><updated>2009-02-03T21:05:08-08:00</updated><id>tag:blogger.com,1999:blog-10096563.post-2767666083066897890</id><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_9AXCwRt0usM/SYJ1LuJYmiI/AAAAAAAAGVQ/t8psVwlVtCY/s400/1.10mbs.jpg" /&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
The ~$50 spent on internet is the best money spent &lt;i&gt;ever&lt;/i&gt;. &lt;br /&gt;
&lt;br /&gt;
- Net Neutrality Proponent.&lt;br /&gt;
&lt;br /&gt;
I was finally able to run the &lt;a href="http://broadband.mpi-sws.org/transparency/bttest.php"&gt;Glasnost&lt;/a&gt; test (&lt;a href="http://www.measurementlab.net/"&gt;m-labs&lt;/a&gt;) and everything seems to be good.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10096563-2767666083066897890?l=rmandvikar.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/rmandvikar?a=SfEYb2WpyZc:_zoVjMwS1cQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rmandvikar?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-03T21:05:08.971-08:00</app:edited><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_9AXCwRt0usM/SYJ1LuJYmiI/AAAAAAAAGVQ/t8psVwlVtCY/s72-c/1.10mbs.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry></feed>

