Advertisement
anas_harby

Untitled

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