Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.Collections;
- import java.util.Scanner;
- // TODO: Auto-generated Javadoc
- /**
- * The Class Solver.
- */
- public class Solver {
- /** The minterms. */
- static ArrayList<Integer> minterms = new ArrayList<Integer>();
- /** The dontcares. */
- static ArrayList<Integer> dontcares = new ArrayList<Integer>();
- /** The comparisons. */
- static ArrayList<ArrayList<ArrayList<String>>> comparisons = new ArrayList<ArrayList<ArrayList<String>>>();
- /** The essential prime implicants. */
- static ArrayList<String> essentialPrimeImplicants = new ArrayList<String>();
- /** The minterms apperancescount. */
- static int[][] mintermsApperancescount;
- /** The prime implicants. */
- static ArrayList<String> primeImplicants = new ArrayList<String>();
- /** The combination. */
- static String[] combination = new String[26];
- /** The Maxnumber of_ vars. */
- static int MaxnumberOf_Vars;
- /** The found combination. */
- static boolean foundCombination = false;
- /** The in. */
- static Scanner in = new Scanner(System.in);
- /**
- * Fill array list.
- */
- private static void fillArrayList() {
- for (int i = 0; i < 26; i++) {
- comparisons.add(new ArrayList()); // comparisons
- for (int j = 0; j <= MaxnumberOf_Vars; j++)
- comparisons.get(i).add(new ArrayList()); // groups
- }
- }
- /**
- * Find_num ofvars.
- *
- * @return the int
- */
- private static int find_numOfvars() {
- int maxMinterm = 0, maxDontCare = 0;
- if (minterms.isEmpty() == false)
- maxMinterm = Collections.max(minterms);
- if (dontcares.isEmpty() == false)
- maxDontCare = Collections.max(dontcares);
- int maxImplicant = Math.max(maxDontCare, maxMinterm);
- String binary = Integer.toBinaryString(maxImplicant);
- return binary.length();
- }
- /**
- * Differ binary.
- *
- * @param firstMinterm the first minterm
- * @param secondMinterm the second minterm
- * @return the string
- */
- private static String differBinary(String firstMinterm, String secondMinterm) {
- String result = "";
- int ones = 0;
- for (int i = 0; i < firstMinterm.length(); i++) {
- if (firstMinterm.charAt(i) != secondMinterm.charAt(i))
- result += "-";
- else
- result += firstMinterm.charAt(i);
- if (firstMinterm.charAt(i) == '1')
- ones++;
- }
- return result + " " + String.valueOf(ones);
- }
- /**
- * Decimal to binary.
- */
- private static void decimalToBinary() {
- for (int i = 0; i < minterms.size(); i++) {
- int div = minterms.get(i), ones = 0;
- String res = "";
- while (div != 0) {
- if (div % 2 == 1) {
- ones++;
- res = "1" + res;
- } else
- res = "0" + res;
- div /= 2;
- }
- for (int j = 0, len = res.length(); j < MaxnumberOf_Vars - len; j++)
- res = "0" + res;
- comparisons.get(0).get(ones).add(res + " " + Integer.parseInt(res, 2));
- }
- for (int i = 0; i < dontcares.size(); i++) {
- int div = dontcares.get(i), ones = 0;
- String res = "";
- while (div != 0) {
- if (div % 2 == 1) {
- ones++;
- res = "1" + res;
- } else
- res = "0" + res;
- div /= 2;
- }
- for (int j = 0, len = res.length(); j < MaxnumberOf_Vars - len; j++)
- res = "0" + res;
- comparisons.get(0).get(ones).add(res + " " + Integer.parseInt(res, 2));
- }
- for (int i = 0; i < comparisons.get(0).size(); i++)
- Collections.sort(comparisons.get(0).get(i));
- }
- /**
- * Do comparisons.
- */
- private static void doComparisons() {
- int k;
- for (k = 0; k < comparisons.size() - 1; k++) { // comparisons
- boolean[][] takenToNextComparison = new boolean[10][100];
- for (int l = 0; l < comparisons.get(k).size(); l++) { // groups
- if (comparisons.get(k).get(l).isEmpty())
- continue;
- int m = l + 1;
- while (m < comparisons.get(k).size() && comparisons.get(k).get(m).isEmpty())
- m++;
- if (m == comparisons.get(k).size()) {
- for (int i = 0; i < comparisons.get(k).get(l).size(); i++) {
- if (!takenToNextComparison[l][i]) {
- ArrayList<String> iData = new ArrayList<String>();
- for (String retval : comparisons.get(k).get(l).get(i).split(" "))
- iData.add(retval);
- String info = iData.get(0);
- for (int x = 1; x < iData.size(); x++)
- info += " " + iData.get(x);
- primeImplicants.add(info);
- }
- }
- break;
- }
- for (int i = 0; i < comparisons.get(k).get(l).size(); i++) {
- boolean fPrime = true;
- ArrayList<String> iData = new ArrayList<String>();
- for (String retval : comparisons.get(k).get(l).get(i).split(" "))
- iData.add(retval);
- for (int j = 0; j < comparisons.get(k).get(m).size(); j++) {
- ArrayList<String> jData = new ArrayList<String>();
- for (String retval : comparisons.get(k).get(m).get(j).split(" "))
- jData.add(retval);
- float exponent = 0;
- int difference = 0;
- boolean fAccept = true;
- for (int x = 1; x < iData.size(); x++) {
- int iDifference = Integer.parseInt(iData.get(x));
- int jDifference = Integer.parseInt(jData.get(x));
- int tempDifference = jDifference - iDifference;
- float tempExponent = (float) (Math.log(tempDifference) / Math.log(2));
- if (x == 1) {
- difference = tempDifference;
- exponent = tempExponent;
- if (difference < 0 || exponent - (int) exponent != 0) {
- fAccept = false;
- break;
- }
- } else {
- if (tempDifference != difference || tempExponent != exponent) {
- fAccept = false;
- break;
- }
- }
- }
- if (fAccept) {
- fPrime = false;
- String iBinary = iData.get(0);
- String jBinary = jData.get(0);
- takenToNextComparison[l][i] = true;
- takenToNextComparison[m][j] = true;
- ArrayList<String> dashesAndOnes = new ArrayList<String>();
- for (String retval : differBinary(iBinary, jBinary).split(" "))
- dashesAndOnes.add(retval);
- String differenceBinary = dashesAndOnes.get(0);
- int ones = Integer.parseInt(dashesAndOnes.get(1));
- boolean fDuplicate = false;
- for (int x = 0; x < comparisons.get(k + 1).size(); x++) {
- for (int y = 0; y < comparisons.get(k + 1).get(x).size(); y++) {
- String duplicate = comparisons.get(k + 1).get(x).get(y).split(" ")[0];
- if (duplicate.equals(differenceBinary)) {
- fDuplicate = true;
- break;
- }
- }
- }
- if (!fDuplicate) {
- String info = differenceBinary;
- for (int x = 1; x < iData.size(); x++) {
- info += " " + iData.get(x);
- }
- for (int x = 1; x < jData.size(); x++) {
- info += " " + jData.get(x);
- }
- comparisons.get(k + 1).get(ones).add(info);
- } else
- continue;
- }
- }
- if (fPrime && !takenToNextComparison[l][i]) {
- String info = iData.get(0);
- for (int x = 1; x < iData.size(); x++)
- info += " " + iData.get(x);
- primeImplicants.add(info);
- }
- }
- }
- }
- for (int i = 0; i < comparisons.get(k).size(); i++) // groups
- for (int j = 0; j < comparisons.get(k).get(i).size(); j++) {
- ArrayList<String> data = new ArrayList<String>();
- for (String retval : comparisons.get(k).get(i).get(j).split(" "))
- data.add(retval);
- String info = data.get(0);
- for (int x = 1; x < data.size(); x++)
- info += " " + data.get(x);
- primeImplicants.add(info);
- }
- }
- /**
- * Find_ expression.
- *
- * @param a the a
- * @return the string
- */
- private static String find_Expression(ArrayList a) {
- String expression = new String();
- ;
- StringBuilder Dashes_expression = null;
- StringBuilder expression_Builder = new StringBuilder();
- /// I want to know the maximum estimated number of variables;
- for (int i = 0; i < a.size(); i++) {
- for (String retval : ((String) a.get(i)).split(" ")) {
- Dashes_expression = new StringBuilder();
- Dashes_expression.append(retval);
- break;
- }
- for (int j = 0; j < Dashes_expression.length(); j++) {
- if (Dashes_expression.charAt(j) == '1') {
- char character = (char) ((int) ('A') + j);
- expression_Builder.append(character);
- } else if (Dashes_expression.charAt(j) == '0') {
- char character = (char) ((int) ('A') + j);
- String str = new String();
- str += character + "'";
- expression_Builder.append(str);
- }
- }
- if (i != (a.size() - 1))
- expression_Builder.append(" + ");
- }
- expression = expression_Builder.toString();
- return expression;
- }
- /**
- * Check combination.
- *
- * @param len the len
- * @return true, if successful
- */
- private static boolean checkCombination(int len) {
- ArrayList<Integer> checkedMinterms = new ArrayList<Integer>();
- for (int i = 0; i < len; i++) {
- ArrayList<String> data = new ArrayList<String>();
- for (String retval : combination[i].split(" "))
- data.add(retval);
- for (int j = 1; j < data.size(); j++)
- checkedMinterms.add(Integer.parseInt(data.get(j)));
- }
- if (checkedMinterms.containsAll(minterms))
- return true;
- else
- return false;
- }
- /**
- * Count_the appearnces.
- */
- private static void count_theAppearnces() {
- StringBuilder str2;
- int foundFlag = 0;
- mintermsApperancescount = new int[minterms.size()][2];
- for (int i = 0; i < minterms.size(); i++) {
- mintermsApperancescount[i][0] = minterms.get(i);
- }
- for (int i = 0; i < primeImplicants.size(); i++) {
- String str = primeImplicants.get(i).split(" ", 2)[1];
- str2 = new StringBuilder();
- for (int j = 0; j <= str.length(); j++) {
- foundFlag = 0;
- if ((j != str.length()) && (str.charAt(j) != ' ')) {
- str2.append(str.charAt(j));
- } else {
- int vaL = Integer.parseInt(str2.toString());
- for (int k = 0; k < mintermsApperancescount.length; k++) {
- if (vaL == mintermsApperancescount[k][0]) {
- foundFlag = 1;
- mintermsApperancescount[k][1]++;
- str2 = new StringBuilder();
- break;
- }
- }
- if (foundFlag == 0)
- str2 = new StringBuilder();
- }
- }
- }
- }
- /**
- * Hunt_the rest.
- *
- * @return true, if successful
- */
- private static boolean hunt_theRest() {
- int countZeros = 0;
- for (int i = 0; i < mintermsApperancescount.length; i++) {
- if (mintermsApperancescount[i][1] == 0) {
- for (int j = 0; j < minterms.size(); j++) {
- if (mintermsApperancescount[i][0] == minterms.get(j)) {
- minterms.remove(j);
- break;
- }
- }
- countZeros++;
- }
- }
- if (countZeros == mintermsApperancescount.length) {
- return true;
- } else {
- return false;
- }
- }
- /**
- * Thefinal_expression.
- */
- private static void thefinal_expression() {
- int uniqueMinterm, foundFlag = 0;
- StringBuilder str2;
- for (int i = 0; i < mintermsApperancescount.length; i++) {
- if (mintermsApperancescount[i][1] == 1) {
- uniqueMinterm = mintermsApperancescount[i][0];
- for (int j = 0; j < primeImplicants.size(); j++) {
- String str = primeImplicants.get(j).split(" ", 2)[1];
- str2 = new StringBuilder();
- for (int k = 0; k <= str.length(); k++) {
- if ((k != str.length()) && (str.charAt(k) != ' ')) {
- str2.append(str.charAt(k));
- } else if (((k != str.length()) && (str.charAt(k) == ' ')) || (k == (str.length()))) {
- int value = Integer.parseInt(str2.toString());
- if (value == uniqueMinterm) {
- essentialPrimeImplicants.add(primeImplicants.get(j));
- primeImplicants.remove(j);
- str2 = new StringBuilder();
- for (int u = 0; u <= str.length(); u++) {
- foundFlag = 0;
- if ((u != str.length()) && (str.charAt(u) != ' ')) {
- str2.append(str.charAt(u));
- } else {
- int vaL = Integer.parseInt(str2.toString());
- for (int m = 0; m < mintermsApperancescount.length; m++) {
- if (vaL == mintermsApperancescount[m][0]) {
- foundFlag = 1;
- mintermsApperancescount[m][1] = 0;
- str2 = new StringBuilder();
- ;
- break;
- }
- }
- if (foundFlag == 0)
- str2 = new StringBuilder();
- }
- }
- } else {
- str2 = new StringBuilder();
- }
- }
- }
- }
- }
- }
- }
- /**
- * Contains one.
- *
- * @return true, if successful
- */
- private static boolean containsOne() {
- for (int i = 0; i < mintermsApperancescount.length; i++) {
- if ((mintermsApperancescount[i][1]) == 1)
- return true;
- }
- return false;
- }
- /**
- * Generate combinations.
- *
- * @param element the element
- * @param m the m
- * @param len the len
- */
- private static void generateCombinations(int element, int m, int len) { // (1,0,size)
- if (m == len) {
- if (checkCombination(len)) {
- foundCombination = true;
- fillEssentialPrime(len);
- Arrays.fill(combination, "");
- }
- return;
- }
- if (element == primeImplicants.size() + 1)
- return;
- combination[m] = primeImplicants.get(element - 1);
- generateCombinations(element + 1, m + 1, len);
- generateCombinations(element + 1, m, len);
- }
- /**
- * Fill essential prime.
- *
- * @param numberOfEssential the number of essential
- */
- private static void fillEssentialPrime(int numberOfEssential) {
- ArrayList<String> essential = new ArrayList<String>();
- for (int i = 0; i < numberOfEssential; i++) {
- System.out.println(combination[i]);
- essential.add(combination[i]);
- }
- for (int i = 0; i < essentialPrimeImplicants.size(); i++)
- System.out.println(essentialPrimeImplicants.get(i));
- System.out.println();
- String expression = find_Expression(essentialPrimeImplicants) + " + " + find_Expression(essential);
- System.out.println(expression);
- }
- /**
- * The main method.
- *
- * @param args the arguments
- */
- public static void main(String[] args) {
- System.out.println("Enter the minterms in decimal <-1 to finish>:");
- while (true) {
- int input;
- input = in.nextInt();
- if (input == -1)
- break;
- minterms.add(input);
- }
- System.out.println("Enter the dontcares in decimal <-1 to finish>:");
- while (true) {
- int input;
- input = in.nextInt();
- if (input == -1)
- break;
- dontcares.add(input);
- }
- MaxnumberOf_Vars = find_numOfvars();
- fillArrayList();
- decimalToBinary();
- doComparisons();
- count_theAppearnces();
- for (int k = 0; k < comparisons.size(); k++) {
- boolean comparisonHasElements = false;
- for (int i = 0; i < comparisons.get(k).size(); i++) {
- if (comparisons.get(k).get(i).isEmpty())
- continue;
- for (int j = 0; j < comparisons.get(k).get(i).size(); j++) {
- System.out.println(comparisons.get(k).get(i).get(j));
- }
- comparisonHasElements = true;
- System.out.println("-----------------");
- }
- if (comparisonHasElements) {
- System.out.println("______________________________________________________");
- System.out.println();
- }
- }
- System.out.println("Prime Implicants:");
- for (int i = 0; i < primeImplicants.size(); i++) {
- System.out.println(primeImplicants.get(i));
- }
- System.out.println();
- System.out.println(find_Expression(primeImplicants));
- System.out.println();
- System.out.println();
- System.out.println("Essential Prime Implicants:");
- count_theAppearnces();
- if (containsOne()) {
- thefinal_expression();
- if (!hunt_theRest()) {
- for (int i = 1; i <= primeImplicants.size() && !foundCombination; i++)
- generateCombinations(1, 0, i);
- }
- else {
- for(int i=0; i<essentialPrimeImplicants.size(); i++)
- System.out.println(essentialPrimeImplicants.get(i));
- System.out.println(find_Expression(essentialPrimeImplicants));
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement