anas_harby

Untitled

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