Ad
Code
Diff
  • import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.LinkedList;
    import java.util.regex.Pattern;
    	
    class Crossword {
    	static class Operation {
    		private static final Pattern SOLO_LETRAS = Pattern.compile("^[A-Za-z]+$");
    		ArrayList<String> parameters;
    		String result;
    		
    		public Operation(ArrayList<String> parameters, String result) {
    			this.parameters = parameters;
    			this.result = result;
    		}
    
    		@Override
    		public String toString() {
    			return "Operation [" + parameters + ", =" + result + "]";
    		}
    		
    		public int unknownAmmount(HashMap<String, Integer> solvedUnkowns) {
    			int ammount = 0;
    			final String REGEX = "^((-)?[0-9]+)|([-+x/])$";
    			for (String str : parameters) {
    				if (!str.matches(REGEX) && !solvedUnkowns.containsKey(str)) {
    					ammount++;
    				}
    			}
    			if (!result.matches(REGEX) && !solvedUnkowns.containsKey(result)) {
    				ammount++;
    			}
    			return ammount;
    		}
    
    		public void calculateUnkown(HashMap<String, Integer> solvedUnkowns) {
    			if(result.matches("[A-Z]+")) {
    				int resultUnknown = Integer.parseInt(this.parameters.get(0));
    				for(int operador=1;operador<this.parameters.size();operador+=2) {
    					switch(this.parameters.get(operador)) {
    						case "+":
    							resultUnknown+=Integer.parseInt(this.parameters.get(operador+1));
    							break;
    						case "-":
    							resultUnknown-=Integer.parseInt(this.parameters.get(operador+1));
    							break;
    						case "*":
    							resultUnknown*=Integer.parseInt(this.parameters.get(operador+1));
    							break;
    						case "/":
    							resultUnknown/=Integer.parseInt(this.parameters.get(operador+1));
    							break;
    						default: 
    							throw new IllegalArgumentException("Comando desconocido: ");
    							
    					}
    				}
    				solvedUnkowns.put(result, resultUnknown);
    			}else if(containsVariable(this.parameters)){
    				int resultUnknown =  Integer.parseInt(result);
    				String result;
    				int route=1;
    				while(!this.parameters.get(route).matches("[A-Z]+")) {
    					switch(this.parameters.get(route+1)) {
    					case "-":
    						resultUnknown+=Integer.parseInt(this.parameters.get(route-1));
    						break;
    					case "+":
    						resultUnknown-=Integer.parseInt(this.parameters.get(route-1));
    						break;
    					case "/":
    						resultUnknown*=Integer.parseInt(this.parameters.get(route-1));
    						break;
    					case "*":
    						resultUnknown/=Integer.parseInt(this.parameters.get(route-1));
    						break;
    					}
    					route+=2;
    				}
    				result=this.parameters.get(route);
    				route+=2;
    				while(route<this.parameters.size()) {
    					switch(this.parameters.get(route)) {
    					case "-":
    						resultUnknown+=Integer.parseInt(this.parameters.get(route+1));
    						break;
    					case "+":
    						resultUnknown-=Integer.parseInt(this.parameters.get(route+1));
    						break;
    					case "/":
    						resultUnknown*=Integer.parseInt(this.parameters.get(route+1));
    						break;
    					case "*":
    						resultUnknown/=Integer.parseInt(this.parameters.get(route+1));
    						break;
    					default: 
    						throw new IllegalArgumentException("Comando desconocido: ");
    					}
    					route+=2;
    				}
    				
    				solvedUnkowns.put(result, resultUnknown);
    			}else {
    				throw new IllegalArgumentException("Ninguna parte contiene una variable");
    			}
    			
    		}
    		
    	    public static Boolean containsVariable(ArrayList<String> array) {
    	        return array.stream()
    	                .anyMatch(palabra -> SOLO_LETRAS.matcher(palabra).matches());
    	    }
    	}
    	
    	public static HashMap<String, Integer> solve(String[][] board) {
    		
    		HashMap<String, Integer> solvedUnkowns = new HashMap<String, Integer>();
    		LinkedList<Operation> operations = new LinkedList<Crossword.Operation>();
    		
    		for (int row = 0; row < board.length; row += 2) {
    			ArrayList<String> parameters = new ArrayList<String>();
    			for (int col = 0; col < board[row].length; col++) {
    				if ("=".equals(board[row][col])) {
    					operations.add(new Operation(parameters, board[row][col+1]));
    					parameters = new ArrayList<String>();
    				} else {
    					parameters.add(board[row][col]);
    				}
    			}
    		}
    		
    		for (int col = 0; col < board[0].length; col += 2) {
    			ArrayList<String> parameters = new ArrayList<String>();
    			for (int row = 0; row < board.length; row++) {
    				if ("=".equals(board[row][col])) {
    					operations.add(new Operation(parameters, board[row+1][col]));
    					parameters = new ArrayList<String>();
    				} else {
    					parameters.add(board[row][col]);
    				}
    			}
    		}
    		System.out.println("lista" + operations.toString());
    		int cont = 0;
    		while (0 < operations.size()) {
    			Operation op = operations.pollFirst();
    			switch (op.unknownAmmount(solvedUnkowns)) {
    			case 0:
    				// not doing anything, just removing it from the queue
    				cont = 0;
    				break;
    			case 1:
    				op.calculateUnkown(solvedUnkowns);
    				cont = 0;
    				break;
    			default:
    				operations.addLast(op);
    				cont++;
    				break;
    			}
    			if (operations.size() <= cont) {
    				return solvedUnkowns;
    			}
    		}
    		
    		return solvedUnkowns;
    	}
    }
    
    • class Crossword{
    • }
    • import java.util.ArrayList;
    • import java.util.HashMap;
    • import java.util.LinkedList;
    • import java.util.regex.Pattern;
    • class Crossword {
    • static class Operation {
    • private static final Pattern SOLO_LETRAS = Pattern.compile("^[A-Za-z]+$");
    • ArrayList<String> parameters;
    • String result;
    • public Operation(ArrayList<String> parameters, String result) {
    • this.parameters = parameters;
    • this.result = result;
    • }
    • @Override
    • public String toString() {
    • return "Operation [" + parameters + ", =" + result + "]";
    • }
    • public int unknownAmmount(HashMap<String, Integer> solvedUnkowns) {
    • int ammount = 0;
    • final String REGEX = "^((-)?[0-9]+)|([-+x/])$";
    • for (String str : parameters) {
    • if (!str.matches(REGEX) && !solvedUnkowns.containsKey(str)) {
    • ammount++;
    • }
    • }
    • if (!result.matches(REGEX) && !solvedUnkowns.containsKey(result)) {
    • ammount++;
    • }
    • return ammount;
    • }
    • public void calculateUnkown(HashMap<String, Integer> solvedUnkowns) {
    • if(result.matches("[A-Z]+")) {
    • int resultUnknown = Integer.parseInt(this.parameters.get(0));
    • for(int operador=1;operador<this.parameters.size();operador+=2) {
    • switch(this.parameters.get(operador)) {
    • case "+":
    • resultUnknown+=Integer.parseInt(this.parameters.get(operador+1));
    • break;
    • case "-":
    • resultUnknown-=Integer.parseInt(this.parameters.get(operador+1));
    • break;
    • case "*":
    • resultUnknown*=Integer.parseInt(this.parameters.get(operador+1));
    • break;
    • case "/":
    • resultUnknown/=Integer.parseInt(this.parameters.get(operador+1));
    • break;
    • default:
    • throw new IllegalArgumentException("Comando desconocido: ");
    • }
    • }
    • solvedUnkowns.put(result, resultUnknown);
    • }else if(containsVariable(this.parameters)){
    • int resultUnknown = Integer.parseInt(result);
    • String result;
    • int route=1;
    • while(!this.parameters.get(route).matches("[A-Z]+")) {
    • switch(this.parameters.get(route+1)) {
    • case "-":
    • resultUnknown+=Integer.parseInt(this.parameters.get(route-1));
    • break;
    • case "+":
    • resultUnknown-=Integer.parseInt(this.parameters.get(route-1));
    • break;
    • case "/":
    • resultUnknown*=Integer.parseInt(this.parameters.get(route-1));
    • break;
    • case "*":
    • resultUnknown/=Integer.parseInt(this.parameters.get(route-1));
    • break;
    • }
    • route+=2;
    • }
    • result=this.parameters.get(route);
    • route+=2;
    • while(route<this.parameters.size()) {
    • switch(this.parameters.get(route)) {
    • case "-":
    • resultUnknown+=Integer.parseInt(this.parameters.get(route+1));
    • break;
    • case "+":
    • resultUnknown-=Integer.parseInt(this.parameters.get(route+1));
    • break;
    • case "/":
    • resultUnknown*=Integer.parseInt(this.parameters.get(route+1));
    • break;
    • case "*":
    • resultUnknown/=Integer.parseInt(this.parameters.get(route+1));
    • break;
    • default:
    • throw new IllegalArgumentException("Comando desconocido: ");
    • }
    • route+=2;
    • }
    • solvedUnkowns.put(result, resultUnknown);
    • }else {
    • throw new IllegalArgumentException("Ninguna parte contiene una variable");
    • }
    • }
    • public static Boolean containsVariable(ArrayList<String> array) {
    • return array.stream()
    • .anyMatch(palabra -> SOLO_LETRAS.matcher(palabra).matches());
    • }
    • }
    • public static HashMap<String, Integer> solve(String[][] board) {
    • HashMap<String, Integer> solvedUnkowns = new HashMap<String, Integer>();
    • LinkedList<Operation> operations = new LinkedList<Crossword.Operation>();
    • for (int row = 0; row < board.length; row += 2) {
    • ArrayList<String> parameters = new ArrayList<String>();
    • for (int col = 0; col < board[row].length; col++) {
    • if ("=".equals(board[row][col])) {
    • operations.add(new Operation(parameters, board[row][col+1]));
    • parameters = new ArrayList<String>();
    • } else {
    • parameters.add(board[row][col]);
    • }
    • }
    • }
    • for (int col = 0; col < board[0].length; col += 2) {
    • ArrayList<String> parameters = new ArrayList<String>();
    • for (int row = 0; row < board.length; row++) {
    • if ("=".equals(board[row][col])) {
    • operations.add(new Operation(parameters, board[row+1][col]));
    • parameters = new ArrayList<String>();
    • } else {
    • parameters.add(board[row][col]);
    • }
    • }
    • }
    • System.out.println("lista" + operations.toString());
    • int cont = 0;
    • while (0 < operations.size()) {
    • Operation op = operations.pollFirst();
    • switch (op.unknownAmmount(solvedUnkowns)) {
    • case 0:
    • // not doing anything, just removing it from the queue
    • cont = 0;
    • break;
    • case 1:
    • op.calculateUnkown(solvedUnkowns);
    • cont = 0;
    • break;
    • default:
    • operations.addLast(op);
    • cont++;
    • break;
    • }
    • if (operations.size() <= cont) {
    • return solvedUnkowns;
    • }
    • }
    • return solvedUnkowns;
    • }
    • }