Exemplo n.º 1
0
    public static List <List <string> > anagrams(Bag bag,
                                                 List <BagAnagrams> dictionary,
                                                 uint recursion_level,
                                                 bottom_of_main_loop bottom,
                                                 done_pruning done_pruning_callback,
                                                 found_anagram success_callback)
    {
        List <List <string> > rv     = new List <List <string> >();
        List <BagAnagrams>    pruned = Prune(bag,
                                             dictionary,
                                             done_pruning_callback,
                                             recursion_level);
        int pruned_initial_size = pruned.Count;

        while (pruned.Count > 0)
        {
            BagAnagrams entry    = pruned[0];
            Bag         this_bag = entry.bag;
            Bag         diff     = bag.Subtract(this_bag);
            if (diff != null)
            {
                if (diff.Empty())
                {
                    foreach (string w in entry.words)
                    {
                        List <string> loner = new List <string>();
                        loner.Add(w);
                        rv.Add(loner);
                        if (recursion_level == 0)
                        {
                            success_callback(loner);
                        }
                    }
                }
                else
                {
                    List <List <string> > from_smaller = anagrams(diff, pruned, recursion_level + 1,
                                                                  bottom,
                                                                  done_pruning_callback,
                                                                  success_callback);
                    List <List <string> > combined = Combine(entry.words, from_smaller);
                    foreach (List <string> an in combined)
                    {
                        rv.Add(an);
                        if (recursion_level == 0)
                        {
                            success_callback(an);
                        }
                    }
                }
            }
            pruned.RemoveAt(0);
            if (recursion_level == 0)
            {
                bottom();
            }
        }
        return(rv);
    }
Exemplo n.º 2
0
    // Generate Anagrams from Word Dictionary and a list of letters
    private static List <BagAnagrams> LoadDictionary(string filename)
    {
        List <BagAnagrams> result = new List <BagAnagrams>();

        using (StreamReader reader = File.OpenText(filename))
        {
            try
            {
                string    line               = null;
                int       linesRead          = 0;
                Hashtable stringlists_by_bag = new Hashtable();
                while ((line = reader.ReadLine()) != null)
                {
                    line = line.ToLower();

                    Bag bag = new Bag(line);
                    if (!stringlists_by_bag.ContainsKey(bag))
                    {
                        List <string> l = new List <string>();
                        l.Add(line);
                        stringlists_by_bag.Add(bag, l);
                    }
                    else
                    {
                        List <string> l = (List <string>)stringlists_by_bag[bag];
                        if (!l.Contains(line))
                        {
                            l.Add(line);
                        }
                    }
                    linesRead++;
                }

                result = new List <BagAnagrams>();
                foreach (DictionaryEntry de in stringlists_by_bag)
                {
                    result.Add(new BagAnagrams((Bag)de.Key, (List <string>)de.Value));
                }
                result.Sort();

                // Sort the list so that the biggest bags come first.
                // This might make more interesting anagrams appear first.
                BagAnagrams[] sort_me = new BagAnagrams[result.Count];
                result.CopyTo(sort_me);
                Array.Sort(sort_me);
                result.Clear();
                result.InsertRange(0, sort_me);
            }
            catch (Exception ex)
            {
                throw new Exception("Dictionary: " + ex.Message);
            }
        }
        return(result);
    }