Advertisement
Guest User

Digital number parser

a guest
Sep 15th, 2012
164
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.44 KB | None | 0 0
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement