Advertisement
anas_harby

Untitled

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