<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>A nasality talisman for the sultana analyst</title><link>http://blogs.msdn.com/ericlippert/archive/2009/02/04/a-nasality-talisman-for-the-sultana-analyst.aspx</link><description>The other day my charming wife Leah and I were playing Scrabble Brand Crossword Game (a registered trademark of Hasbro and Mattel) as is our wont. I went first, drawing the Q and a bunch of vowels. Knowing that the Q is death to hold onto, I immediately</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>re: A nasality talisman for the sultana analyst</title><link>http://blogs.msdn.com/ericlippert/archive/2009/02/04/a-nasality-talisman-for-the-sultana-analyst.aspx#9397486</link><pubDate>Thu, 05 Feb 2009 07:01:30 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9397486</guid><dc:creator>Alan</dc:creator><description>&lt;p&gt;The general problem of writing a Scrabble playing program came up as a software project option in my final year at university (my group chose a different project because we thought Scrabble sounded too hard, we wrote a software simulation of the MC68000 CPU instead!).&lt;/p&gt;
&lt;p&gt;The trick turned out to be the data structure that holds the dictionary. &amp;nbsp;You can preprocess the dictionary into a Directed Acyclic Word Graph, start with a tree where each node holds a letter and each &amp;quot;edge&amp;quot; leads to another node that holds the next letter in each valid word that shares the prefix, then collapse all of the common suffixes so that they're shared wherever possible.&lt;/p&gt;
&lt;p&gt;Once you've got the DAWG, any way you navigate through the directed graph will produce a valid word, so you can generate all the words for a given rack by following the letter combinations, chasing down multiple paths if you have a blank to play with, adding in letters already on the board at certain positions in the word, etc, etc.&lt;/p&gt;
&lt;p&gt;The problem of making software play the game then comes down to what strategies can be applied to maximise the score (do you chase triple word scores? search for high value letters? look for word reuse/extension opportunities?).&lt;/p&gt;
&lt;p&gt;Neat problem, neat solution (might not be the best/most efficient way of finding anagrams though)!&lt;/p&gt;
</description></item><item><title>re: A nasality talisman for the sultana analyst</title><link>http://blogs.msdn.com/ericlippert/archive/2009/02/04/a-nasality-talisman-for-the-sultana-analyst.aspx#9397522</link><pubDate>Thu, 05 Feb 2009 07:24:51 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9397522</guid><dc:creator>Thomas</dc:creator><description>&lt;p&gt;This can be done more efficiently (in terms of computer time, not programmer's time) by building a histogram out of each word. Make an array of 26 buckets; entry 0 contains the number of A's, entry 1 the number of B's, etcetera. Then your comparisons are in O(1) instead of O(length_of_word), simply by comparing the histograms bucket-by-bucket. (Of course, this does not scale to languages with a larger alphabet. But I suppose that Chinese Scrabble doesn't exist anyway.)&lt;/p&gt;
&lt;p&gt;As a bonus, an arbitrary number of blanks can easily be implemented. While comparing the histogram of the rack with the histogram of a dictionary word, pretend the blanks are not there. If there are more of a certain letter on the rack than there are in the dictionary word, you know that you can't form that word with your whole rack. If there are more of the letter in the dictionary word than on the rack, use as many blanks as you need. If you run out of blanks, you also know that the word can't be formed.&lt;/p&gt;
&lt;p&gt;I estimate that this method will take less than 0.1 second to search a 2 MB dictionary.&lt;/p&gt;
&lt;p&gt;Do I pass the Microsoft interview now? ;)&lt;/p&gt;
</description></item><item><title>re: A nasality talisman for the sultana analyst</title><link>http://blogs.msdn.com/ericlippert/archive/2009/02/04/a-nasality-talisman-for-the-sultana-analyst.aspx#9397680</link><pubDate>Thu, 05 Feb 2009 09:21:02 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9397680</guid><dc:creator>Brad</dc:creator><description>&lt;p&gt;@Thomas&lt;/p&gt;
&lt;p&gt;Just a note - although you're right that comparing the histograms is O(1), so is comparing the words really, since the word length for scrabble will never be longer than 7 or 8 letters in practice (occasionally you can continue to build on words and get longer, but he's not handling that case anyhow) so I'm not sure that comparing 26 buckets will really be faster than comparing the canonicalized strings.&lt;/p&gt;
&lt;p&gt;The real issue is that you're O(n) in the size of the dictionary.&lt;/p&gt;
&lt;p&gt;My first thought was to use tries (much like Alan describes) although it would be simpler to use a a hash table with the canonicalized strings mapped to the original. You couldn't just use a dictionary (since the same canonical form could be generated from several words), but it would be fairly simple to build. Building this would probably be bounded by the disk io of reading the word list, and finding the words would only require 26 lookups for one &amp;quot;?&amp;quot; and 676 for 2. It's though to imagine beating that by much.&lt;/p&gt;
</description></item><item><title>re: A nasality talisman for the sultana analyst</title><link>http://blogs.msdn.com/ericlippert/archive/2009/02/04/a-nasality-talisman-for-the-sultana-analyst.aspx#9397908</link><pubDate>Thu, 05 Feb 2009 12:02:41 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9397908</guid><dc:creator>Tanveer Badar</dc:creator><description>&lt;p&gt;T9 mode in cell phones works quite similarly. Although, there are no wild card searches as yet. You group words by length in a table. Then, cycle through them when the user presses next word key.&lt;/p&gt;
</description></item><item><title>re: A nasality talisman for the sultana analyst</title><link>http://blogs.msdn.com/ericlippert/archive/2009/02/04/a-nasality-talisman-for-the-sultana-analyst.aspx#9398437</link><pubDate>Thu, 05 Feb 2009 16:22:01 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9398437</guid><dc:creator>Tim Long</dc:creator><description>&lt;p&gt;Thanks for this interesting little article which nicely showcases how useful Linq is just in general everyday programming. Plus, you introducde me to The Big Snit. Yea!&lt;/p&gt;
&lt;p&gt;I was just thinking about the number of programming examples I've seen where the author states &amp;quot;This is not production quality code&amp;quot;. Hitler once said, if you repeat a lie often enough, people will believe it. My point is, we see lots of these 'quick and dirty' examples and after a while, it is easy to start believing that 'Production Quality Code' is a mythical thing. I know from experience that a lot of programmers do actually write very poor code and then put it into production. I don't really know where I'm going with this, except to say that, with the best of intentions, it is all too easy to set a bad example.&lt;/p&gt;
</description></item><item><title>re: A nasality talisman for the sultana analyst</title><link>http://blogs.msdn.com/ericlippert/archive/2009/02/04/a-nasality-talisman-for-the-sultana-analyst.aspx#9398490</link><pubDate>Thu, 05 Feb 2009 16:41:43 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9398490</guid><dc:creator>Joe Chung</dc:creator><description>&lt;P&gt;File.ReadAllLines(dictionary) is a one-liner replacement for FileLines().&lt;/P&gt;
&lt;P&gt;It's a pity that you can only use the join operator on equality comparisons, else we could have done this:&lt;/P&gt;
&lt;P&gt;from word in File.ReadAllLines(dictionary)&lt;BR&gt;let canonical = Canonicalize(word)&lt;BR&gt;join rack in racks on rack.Contains(canonical)&lt;BR&gt;orderby word&lt;BR&gt;select word;&lt;/P&gt;
&lt;P&gt;[[ ERIC: ReadAllLines is not a one-liner replacement. ReadAllLines reads the entire 2 meg dictionary into memory at once. My version reads one line at a time into memory. The next version of the framework will probably have a&amp;nbsp;version of ReadAllLines that does it my way. ]]&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description></item><item><title>re: A nasality talisman for the sultana analyst</title><link>http://blogs.msdn.com/ericlippert/archive/2009/02/04/a-nasality-talisman-for-the-sultana-analyst.aspx#9398520</link><pubDate>Thu, 05 Feb 2009 16:54:30 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9398520</guid><dc:creator>Joe Chung</dc:creator><description>&lt;p&gt;Actually, joining rack in racks on canonical equals rack would work just fine!&lt;/p&gt;
</description></item><item><title>re: A nasality talisman for the sultana analyst</title><link>http://blogs.msdn.com/ericlippert/archive/2009/02/04/a-nasality-talisman-for-the-sultana-analyst.aspx#9399670</link><pubDate>Thu, 05 Feb 2009 22:51:15 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9399670</guid><dc:creator>Aaron G</dc:creator><description>&lt;p&gt;Is it cheating to pre-compute the canonical forms? &amp;nbsp;I mean, clearly the bottleneck is having to iterate through the whole dictionary, not computing the 676 combinations of blanks in the rack, so you just need an index. &amp;nbsp;Stuff the original word and canonical form into an MSDE database and you could do all those lookups, well, pretty much instantly.&lt;/p&gt;
&lt;p&gt;I know, it's not clever, but why fuss over DAWGs and histograms and data structures when somebody has already done most of the work for you? &amp;nbsp;Memory and disk space are cheap. &amp;nbsp;The clever part, as Eric already pointed out, is turning the word from a sequence into a set; how you do the transformation seems like micro-optimization to me.&lt;/p&gt;
&lt;p&gt;Would I fail the Microsoft interview for taking that approach? :-)&lt;/p&gt;
</description></item><item><title>re: A nasality talisman for the sultana analyst</title><link>http://blogs.msdn.com/ericlippert/archive/2009/02/04/a-nasality-talisman-for-the-sultana-analyst.aspx#9399779</link><pubDate>Thu, 05 Feb 2009 23:46:45 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9399779</guid><dc:creator>Eric Lippert</dc:creator><description>&lt;P&gt;Of course it is not "cheating" because I haven't specified what the rules are. :-)&lt;/P&gt;
&lt;P&gt;This is not the first time I've implemented this program; my earlier JScript version worked by writing two programs, one which transformed the dictionary into an index file, and one which did lookups in the index file. That version was quite fast.&lt;/P&gt;
&lt;P&gt;That works great for the problem that I stated -- find all the words that exactly match a given rack. It might work much less well for harder problems, like "find the highest scoring word that can be made from any of the letters in this rack", or even harder still, like "find the highest scoring play for a given rack and board state". &amp;nbsp;For those problems, a simple index might not be good enough. I don't know; I haven't tried.&lt;/P&gt;</description></item><item><title>re: A nasality talisman for the sultana analyst</title><link>http://blogs.msdn.com/ericlippert/archive/2009/02/04/a-nasality-talisman-for-the-sultana-analyst.aspx#9400066</link><pubDate>Fri, 06 Feb 2009 01:49:30 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9400066</guid><dc:creator>Thomas</dc:creator><description>&lt;p&gt;@Brad: You're right, a hashtable is a better solution (if the number of blanks is small). Neat.&lt;/p&gt;
</description></item><item><title>re: A nasality talisman for the sultana analyst</title><link>http://blogs.msdn.com/ericlippert/archive/2009/02/04/a-nasality-talisman-for-the-sultana-analyst.aspx#9402673</link><pubDate>Fri, 06 Feb 2009 21:22:52 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9402673</guid><dc:creator>Figment Engine</dc:creator><description>&lt;P&gt;Nice post, I've written an extension method that makes &lt;A href="http://blog.figmentengine.com/2009/02/enumerable-character-ranges.html"&gt;Enumerable character ranges&lt;/A&gt; easier to work with.&lt;/P&gt;
&lt;P&gt;So you can write:&lt;/P&gt;
&lt;P&gt;foreach (char c in 'A'.To('Z'))&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(c);&lt;BR&gt;instead of:&lt;/P&gt;
&lt;P&gt;foreach (char c in "ABCDEFGHIJKLMNOPQRSTUVWXYZ")&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(c);&lt;/P&gt;
&lt;P&gt;fe.&lt;/P&gt;
&lt;P&gt;[[ ERIC: A nice example of fluent programming -- however I find it a little bizarre that on the one hand you feel that its justified to use a crazy nano-optimization like using xor to swap two chars (which is on modern architectures no faster than just using a temp like a sensible person), and yet at the same time using iterators and lambdas and closures which have IMMENSE runtime costs compared to the nanosecond it takes to swap two chars.&amp;nbsp; I would write the code to be as clear as possible first, and then optimize it based on profile data later. ]]&lt;/P&gt;</description></item><item><title>re: A nasality talisman for the sultana analyst</title><link>http://blogs.msdn.com/ericlippert/archive/2009/02/04/a-nasality-talisman-for-the-sultana-analyst.aspx#9403883</link><pubDate>Sat, 07 Feb 2009 10:05:15 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9403883</guid><dc:creator>leniel</dc:creator><description>&lt;P&gt;Hi Eric,&lt;/P&gt;
&lt;P&gt;I've just played with your code and noted that the extension method Join won't compile. It must be declared public instead of private.&lt;/P&gt;
&lt;P&gt;Great exercise!&lt;/P&gt;
&lt;P&gt;All the best,&lt;/P&gt;
&lt;P&gt;Leniel Macaferi&lt;/P&gt;
&lt;DIV class=yellowbox&gt;
&lt;P&gt;Or make the class that holds all the methods a static class, which is what I did. -- Eric&lt;/P&gt;&lt;/DIV&gt;</description></item><item><title>re: A nasality talisman for the sultana analyst</title><link>http://blogs.msdn.com/ericlippert/archive/2009/02/04/a-nasality-talisman-for-the-sultana-analyst.aspx#9404987</link><pubDate>Sat, 07 Feb 2009 19:56:17 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9404987</guid><dc:creator>Figment Engine</dc:creator><description>&lt;P&gt;@Eric: you are quite right - the swap is better using a temp var, that will teach me for reusing over optimized array rotation code!&lt;/P&gt;
&lt;P&gt;private static void Swap(ref char a, ref char b)&amp;nbsp;&amp;nbsp; &lt;BR&gt;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;temp = a;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;a = b;&amp;nbsp;&amp;nbsp;&lt;BR&gt;b = a;&amp;nbsp;&amp;nbsp; &lt;BR&gt;} &lt;/P&gt;
&lt;P&gt;the previous version of the swap was more more effluent programming than fluent ;-)&lt;/P&gt;</description></item><item><title>re: A nasality talisman for the sultana analyst</title><link>http://blogs.msdn.com/ericlippert/archive/2009/02/04/a-nasality-talisman-for-the-sultana-analyst.aspx#9432400</link><pubDate>Wed, 18 Feb 2009 23:34:07 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9432400</guid><dc:creator>J.D.</dc:creator><description>&lt;p&gt;Figment Engine:&lt;/p&gt;
&lt;p&gt;Um.. Check your code. &lt;/p&gt;
</description></item><item><title>re: A nasality talisman for the sultana analyst</title><link>http://blogs.msdn.com/ericlippert/archive/2009/02/04/a-nasality-talisman-for-the-sultana-analyst.aspx#9432494</link><pubDate>Thu, 19 Feb 2009 00:06:31 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9432494</guid><dc:creator>Diego</dc:creator><description>&lt;p&gt;Interesante la lectura &amp;nbsp;acerca de la &amp;quot;codificaci&amp;#243;n&amp;quot; en especial los dibujitos.&lt;/p&gt;
</description></item><item><title>re: A nasality talisman for the sultana analyst</title><link>http://blogs.msdn.com/ericlippert/archive/2009/02/04/a-nasality-talisman-for-the-sultana-analyst.aspx#9442846</link><pubDate>Tue, 24 Feb 2009 19:29:03 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9442846</guid><dc:creator>Horza</dc:creator><description>&lt;p&gt;@Figment Engine:&lt;/p&gt;
&lt;p&gt;corrected code:&lt;/p&gt;
&lt;p&gt;private static void Swap(ref char a, ref char b) &amp;nbsp; &lt;/p&gt;
&lt;p&gt;{ &amp;nbsp; &lt;/p&gt;
&lt;p&gt;temp = a; &amp;nbsp; &lt;/p&gt;
&lt;p&gt;a = b; &amp;nbsp;&lt;/p&gt;
&lt;p&gt;b = temp; &amp;nbsp; &lt;/p&gt;
&lt;p&gt;} &lt;/p&gt;
</description></item><item><title>re: A nasality talisman for the sultana analyst</title><link>http://blogs.msdn.com/ericlippert/archive/2009/02/04/a-nasality-talisman-for-the-sultana-analyst.aspx#9451036</link><pubDate>Sat, 28 Feb 2009 19:55:25 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9451036</guid><dc:creator>zara</dc:creator><description>&lt;p&gt;private static void Swap(ref char a, ref char b) &amp;nbsp; &lt;/p&gt;
&lt;p&gt;{ &amp;nbsp; &lt;/p&gt;
&lt;p&gt;temp = a; &amp;nbsp; &lt;/p&gt;
&lt;p&gt;a = b; &amp;nbsp;&lt;/p&gt;
&lt;p&gt;b = temp; &amp;nbsp; &lt;/p&gt;
&lt;p&gt;} &lt;/p&gt;
&lt;p&gt;ı know which is a swap.it s name is SWAP!I like it.&lt;/p&gt;
</description></item><item><title>re: A nasality talisman for the sultana analyst</title><link>http://blogs.msdn.com/ericlippert/archive/2009/02/04/a-nasality-talisman-for-the-sultana-analyst.aspx#9454680</link><pubDate>Mon, 02 Mar 2009 19:21:50 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9454680</guid><dc:creator>Malc Boczek</dc:creator><description>&lt;p&gt;Amazingly timed relevant to current project.... thank you.&lt;/p&gt;
&lt;p&gt;One potential addition to C# 5 (?) would allow access to the foreach root list/array; &lt;/p&gt;
&lt;p&gt;e.g. foreach(object o on listroot in list).&lt;/p&gt;
&lt;p&gt;IEnumerator ie = list.GetEnumerator()&lt;/p&gt;
&lt;p&gt;while (ie.MoveNext())&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;// do something...&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;if (some condition) ie.Skip(n);&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;could then be written as,&lt;/p&gt;
&lt;p&gt;foreach(object o on myie in list)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;// do something...&lt;/p&gt;
&lt;p&gt; &amp;nbsp; &amp;nbsp;if (some condition) myie.Skip(n);&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;The &amp;quot;on&amp;quot; target could also be a Typed Enumerator.&lt;/p&gt;
&lt;p&gt;I know this doesn't add much functionality, but it does seem a little more readable (at least to me - I'd hate to start another code war like part 2 !!!)&lt;/p&gt;
</description></item><item><title>Cheating at Scrabble with LINQ to Objects</title><link>http://blogs.msdn.com/ericlippert/archive/2009/02/04/a-nasality-talisman-for-the-sultana-analyst.aspx#9460732</link><pubDate>Fri, 06 Mar 2009 00:33:07 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9460732</guid><dc:creator>Stuart Leeks</dc:creator><description>&lt;p&gt;I read an interesting post on Eric Lippert’s blog recently where he was using LINQ to Objects to find&lt;/p&gt;
</description></item><item><title>re: A nasality talisman for the sultana analyst</title><link>http://blogs.msdn.com/ericlippert/archive/2009/02/04/a-nasality-talisman-for-the-sultana-analyst.aspx#9483470</link><pubDate>Tue, 17 Mar 2009 15:23:08 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9483470</guid><dc:creator>Paul Maddox</dc:creator><description>&lt;p&gt;I think you're all missing the point - it's not about making the most efficient anagram finder, it's just a demonstration of LINQ.&lt;/p&gt;
</description></item><item><title>re: A nasality talisman for the sultana analyst</title><link>http://blogs.msdn.com/ericlippert/archive/2009/02/04/a-nasality-talisman-for-the-sultana-analyst.aspx#9516397</link><pubDate>Sun, 29 Mar 2009 01:40:40 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9516397</guid><dc:creator>mike</dc:creator><description>&lt;p&gt;Please check out &amp;lt;a href=&amp;quot;&lt;a rel="nofollow" target="_new" href="http://www.alpha-dream.com&amp;quot;&amp;gt;Human"&gt;http://www.alpha-dream.com&amp;quot;&amp;gt;Human&lt;/a&gt; pheromones, pheromone cologne by Alpha Dream&amp;lt;/a&amp;gt;. Human pheromones help improve your sex life and dating success. Pheromones cause others to be more attracted to you, and help revamp your love life. Human pheromones are for men and women of all ages, and are provided in unscented sprays, or in cologne and perfume. &lt;/p&gt;
</description></item><item><title>re: A nasality talisman for the sultana analyst</title><link>http://blogs.msdn.com/ericlippert/archive/2009/02/04/a-nasality-talisman-for-the-sultana-analyst.aspx#9555718</link><pubDate>Sun, 19 Apr 2009 18:18:12 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9555718</guid><dc:creator>George Polevoy</dc:creator><description>&lt;p&gt;Your code is total overkill both in terms of performance and disk space for the dictionary.&lt;/p&gt;
&lt;p&gt;There is only as few as 2500 anagramms 1230 anagrammatic groups in the text of Tolstoy War and Peace.&lt;/p&gt;
</description></item><item><title>Cheating at Scrabble with LINQ to Objects</title><link>http://blogs.msdn.com/ericlippert/archive/2009/02/04/a-nasality-talisman-for-the-sultana-analyst.aspx#9783952</link><pubDate>Fri, 19 Jun 2009 12:30:41 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9783952</guid><dc:creator>UK Application Development Consulting</dc:creator><description>&lt;p&gt;I read an interesting post on Eric Lippert’s blog recently where he was using LINQ to Objects to find&lt;/p&gt;
</description></item><item><title>re: A nasality talisman for the sultana analyst</title><link>http://blogs.msdn.com/ericlippert/archive/2009/02/04/a-nasality-talisman-for-the-sultana-analyst.aspx#9925303</link><pubDate>Thu, 19 Nov 2009 11:09:20 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9925303</guid><dc:creator>Frustrated</dc:creator><description>&lt;p&gt;Is it possible to download the word list from somewhere? &amp;nbsp;Maybe my Google skills suck but I just can't find it.&lt;/p&gt;
</description></item></channel></rss>