Advertisement
Faschz

AC - Code Optimizer (with d-pad)

Dec 4th, 2017
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.01 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4.  
  5. using namespace std;
  6.  
  7. int calcDistance(char, int, int);
  8. int calcCursor(char, int, int, bool[]);
  9. void changePositions(char, int*, int*);
  10.  
  11. int main(){
  12.     string code = "i7345678912345e234567891234e";
  13.     int codeSize = code.length();
  14.    
  15.     //Array that holds whether the letter has been used
  16.     bool codeMap[codeSize];
  17.     for(int i = 0; i < codeSize; i++){
  18.         codeMap[i] = false;
  19.     }
  20.    
  21.     //Default position on the keyboard
  22.     int yPosition = 0;
  23.     int xPosition = 0;
  24.    
  25.     //Default cursor position
  26.     int cursor = 0;
  27.    
  28.     int maxTable[codeSize];
  29.     for(int i = 0; i < codeSize; i++){
  30.         maxTable[i] = 0;
  31.     }
  32.    
  33.     int distance = 0;
  34.     for(int j = 0; j < codeSize; j++){
  35.        
  36.         for(int i = 0; i < codeSize; i++){
  37.             maxTable[i] = 0;
  38.         }
  39.        
  40.         //Goes through filling the table of the distance required for each key press
  41.         for(int i = 0; i < codeSize; i++){
  42.             if(codeMap[i] != true){ //Letter hasn't been used
  43.                 if(calcDistance(code[i], xPosition, yPosition) > calcCursor(code[i], i, cursor, codeMap)){ //Takes longer to move position
  44.                     maxTable[i] = calcDistance(code[i], xPosition, yPosition);
  45.                     cout << calcDistance(code[i], xPosition, yPosition) << " ";
  46.                 }
  47.                 else if(calcDistance(code[i], xPosition, yPosition) < calcCursor(code[i], i, cursor, codeMap)){ //Takes longer to move cursor
  48.                     maxTable[i] = calcCursor(code[i], i, cursor, codeMap);
  49.                     cout << calcCursor(code[i], i, cursor, codeMap) << " ";
  50.                 }
  51.                 else{ //The distance and cursor distance are the same
  52.                     maxTable[i] = calcDistance(code[i], xPosition, yPosition);
  53.                     cout << calcDistance(code[i], xPosition, yPosition) << " ";
  54.                 }
  55.             }
  56.             else{ //The letter has already been used
  57.                 maxTable[i] = 1000;
  58.             }
  59.         }
  60.  
  61.         int minValue = 1000;
  62.         int minLetter = 100;
  63.        
  64.         for(int i = 0; i < codeSize; i++){
  65.             if(maxTable[i] <= minValue){
  66.                 minValue = maxTable[i];
  67.                 minLetter = i;
  68.             }
  69.         }
  70.         cout << code[minLetter] << "(" << minLetter << ")" << endl;
  71.         distance += minValue;
  72.  
  73.         //Remove and shift the code, set new positions
  74.         codeMap[minLetter] = true;
  75.         cursor = minLetter+1;
  76.         changePositions(code[minLetter], &xPosition, &yPosition);
  77.     }
  78.     cout << endl;
  79.     cout << distance << endl;
  80.  
  81.     system("pause");
  82.     return 0;
  83. }
  84.  
  85. int calcDistance(char letter, int xPosition, int yPosition){
  86.     int distance = 0;
  87.  
  88.     int changeX;
  89.     int changeY;
  90.  
  91.     vector<vector <char>> alphabet{
  92.         { '1', '2', '3', '4', '5', '6', '7', '8', '9' },
  93.         { 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p' },
  94.         { 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l' },
  95.         { 'z', 'x', 'c', 'v', 'b', 'n', 'm' }
  96.     };
  97.    
  98.     for (vector<vector<char>>::size_type j = 0; j < alphabet.size(); j++){
  99.         for (vector<char>::size_type k = 0; k < alphabet[j].size(); k++){
  100.             if (alphabet[j][k] == letter){
  101.                
  102.                 changeX = k - xPosition;
  103.                 changeY = j - yPosition;
  104.  
  105.                 distance += abs(changeX) +abs(changeY);
  106.                 yPosition = j;
  107.                 xPosition = k;
  108.             }
  109.         }
  110.     }
  111.    
  112.     return distance;
  113. }
  114.  
  115. int calcCursor(char letter, int letterPosition, int cursor, bool codeMap[]){
  116.     int distance = 0;
  117.     if(cursor < letterPosition){
  118.         for(int i = cursor; i < letterPosition; i++){
  119.             if(codeMap[i] ==  true){
  120.                 distance++;
  121.             }
  122.         }
  123.     }
  124.     else if(cursor > letterPosition){
  125.         for(int i = cursor; i > letterPosition+1; i--){
  126.             if(codeMap[i] ==  true){
  127.                 distance++;
  128.             }
  129.         }
  130.     }
  131.     else{
  132.         return 0; //The cursor is on the letter already
  133.     }
  134.    
  135.     if(distance > 14){
  136.         distance -= 13;
  137.     }
  138.     return distance;
  139. }
  140.  
  141. void changePositions(char letter, int *xPosition, int *yPosition){
  142.     vector<vector <char>> alphabet{
  143.         { '1', '2', '3', '4', '5', '6', '7', '8', '9' },
  144.         { 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p' },
  145.         { 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l' },
  146.         { 'z', 'x', 'c', 'v', 'b', 'n', 'm' }
  147.     };
  148.    
  149.     for (vector<vector<char>>::size_type j = 0; j < alphabet.size(); j++){
  150.         for (vector<char>::size_type k = 0; k < alphabet[j].size(); k++){
  151.             if (alphabet[j][k] == letter){
  152.                 *yPosition = j;
  153.                 *xPosition = k;
  154.             }
  155.         }
  156.     }
  157. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement