Want more features on Pastebin? Sign Up, it's FREE!
Guest

Digital number parser

By: a guest on Sep 15th, 2012  |  syntax: C++  |  size: 3.44 KB  |  views: 111  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <iomanip>
  4. #include <limits>
  5. #include <vector>
  6. #include <fstream>
  7. #include <string>
  8.  
  9. using namespace std;
  10.  
  11. struct Number
  12. {
  13.         Number() {m_nSegments = m_nEnds = m_nRightBranches = m_nRightBranches = m_nUpBranches = m_nDownBranches = 0;}
  14.         int m_nSegments;
  15.         int m_nEnds;
  16.         int m_nRightBranches;
  17.         int m_nLeftBranches;
  18.         int m_nUpBranches;
  19.         int m_nDownBranches;
  20.         int m_bTopLeftEnd;
  21.        
  22.  
  23.         int toInt()
  24.         {
  25.                 switch(m_nSegments)
  26.                 {
  27.                 case 2:
  28.                         return 1;
  29.                 case 3:
  30.                         return 7;
  31.                 case 4:
  32.                         return 4;
  33.                 case 5:
  34.                 {
  35.                         switch(m_nEnds)
  36.                         {
  37.                         case 2:
  38.                                 return (m_bTopLeftEnd ? 2 : 5);
  39.                         case 3:
  40.                                 return 3;
  41.                         default:
  42.                                 return -1;
  43.  
  44.                         }
  45.                         break;
  46.                 }
  47.                 case 6:
  48.                 {
  49.                         return m_nEnds ? (m_nRightBranches == 1 ? 9 : 6) : 0;
  50.                 }
  51.                 case 7:
  52.                         return 8;
  53.                 default:
  54.                         return -1;
  55.                 }
  56.         }
  57. };
  58.  
  59. void ParseNumber(vector<vector<char>> & _grid, int _row, int _col, Number & _result)
  60. {
  61.         switch (_grid[_row][_col])
  62.         {
  63.         case ' ':
  64.                 return;
  65.         case '-':              
  66.                 _grid[_row][_col] = ' ';
  67.                 ParseNumber(_grid, _row, _col+1, _result);
  68.                 ParseNumber(_grid, _row, _col-1, _result);
  69.                 return;
  70.         case '|':
  71.                 _grid[_row][_col] = ' ';
  72.                 ParseNumber(_grid, _row+1, _col, _result);             
  73.                 ParseNumber(_grid, _row-1, _col, _result);             
  74.                 return;
  75.         case '+':
  76.         {
  77.                 _grid[_row][_col] = ' ';
  78.  
  79.                 bool bEnd = true;
  80.  
  81.                 // Right?
  82.                 if (_col < _grid[_row].size() - 1 && _grid[_row][_col+1] != ' ')
  83.                 {
  84.                         bEnd = false;
  85.                         _result.m_nSegments++;
  86.                         _result.m_nRightBranches++;
  87.                         ParseNumber(_grid, _row, _col+1, _result);
  88.                 }
  89.                
  90.                 // Left?
  91.                 if (_col > 0 && _grid[_row][_col-1] != ' ')
  92.                 {
  93.                         bEnd = false;
  94.                         _result.m_nSegments++;
  95.                         _result.m_nLeftBranches++;
  96.                         ParseNumber(_grid, _row, _col-1, _result);
  97.                 }
  98.                
  99.                 // Down?
  100.                 if (_row < _grid.size() - 1 && _grid[_row+1][_col] != ' ')
  101.                 {
  102.                         bEnd = false;
  103.                         _result.m_nSegments++;
  104.                         _result.m_nDownBranches++;
  105.                         ParseNumber(_grid, _row+1, _col, _result);
  106.                 }
  107.                
  108.                 // Up?
  109.                 if (_row > 0 && _grid[_row-1][_col] != ' ')
  110.                 {
  111.                         bEnd = false;
  112.                         _result.m_nSegments++;
  113.                         _result.m_nUpBranches++;
  114.                         ParseNumber(_grid, _row-1, _col, _result);
  115.                 }
  116.                
  117.                 if (bEnd) _result.m_nEnds++;
  118.  
  119.                 return;
  120.         }
  121.         default:
  122.                 cerr << "Invalid char " << _grid[_row][_col] << endl;
  123.                 throw _grid[_row][_col];
  124.         }
  125. }
  126.  
  127. vector<int> Parse(vector<vector<char>> _grid)
  128. {
  129.         vector<int> ret;
  130.         for (int row = 0; row < _grid.size(); row++)
  131.         {
  132.                 for (int col = 0; col < _grid[row].size(); col++)
  133.                 {
  134.                         if (_grid[row][col] != ' ')
  135.                         {
  136.                                 // We found a number! Lets see what it is
  137.                                 bool bTopLeftEnd = (col == _grid[row].size() - 1) || _grid[row][col+1] == ' ' || _grid[row+1][col] == ' ';
  138.                                 Number num;
  139.                                 if (bTopLeftEnd) num.m_nEnds++; // Top left end isn't counted properly.
  140.                                 num.m_bTopLeftEnd = bTopLeftEnd;
  141.                                 ParseNumber(_grid, row, col, num);
  142.                                 ret.push_back(num.toInt());
  143.                         }
  144.                 }
  145.         }
  146.        
  147.         return ret;
  148. }
  149.  
  150. int main()
  151. {
  152.         vector<vector<char>> grid;
  153.  
  154.         ifstream ifp("c:\\numbergrid.txt");
  155.  
  156.         string strLine;
  157.         while (getline(ifp, strLine))
  158.         {
  159.                 grid.push_back(vector<char>(strLine.begin(), strLine.end()));
  160.         }
  161.  
  162.         vector<int> nums = Parse(grid);
  163.                
  164.         for (auto i = grid.begin(); i != grid.end(); i++)
  165.         {
  166.                 for (auto j = i->begin(); j != i->end(); j++)
  167.                         cout << *j;
  168.                 cout << endl;
  169.         }
  170.  
  171.         cout << endl << "Results: " << endl;
  172.         for (auto i = nums.begin(); i != nums.end(); i++)
  173.                 cout << *i << " ";
  174.         cout << endl;
  175.     return 0;
  176. }
clone this paste RAW Paste Data