Advertisement
anas_harby

Untitled

Apr 30th, 2016
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 10.59 KB | None | 0 0
  1. import java.util.Scanner;
  2.  
  3. import java.util.*;
  4.    
  5. public class Solver {
  6.    
  7.     static ArrayList <Integer> minterms = new ArrayList <Integer>();
  8.     static ArrayList <Integer> dontcares = new ArrayList <Integer>();
  9.     static ArrayList <ArrayList <ArrayList<String>>> comparisons = new ArrayList <ArrayList <ArrayList <String>>>();
  10.     static ArrayList <String> primeImplicants = new ArrayList <String>();
  11.     static String [] combination = new String[26];
  12.    
  13.     static int MaxnumberOf_Vars;
  14.     static boolean foundCombination = false;
  15.    
  16.     static Scanner in = new Scanner(System.in);
  17.    
  18.     private static void fillArrayList() {
  19.         for(int i=0; i<26; i++)  {
  20.             comparisons.add(new ArrayList()); //comparisons
  21.             for(int j=0; j<MaxnumberOf_Vars; j++)
  22.                 comparisons.get(i).add(new ArrayList()); // groups
  23.         }
  24.     }
  25.    
  26.     private static int find_numOfvars()
  27.     {  
  28.         int  maxMinterm = 0,maxDontCare=0;
  29.         if (minterms.isEmpty()==false)
  30.              maxMinterm = Collections.max(minterms);
  31.         if (dontcares.isEmpty()==false)
  32.              maxDontCare = Collections.max(dontcares);
  33.        
  34.         int maxImplicant = Math.max(maxDontCare, maxMinterm);
  35.         float exponent =  (float) (Math.log(maxImplicant) / Math.log(2));
  36.         if ((exponent - (int)exponent)==0)
  37.             return Math.round((float)(Math.log((double)(maxImplicant))/(Math.log(2.0))))+1;
  38.         else
  39.             return Math.round((float)(Math.log((double)(maxImplicant))/(Math.log(2.0))));
  40.     }
  41.    
  42.     private static String differBinary(String firstMinterm, String secondMinterm) {
  43.         String result = "";
  44.         int ones=0;
  45.         for(int i=0; i<firstMinterm.length(); i++) {
  46.             if(firstMinterm.charAt(i) != secondMinterm.charAt(i))
  47.                 result += "-";
  48.             else
  49.                 result += firstMinterm.charAt(i);
  50.             if(firstMinterm.charAt(i)=='1')
  51.                 ones++;
  52.         }
  53.         return result + " " + String.valueOf(ones);
  54.     }
  55.    
  56.    
  57.     private static void decimalToBinary() {
  58.        
  59.         for(int i=0; i<minterms.size(); i++) {
  60.             int div = minterms.get(i), ones = 0;
  61.             String res= "";
  62.             while(div!=0) {
  63.                 if(div%2==1) {
  64.                     ones++;
  65.                     res = "1" + res;
  66.                 }
  67.                 else
  68.                     res = "0" + res;
  69.                 div/=2;
  70.             }
  71.             for(int j=0, len = res.length(); j<MaxnumberOf_Vars-len; j++)
  72.                 res = "0" + res;
  73.             comparisons.get(0).get(ones).add(res + " " + Integer.parseInt(res,2));
  74.         }
  75.         for(int i=0; i<dontcares.size();i++) {
  76.             int div = dontcares.get(i), ones = 0;
  77.             String res = "";
  78.             while(div!=0) {
  79.                 if(div%2==1) {
  80.                     ones++;
  81.                     res = "1" + res;
  82.                 }
  83.                 else
  84.                     res = "0" + res;
  85.                 div/=2;
  86.             }
  87.             for(int j=0, len = res.length(); j<MaxnumberOf_Vars-len; j++)
  88.                 res = "0" + res;
  89.             comparisons.get(0).get(ones).add(res + " " + Integer.parseInt(res,2));
  90.         }
  91.         for(int i=0; i< comparisons.get(0).size(); i++)
  92.             Collections.sort(comparisons.get(0).get(i));
  93.     }
  94.    
  95.     private static void doComparisons() {
  96.         int k;
  97.         for(k=0; k<comparisons.size()-1; k++) { //comparisons
  98.             boolean[][] takenToNextComparison = new boolean[10][100];
  99.             for(int l=0; l<comparisons.get(k).size(); l++) { //groups
  100.                 if(comparisons.get(k).get(l).isEmpty())
  101.                     continue;
  102.                 int m = l+1;
  103.                
  104.                 while(m< comparisons.get(k).size() && comparisons.get(k).get(m).isEmpty())
  105.                     m++;
  106.                 if(m==comparisons.get(k).size()) {
  107.                     for(int i=0; i< comparisons.get(k).get(l).size(); i++) {
  108.                         if(!takenToNextComparison[l][i]) {
  109.                             ArrayList <String> iData = new ArrayList <String>();
  110.                             for(String retval: comparisons.get(k).get(l).get(i).split(" "))
  111.                                 iData.add(retval);
  112.                             String info = iData.get(0);
  113.                             for(int x=1; x<iData.size(); x++)
  114.                                 info += " " + iData.get(x);
  115.                             primeImplicants.add(info);
  116.                         }
  117.                     }
  118.                     break;
  119.                 }
  120.                 for(int i=0; i<comparisons.get(k).get(l).size(); i++) {
  121.                     boolean fPrime = true;
  122.                     ArrayList <String> iData = new ArrayList <String>();
  123.                     for(String retval: comparisons.get(k).get(l).get(i).split(" "))
  124.                         iData.add(retval);
  125.                     for(int j=0; j<comparisons.get(k).get(m).size(); j++) {
  126.                         ArrayList <String> jData = new ArrayList <String>();
  127.                         for(String retval: comparisons.get(k).get(m).get(j).split(" "))
  128.                             jData.add(retval);
  129.                         float exponent = 0;
  130.                         int difference = 0;
  131.                         boolean fAccept = true;
  132.                         for(int x=1; x<iData.size(); x++) {
  133.                             int iDifference = Integer.parseInt(iData.get(x));
  134.                             int jDifference = Integer.parseInt(jData.get(x));
  135.                             int tempDifference = jDifference - iDifference;
  136.                             float tempExponent = (float) (Math.log(tempDifference) / Math.log(2));
  137.                             if(x==1) {
  138.                                 difference = tempDifference;
  139.                                 exponent =  tempExponent;
  140.                                 if(difference<0 || exponent - (int) exponent!=0) {
  141.                                     fAccept = false;
  142.                                     break;
  143.                                 }
  144.                             }
  145.                             else {
  146.                                 if(tempDifference!=difference || tempExponent!=exponent) {
  147.                                     fAccept = false;
  148.                                     break;
  149.                                 }
  150.                             }
  151.                         }
  152.                         if(fAccept) {
  153.                             fPrime = false;
  154.                             String iBinary = iData.get(0);
  155.                             String jBinary = jData.get(0);
  156.                             takenToNextComparison[l][i] = true;
  157.                             takenToNextComparison[m][j] = true;
  158.                             ArrayList <String> dashesAndOnes = new ArrayList <String>();
  159.                             for( String retval: differBinary(iBinary, jBinary).split(" "))
  160.                                 dashesAndOnes.add(retval);
  161.                             String differenceBinary = dashesAndOnes.get(0);
  162.                             int ones = Integer.parseInt(dashesAndOnes.get(1));
  163.                             boolean fDuplicate = false;
  164.                             for(int x=0; x<comparisons.get(k+1).size(); x++) {
  165.                                 for(int y=0; y<comparisons.get(k+1).get(x).size(); y++) {
  166.                                     String duplicate = comparisons.get(k+1).get(x).get(y).split(" ")[0];
  167.                                     if(duplicate.equals(differenceBinary)) {
  168.                                         fDuplicate = true;
  169.                                         break;
  170.                                     }
  171.                                 }
  172.                             }
  173.                             if(!fDuplicate) {
  174.                                 String info = differenceBinary;
  175.                                 for(int x=1; x< iData.size(); x++) {
  176.                                     info += " " + iData.get(x);
  177.                                 }
  178.                                 for(int x=1; x< jData.size(); x++) {
  179.                                     info += " " + jData.get(x);
  180.                                 }
  181.                                 comparisons.get(k+1).get(ones).add(info);
  182.                             }
  183.                             else
  184.                                 continue;
  185.                        
  186.                         }
  187.                     }
  188.                 if(fPrime && !takenToNextComparison[l][i]) {
  189.                     String info = iData.get(0);
  190.                     for(int x=1; x<iData.size(); x++)
  191.                         info += " " + iData.get(x);
  192.                     primeImplicants.add(info);
  193.                 }
  194.                
  195.             }
  196.         }
  197.     }
  198.     for(int i=0; i<comparisons.get(k).size(); i++) //groups
  199.         for(int j=0; j<comparisons.get(k).get(i).size(); j++) {
  200.             ArrayList <String> data = new ArrayList <String>();
  201.             for(String retval: comparisons.get(k).get(i).get(j).split(" "))
  202.                 data.add(retval);
  203.             String info = data.get(0);
  204.             for(int x=1; x<data.size(); x++)
  205.                 info += " " + data.get(x);
  206.             primeImplicants.add(info);
  207.         }
  208.     }
  209.    
  210.     private static String find_Expression(ArrayList a)
  211.     {
  212.         String expression = new String ();
  213.         ;
  214.         StringBuilder Dashes_expression = null;
  215.         StringBuilder expression_Builder = new StringBuilder();
  216.         ///I want to know the maximum estimated number of variables;
  217.        
  218.         for (int i=0 ; i<a.size() ; i++ )
  219.         {
  220.             for( String retval: ((String) a.get(i)).split(" ")){
  221.                  Dashes_expression = new StringBuilder();
  222.                 Dashes_expression.append(retval);
  223.                 break;
  224.             }
  225.            
  226.             for (int j=0 ; j < Dashes_expression.length();j++)
  227.             {
  228.               if (Dashes_expression.charAt(j)=='1')
  229.               {
  230.                   char character = (char) ((int)('A')+j);
  231.                   expression_Builder.append(character);
  232.               }
  233.               else if (Dashes_expression.charAt(j)=='0')
  234.               {
  235.                   char character = (char) ((int)('A')+j);
  236.                   String str = new String();
  237.                   str += character + "'";
  238.                   expression_Builder.append(str);
  239.                  
  240.               }
  241.            
  242.             }
  243.             if (i!=(a.size()-1))
  244.                  expression_Builder.append(" + ");
  245.         }
  246.        
  247.         expression = expression_Builder.toString();
  248.         return expression;
  249.     }
  250.    
  251.     private static boolean checkCombination(int len) {
  252.         ArrayList<Integer> checkedMinterms = new ArrayList<Integer>();
  253.        
  254.         for(int i=0; i<len; i++) {
  255.             ArrayList <String> data = new ArrayList <String>();
  256.             for(String retval: combination[i].split(" " ))
  257.                 data.add(retval);
  258.             for(int j=1; j<data.size(); j++)
  259.                 checkedMinterms.add(Integer.parseInt(data.get(j)));
  260.         }
  261.         if(checkedMinterms.containsAll(minterms))
  262.             return true;
  263.         else
  264.             return false;
  265.     }
  266.            
  267.     private static void generateCombinations(int element, int m, int len) { //(1,0,size)
  268.         if(m == len) {
  269.             if(checkCombination(len)) {
  270.                 foundCombination = true;
  271.                 return;
  272.             }
  273.             return;
  274.         }
  275.         if(element== primeImplicants.size()+1)
  276.             return;
  277.         combination[m] = primeImplicants.get(element-1);
  278.         if(!foundCombination)
  279.             generateCombinations(element+1, m+1, len);
  280.         if(!foundCombination)
  281.             generateCombinations(element+1, m, len);
  282.        
  283.     }
  284.  
  285.    
  286.    
  287.     public static void main (String[] args) {
  288.         System.out.println("Enter the minterms in decimal <-1 to finish>:");
  289.         while(true) {
  290.             int input;
  291.             input = in.nextInt();
  292.             if(input==-1)
  293.                 break;
  294.             minterms.add(input);
  295.         }
  296.         System.out.println("Enter the dontcares in decimal <-1 to finish>:");
  297.         while(true) {
  298.             int input;
  299.             input = in.nextInt();
  300.             if(input==-1)
  301.                 break;
  302.             dontcares.add(input);
  303.         }
  304.         MaxnumberOf_Vars = find_numOfvars();
  305.         fillArrayList();
  306.         decimalToBinary();
  307.         doComparisons();
  308.        
  309.         for(int k=0; k<comparisons.size(); k++) {
  310.             boolean comparisonHasElements = false;
  311.                
  312.             for(int i=0; i<comparisons.get(k).size(); i++) {
  313.                 if(comparisons.get(k).get(i).isEmpty())
  314.                     continue;
  315.                 for(int j=0; j<comparisons.get(k).get(i).size(); j++) {
  316.                     System.out.println(comparisons.get(k).get(i).get(j));
  317.                 }
  318.                 comparisonHasElements = true;
  319.                 System.out.println("-----------------");
  320.             }
  321.             if(comparisonHasElements) {
  322.                 System.out.println("______________________________________________________");
  323.                 System.out.println();
  324.             }
  325.         }
  326.         System.out.println("Prime Implicants:");
  327.         for(int i=0; i<primeImplicants.size(); i++) {
  328.             System.out.println(primeImplicants.get(i));
  329.         }
  330.         System.out.println();
  331.         System.out.println(find_Expression(primeImplicants));
  332.         System.out.println();
  333.         System.out.println();
  334.         int numberOfEssential = 0;
  335.         for(int i=1; i<=primeImplicants.size(); i++) {
  336.             generateCombinations(1  , 0, i);
  337.             if(foundCombination) {
  338.                 numberOfEssential = i;
  339.                 break;
  340.             }  
  341.         }
  342.         System.out.println("Essential Prime Implicants:");
  343.         ArrayList<String> essential = new ArrayList<String>();
  344.         for(int i=0; i< numberOfEssential; i++ ) {
  345.             System.out.println(combination[i]);
  346.             essential.add(combination[i]);
  347.         }
  348.         System.out.println();
  349.         System.out.println(find_Expression(essential));
  350.     }
  351. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement