Advertisement
anas_harby

Untitled

Apr 29th, 2016
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 9.08 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()-2; 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.                     return;
  87.                 for(int i=0; i<mintermsBinary.get(k).size(); i++) {
  88.                    
  89.                     boolean fPrime = true;
  90.                    
  91.                     for(int j=0; j<mintermsBinary.get(l).size(); j++) {
  92.                        
  93.                         String iBinary = mintermsBinary.get(k).get(i);
  94.                         String jBinary = mintermsBinary.get(l).get(j);
  95.                        
  96.                         int iDecimal = Integer.parseInt(iBinary, 2);
  97.                         int jDecimal = Integer.parseInt(jBinary, 2);
  98.                         int difference = jDecimal - iDecimal;
  99.                         float exponent =  (float) (Math.log(difference) / Math.log(2));
  100.                        
  101.                         if(difference>0 && exponent - (int) exponent ==0) {
  102.                             fPrime = false;
  103.                            
  104.                             ArrayList <String> dashesAndOnes = new ArrayList <String>();
  105.                             for( String retval: differBinary(iBinary, jBinary).split(" "))
  106.                                 dashesAndOnes.add(retval);
  107.                             String differenceBinary = dashesAndOnes.get(0);
  108.                             int ones = Integer.parseInt(dashesAndOnes.get(1));
  109.                                
  110.                             boolean fDuplicate = false;
  111.                             for(int m=0; m<comparisons.get(0).size(); m++) //groups
  112.                                 for(int n=0; n<comparisons.get(0).get(m).size(); n++) { //implicants
  113.                                     String duplicate = comparisons.get(0).get(m).get(n).split(" ")[0];
  114.                                     if(duplicate.equals(differenceBinary))
  115.                                         fDuplicate = true;
  116.                                    
  117.                                 }
  118.                             if(!fDuplicate) {
  119.                                 takenToNextComparison[k][i] = true;
  120.                                 takenToNextComparison[l][j] = true;
  121.                                 comparisons.get(0).get(ones).add(differenceBinary + " " + iDecimal + " " + jDecimal);
  122.                             }
  123.                         }
  124.                         else
  125.                             continue;
  126.                     }
  127.                     if(fPrime && !takenToNextComparison[i][k]) {
  128.                         String primeBinary = mintermsBinary.get(k).get(i);
  129.                         int primeDecimal = Integer.parseInt(primeBinary, 2);
  130.                         String info = primeBinary + " " + String.valueOf(primeDecimal);
  131.                         primeImplicants.add(info);
  132.                     }
  133.                 }
  134.                
  135.             }
  136.         }
  137.        
  138.         private static void doComparisons() {
  139.             int k;
  140.             boolean fStop = false;
  141.             for(k=0; k<comparisons.size()-2 && !fStop; k++) { //comparisons
  142.                 boolean[][] takenToNextComparison = new boolean[10][100];
  143.                 for(int l=0; l<comparisons.get(k).size(); l++) { //groups
  144.                     if(comparisons.get(k).get(l).isEmpty())
  145.                         continue;
  146.                     int m = l+1;
  147.                     while(m< comparisons.get(k).size() && comparisons.get(k).get(m).isEmpty())
  148.                         m++;
  149.                     if(m==comparisons.get(k).size()) {
  150.                         fStop = true;
  151.                         break;
  152.                     }
  153.                     for(int i=0; i<comparisons.get(k).get(l).size(); i++) { //implicants
  154.                             boolean fPrime = true;
  155.                             ArrayList <String> iData = new ArrayList <String>();
  156.                             for(String retval: comparisons.get(k).get(l).get(i).split(" "))
  157.                                 iData.add(retval);
  158.                            
  159.                             for(int j=0; j<comparisons.get(k).get(m).size(); j++) {
  160.                                
  161.                                 ArrayList <String> jData = new ArrayList <String>();
  162.                                  
  163.                                 for(String retval: comparisons.get(k).get(m).get(j).split(" "))
  164.                                     jData.add(retval);
  165.                                
  166.                                 float exponent = 0;
  167.                                 int difference = 0;
  168.                                 boolean fAccept = true;
  169.                                 for(int x=1; x<iData.size(); x++) {
  170.                                     int iDifference = Integer.parseInt(iData.get(x));
  171.                                     int jDifference = Integer.parseInt(jData.get(x));
  172.                                     int tempDifference = jDifference - iDifference;
  173.                                     float tempExponent = (float) (Math.log(tempDifference) / Math.log(2));
  174.                                     if(x==1) {
  175.                                         difference = tempDifference;
  176.                                         exponent =  tempExponent;
  177.                                         if(difference<0 || exponent - (int) exponent!=0) {
  178.                                             fAccept = false;
  179.                                             break;
  180.                                         }
  181.                                     }
  182.                                     else {
  183.                                         if(tempDifference!=difference || tempExponent!=exponent) {
  184.                                             fAccept = false;
  185.                                             break;
  186.                                         }
  187.                                     }
  188.                                 }
  189.                                
  190.                                 if(fAccept) {
  191.                                     fPrime = false;
  192.                                     String iBinary = iData.get(0);
  193.                                     String jBinary = jData.get(0);
  194.                                     ArrayList <String> dashesAndOnes = new ArrayList <String>();
  195.                                     for( String retval: differBinary(iBinary, jBinary).split(" "))
  196.                                         dashesAndOnes.add(retval);
  197.                                     String differenceBinary = dashesAndOnes.get(0);
  198.                                     int ones = Integer.parseInt(dashesAndOnes.get(1));
  199.                                     boolean fDuplicate = false;
  200.                                     for(int x=0; x<comparisons.get(k+1).size(); x++) {
  201.                                         for(int y=0; y<comparisons.get(k+1).get(x).size(); y++) {
  202.                                             String duplicate = comparisons.get(k+1).get(x).get(y).split(" ")[0];
  203.                                             if(duplicate.equals(differenceBinary)) {
  204.                                                 fDuplicate = true;
  205.                                                 break;
  206.                                             }
  207.                                         }
  208.                                     }
  209.                                     if(!fDuplicate) {
  210.                                         takenToNextComparison[l][i] = true;
  211.                                         takenToNextComparison[m][j] = true;
  212.                                        
  213.                                         String info = differenceBinary;
  214.                                         for(int x=1; x< iData.size(); x++) {
  215.                                             info += " " + iData.get(x);
  216.                                         }
  217.                                         for(int x=1; x< jData.size(); x++) {
  218.                                             info += " " + jData.get(x);
  219.                                         }
  220.                                         comparisons.get(k+1).get(ones).add(info);
  221.                                     }
  222.                                     else
  223.                                         continue;
  224.                                 }
  225.                                
  226.                             }
  227.                             if(fPrime && !takenToNextComparison[i][l]) {
  228.                                 String info = iData.get(0);
  229.                                 for(int x=1; x<iData.size(); x++)
  230.                                     info += " " + iData.get(x);
  231.                                 primeImplicants.add(info);
  232.                     }
  233.                    
  234.                     }
  235.                    
  236.                 }
  237.             }
  238.            
  239.             for(int i=0; i<comparisons.get(k).size(); i++) //groups
  240.                 for(int j=0; j<comparisons.get(k).get(i).size(); j++) {
  241.                     ArrayList <String> data = new ArrayList <String>();
  242.                     for(String retval: comparisons.get(k).get(i).get(j).split(" "))
  243.                         data.add(retval);
  244.                     String info = data.get(0);
  245.                     for(int x=1; x<data.size(); x++)
  246.                         info += " " + data.get(x);
  247.                     primeImplicants.add(info);
  248.                 }
  249.         }
  250.        
  251.         public static void main(String[] args) {
  252.             System.out.println("Enter the minterms in decimal <-1 to finish>:");
  253.             while(true) {
  254.                 int input;
  255.                 input = in.nextInt();
  256.                 if(input==-1)
  257.                     break;
  258.                 minterms.add(input);
  259.             }
  260.             System.out.println("Enter the dontcares in decimal <-1 to finish>:");
  261.             while(true) {
  262.                 int input;
  263.                 input = in.nextInt();
  264.                 if(input==-1)
  265.                     break;
  266.                 dontcares.add(input);
  267.             }
  268.             decimalToBinary();
  269.             handleInput();
  270.             doComparisons();
  271.            
  272.            
  273.             for(int i=0; i<comparisons.get(0).size(); i++) {
  274.                 for(int j=0; j<comparisons.get(0).get(i).size(); j++)
  275.                     System.out.println(comparisons.get(0).get(i).get(j));
  276.             System.out.println();
  277.             }
  278.             for(int i=0; i<comparisons.get(1).size(); i++) {
  279.                 for(int j=0; j<comparisons.get(1).get(i).size(); j++)
  280.                     System.out.println(comparisons.get(1).get(i).get(j));
  281.                 System.out.println();
  282.             }
  283.             for(int i=0; i<primeImplicants.size(); i++) {
  284.                 System.out.println(primeImplicants.get(i));
  285.             }
  286.         }
  287.        
  288.    
  289.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement