/** * @author: Thiago de Campos Ribeiro Nolasco */ class Algebra{ /** * Receives a splitted string with an already finished logical operation ("result"), and replaces the correct spot ("split") on the first read string ("s") * @param String * @param String * @param String * @return */ public static String fillingNewSplittedPart(String s, String split, String result){ String newString = ""; boolean flag = false; int count = 0; for(int i = 0; i < s.length(); i++){ count = 0; if(s.charAt(i) == split.charAt(0) && flag == false){ for(int j = 0; j < split.length(); j++){ if(s.charAt(j + i) == split.charAt(j)) { count++; } else { count = 0; } } if(count == split.length()){ flag = true; newString += result.charAt(0); i += count - 1; }else{ newString += s.charAt(i); } }else{newString += s.charAt(i);} } return newString; } // ending method /** * Receives a splitted logical operations, and does the operation * @param String * @return */ public static String resolvingOperation(String s){ String resolved = "1"; // && if(s.charAt(0) == 38){ for(int i = 0; i < s.length(); i++){ if(s.charAt(i) == 48) resolved = "0"; } } // || if(s.charAt(0) == 124){ int count = 0; for(int i = 0; i < s.length(); i++){ if(s.charAt(i) != 49) count++; } if(count == s.length()){ resolved = "0"; } } // ! if(s.charAt(0) == 33){ for(int i = 0; i < s.length(); i++){ if(s.charAt(i) == 49){ resolved = "0"; } if(s.charAt(i) == 48){ resolved = "1"; } } } return resolved; } // ending method /** * receives a String and returns the content between "( )" * @param String * @return String */ public static String getSplittedString(String s){ // Data declaration String split = ""; boolean finished = false; int i = 0; while(!finished){ if(s.charAt(i) == 41) { // 41 == "(" split += s.charAt(i); finished = true; }else{ split+= s.charAt(i); } if(i == s.length() - 1) { i = 0; } else { i += 1; } } return split; } // ending method /** * receives a String and checks if on it's content has more than one "(". * @param String * @return */ public static boolean isComplete(String s){ // Data declaration int count = 0; for(int i = 0; i < s.length(); i++){ if(s.charAt(i) == 40) count++; if(count > 1) return false; } return true; } // ending method /** * receives a formated String and does the logical operation (using recursion) * @param String * @param Int * @return */ public static String logicalOperations(String s, int i){ // Data declaration String split = "", result = ""; // Start the return when s.length == 1, that means answer found if(s.length() != 1){ split = ""; // If the read char is == to & , | or ! if(s.charAt(i) == 38 || s.charAt(i) == 124 || s.charAt(i) == 33){ // Then, do the split from the read char until the end of the string for(int j = i; j < s.length(); j++){ split += s.charAt(j); } // Checks if the read string is complete ( If it starts with "(" and ends with ")" without having and "(" between then if(isComplete(split)){ // Splits the "splitted" string, and returns just the piece that we want, e.g: &(1 , 0) split = getSplittedString(split); // Then, using the above splitted string, it resolves the Boolean expression, e.g: &(1 , 0) == 0 result = resolvingOperation(split); // Then, using the re-splitted string and the result above, the beggining string will be replaced, e.g: Where was &(1 , 0) will be replaced with "0" s = fillingNewSplittedPart(s, split, result); // Puts the i into the end of the string so it can be re-read i = s.length() - 1; } } if(i != s.length() -1){ s = logicalOperations(s, 1 + i); } if( i == s.length() - 1 ) { s = logicalOperations(s , 0); } } // Return the finished string return s; } // ending method /** * receives a formated String and changes the written Logical operations into it's sign * @param String * @return */ public static String replaceLogicalOperations(String s){ String split = ""; for(int i = 0; i < s.length(); i++){ if(s.charAt(i) == 97) { split += "&"; i+= 2; } // and -> & else if(s.charAt(i) == 111) { split += "|"; i += 1; } // or -> | else if(s.charAt(i) == 110) { split += "!"; i += 2;} // not -> else if(s.charAt(i) == 32) { } else split += s.charAt(i); } return split; } // ending method /** * receives a String and make the initial value changes on it * @param String * @return */ public static String replaceVariableValues(String s){ String split = ""; char A = ' ', B = ' ', C = ' '; int i = 0; if(s.charAt(0) == 51){ // == "3" A = s.charAt(2); B = s.charAt(4); C = s.charAt(6); i = 8; // the new String starts after the valuation of the variables }else if(s.charAt(0) == 50){ // == 2 A = s.charAt(2); B = s.charAt(4); i = 6; // "" "" "" }else if(s.charAt(0) == 49){ // 1 A = s.charAt(2); i = 5; // "" "" "" } // Recreating the newest string for(i = i; i < s.length(); i++){ if(s.charAt(i) == 65){ split += A; } else if(s.charAt(i) == 66) { split += B; } else if(s.charAt(i) == 67) { split += C; } else split += s.charAt(i); } return split; } // ending method /** * receives a String and calls other methods to filter the String to create a Logical Operation * @param String * @return */ public static String initializer(String s){ String returned = ""; returned = replaceVariableValues(s); returned = replaceLogicalOperations(returned); returned = logicalOperations(returned, 0); return returned; } // ending method /** * receives a String and checks if it's equals to "0" * @param String * @return */ public static boolean isFim(String s){ return (s.length() == 1 && s.charAt(0) == 48); }// ending method /** * (MAIN) receives input from keyboard and starts the program * @param String[] */ public static void main(String[] args){ // data declaration String[] entries = new String[1000]; int numEntries = 0; // Reading entries do{ entries[numEntries] = MyIO.readLine(); }while(!(isFim(entries[numEntries++]))); numEntries--; // Decreasing when it reads "FIM" for(int i = 0; i < numEntries; i++){ MyIO.println(initializer(entries[i])); } }// ending main } // ending class