>>Single Point of Failure >>

§ Home § CV § Blog Photography Divagações §

Calendar

May 2012
M T W T F S S
« Apr    
 123456
78910111213
14151617181920
21222324252627
28293031  


Popular Tags


Recent Entries



Categories


Archives


Aha! Excellent book…

Ξ May 5th, 2012 | → 0 Comments |
Books |, , , |


I’ve been reading some of the classics, including the amazing Jon Bentley’s Programming Pearls (2nd Edition). The book provides awesome insight to the mind of a programmer. Moreover, by providing an excellent list of problems the author incites the reader to experiment with the contents of the book.

Here’s my version of the anagram finder from Column 2: “Aha! Algorithms”.

#include <iostream>
#include <fstream>

#include <string>
#include <vector>
#include <unordered_map>
#include <algorithm>

typedef std::vector<std::string> anagram_vector_t;

typedef std::unordered_map<std::string, anagram_vector_t> anagram_map_t;

void
load_words_from_stream(anagram_vector_t& words, std::istream& input)
{
  std::string word;

  while(input >> word)
  {
    words.push_back(word);
  }
}

void
load_words_from_file(anagram_vector_t& words, const std::string& filename)
{
  std::ifstream input(filename);

  load_words_from_stream(words, input);
}

void
process_anagrams(const anagram_vector_t& words, anagram_map_t& anagrams)
{
  std::for_each(std::begin(words),
                std::end(words),
                [&anagrams](const std::string& word) {

    // get key by sorting the string value
    std::string key = word;
    std::sort(key.begin(), key.end());

    // store (key, value)
    anagrams[key].push_back(word);
  });
}

void
print_anagrams(const anagram_map_t& anagrams)
{
  for(auto i = std::begin(anagrams); i != std::end(anagrams); ++i)
  {
    const anagram_vector_t& words = i->second;

    if( words.size() > 1 )
    {
      std::for_each(std::begin(words),
                    std::end(words),
                    [&anagrams](const std::string& word) {

        std::cout << word << " ";
      });
      std::cout << std::endl;
    }
  }
}

void do_anagrams(const std::string& filename)
{
  anagram_map_t anagrams;
  anagram_vector_t words;

  load_words_from_file(words, filename);
  process_anagrams(words, anagrams);
  print_anagrams(anagrams);
}

int main(int argc, char *argv[])
{
  if( argc != 2 )
  {
    std::cout << "Usage: " << argv[0] << " <words-file>" << std::endl;
    return -1;
  }

  do_anagrams(argv[1]);

  return 0;
}

 


Recommended Trilogy

Ξ November 30th, 2011 | → 0 Comments |
Books |, , , , |


Stieg Larson’s trilogy revolving around Lisbeth Salander is some of the best stuff I’ve read. It’s an amazing passionate thriller, filled with crime, and even some computer hacking.

 

 

 


Short List for 2011

Ξ December 22nd, 2010 | → 2 Comments |
Books |, , |


 


On the nightstand...



Entries | Comments