Ad
Code
Diff
  • import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.LinkedList;
    
     
    public class CrossMath {
    	static class Operation {
    		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]+)|([-+*/])$";
    			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) {
    			for(int position=0;position<this.parameters.size();position++) {
    				String param = this.parameters.get(position);
    				if (solvedUnkowns.containsKey(param)) {
    				    this.parameters.set(position, Integer.toString(solvedUnkowns.get(param)));
    				}
    			}
    
    			String resultVar = result;
    			if (solvedUnkowns.containsKey(resultVar)) {
    			    result = Integer.toString(solvedUnkowns.get(resultVar));
    			}
    			
    			if(result.matches("[A-Z]+")) {
    				
    				int resultUnknown;
    				int intParameter1 = Integer.parseInt(this.parameters.get(0));
    				int intParameter2 = Integer.parseInt(this.parameters.get(2));
    				
    					switch(this.parameters.get(1)) {
    						case "+":
    							resultUnknown = intParameter1+intParameter2;
    							break;
    						case "-":
    							resultUnknown = intParameter1-intParameter2;
    							break;
    						case "*":
    							resultUnknown = intParameter1*intParameter2;
    							break;
    						case "/":	
    							if(intParameter1 == 0 || intParameter2== 0) {
    								resultUnknown = 0;
    							}else {
    								resultUnknown = intParameter1/intParameter2;
    							}
    							break;
    						default: 
    							throw new IllegalArgumentException("Comando desconocido: ");
    				}
    				solvedUnkowns.put(result, resultUnknown);
    			}else if(this.parameters.get(0).matches("[A-Z]+")){
    				
    				int resultUnknown;
    				int intResult = Integer.parseInt(result);
    				int intParameter = Integer.parseInt(this.parameters.get(2));
    				
    				switch(this.parameters.get(1)) {
    				case "+":
    					resultUnknown = intResult-intParameter;
    					break;
    				case "-":
    					resultUnknown = intParameter+intResult;
    					break;
    				case "*":
    					if(intResult == 0 || intParameter== 0) {
    						resultUnknown = 0;
    					}else {
    						resultUnknown = intResult/intParameter;
    					}
    					break;
    				case "/":
    					resultUnknown = intResult*intParameter;
    					break;
    				default: 
    					throw new IllegalArgumentException("Comando desconocido: ");
    				}
    				solvedUnkowns.put(this.parameters.get(0), resultUnknown);
    			}else if(this.parameters.get(2).matches("[A-Z]+")){
    				
    				int intResult = Integer.parseInt(result);
    				int intParameter = Integer.parseInt(this.parameters.get(0));
    				int resultUnknown;
    				
    				switch(this.parameters.get(1)) {
    				case "+":
    					resultUnknown = intResult-intParameter;
    					break;
    				case "-":
    					resultUnknown = intParameter-intResult;
    					break;
    				case "*":
    					if(intResult == 0 || intParameter== 0) {
    						resultUnknown = 0;
    					}else {
    						resultUnknown = intResult/intParameter;
    					}
    					break;
    				case "/":
    					resultUnknown = intParameter/intResult;
    					break;
    				default: 
    					
    					throw new IllegalArgumentException("Comando desconocido: ");
    					
    				}
    				solvedUnkowns.put(this.parameters.get(2), resultUnknown);
    			}
    		}
    	
    	}
    	public static String[][] solve(String[][] board) {
    		HashMap<String, Integer> solvedUnkowns = new HashMap<String, Integer>();
    		LinkedList<Operation> operations = new LinkedList<CrossMath.Operation>();
    		for (int row = 0; row < board.length; row += 2) {
    			ArrayList<String> parameters = new ArrayList<String>();
    			for (int col = 0; col < board.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]);
    				}
    			}
    		}
    		int cont = 0;
    		while (0 < operations.size()) {
    			Operation op = operations.pollFirst();
    			switch (op.unknownAmmount(solvedUnkowns)) {
    			case 0:
    				cont = 0;
    				break;
    			case 1:
    				op.calculateUnkown(solvedUnkowns);
    				cont = 0;
    				break;
    			default:
    				operations.addLast(op);
    				cont++;
    				break;
    			}
    			if (operations.size() <= cont) {
    				String[][] res = new String[5][5];
    				for(int i = 0; i < board.length; i++) {
    					for(int k = 0; k < board[i].length; k++) {
    						if(board[i][k].matches("[A-Z]")) {
    							res[i][k] = String.valueOf(solvedUnkowns.get(board[i][k]));
    						}else {
    							res[i][k] = board[i][k];
    						}
    					}
    				}
    				
    				return res;
    			}
    		}
    		return null;
    	}
    }
    • import java.util.ArrayList;
    • import java.util.HashMap;
    • import java.util.LinkedList;
    • public class CrossMath {
    • static class Operation {
    • 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]+)|([-+*/])$";
    • 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) {
    • for(int position=0;position<this.parameters.size();position++) {
    • String param = this.parameters.get(position);
    • if (solvedUnkowns.containsKey(param)) {
    • this.parameters.set(position, Integer.toString(solvedUnkowns.get(param)));
    • }
    • }
    • String resultVar = result;
    • if (solvedUnkowns.containsKey(resultVar)) {
    • result = Integer.toString(solvedUnkowns.get(resultVar));
    • }
    • if(result.matches("[A-Z]+")) {
    • int resultUnknown;
    • int intParameter1 = Integer.parseInt(this.parameters.get(0));
    • int intParameter2 = Integer.parseInt(this.parameters.get(2));
    • switch(this.parameters.get(1)) {
    • case "+":
    • resultUnknown = intParameter1+intParameter2;
    • break;
    • case "-":
    • resultUnknown = intParameter1-intParameter2;
    • break;
    • case "*":
    • resultUnknown = intParameter1*intParameter2;
    • break;
    • case "/":
    • resultUnknown = intParameter1/intParameter2;
    • case "/":
    • if(intParameter1 == 0 || intParameter2== 0) {
    • resultUnknown = 0;
    • }else {
    • resultUnknown = intParameter1/intParameter2;
    • }
    • break;
    • default:
    • throw new IllegalArgumentException("Comando desconocido: ");
    • }
    • solvedUnkowns.put(result, resultUnknown);
    • }else if(this.parameters.get(0).matches("[A-Z]+")){
    • int resultUnknown;
    • int intResult = Integer.parseInt(result);
    • int intParameter = Integer.parseInt(this.parameters.get(2));
    • switch(this.parameters.get(1)) {
    • case "+":
    • resultUnknown = intResult-intParameter;
    • break;
    • case "-":
    • resultUnknown = intParameter+intResult;
    • break;
    • case "*":
    • resultUnknown = intResult/intParameter;
    • if(intResult == 0 || intParameter== 0) {
    • resultUnknown = 0;
    • }else {
    • resultUnknown = intResult/intParameter;
    • }
    • break;
    • case "/":
    • resultUnknown = intResult*intParameter;
    • break;
    • default:
    • throw new IllegalArgumentException("Comando desconocido: ");
    • }
    • solvedUnkowns.put(this.parameters.get(0), resultUnknown);
    • }else if(this.parameters.get(2).matches("[A-Z]+")){
    • int intResult = Integer.parseInt(result);
    • int intParameter = Integer.parseInt(this.parameters.get(0));
    • int resultUnknown;
    • switch(this.parameters.get(1)) {
    • case "+":
    • resultUnknown = intResult-intParameter;
    • break;
    • case "-":
    • resultUnknown = intParameter-intResult;
    • break;
    • case "*":
    • resultUnknown = intResult/intParameter;
    • if(intResult == 0 || intParameter== 0) {
    • resultUnknown = 0;
    • }else {
    • resultUnknown = intResult/intParameter;
    • }
    • break;
    • case "/":
    • resultUnknown = intParameter/intResult;
    • break;
    • default:
    • throw new IllegalArgumentException("Comando desconocido: ");
    • }
    • solvedUnkowns.put(this.parameters.get(2), resultUnknown);
    • }
    • }
    • }
    • public static String[][] solve(String[][] board) {
    • HashMap<String, Integer> solvedUnkowns = new HashMap<String, Integer>();
    • LinkedList<Operation> operations = new LinkedList<CrossMath.Operation>();
    • for (int row = 0; row < board.length; row += 2) {
    • ArrayList<String> parameters = new ArrayList<String>();
    • for (int col = 0; col < board.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]);
    • }
    • }
    • }
    • int cont = 0;
    • while (0 < operations.size()) {
    • Operation op = operations.pollFirst();
    • switch (op.unknownAmmount(solvedUnkowns)) {
    • case 0:
    • cont = 0;
    • break;
    • case 1:
    • op.calculateUnkown(solvedUnkowns);
    • cont = 0;
    • break;
    • default:
    • operations.addLast(op);
    • cont++;
    • break;
    • }
    • if (operations.size() <= cont) {
    • String[][] res = new String[5][5];
    • for(int i = 0; i < board.length; i++) {
    • for(int k = 0; k < board[i].length; k++) {
    • if(board[i][k].matches("[A-Z]")) {
    • res[i][k] = String.valueOf(solvedUnkowns.get(board[i][k]));
    • }else {
    • res[i][k] = board[i][k];
    • }
    • }
    • }
    • return res;
    • }
    • }
    • return null;
    • }
    • }
Code
Diff
  • import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.LinkedList;
    
     
    public class CrossMath {
    	static class Operation {
    		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]+)|([-+*/])$";
    			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) {
    			for(int position=0;position<this.parameters.size();position++) {
    				String param = this.parameters.get(position);
    				if (solvedUnkowns.containsKey(param)) {
    				    this.parameters.set(position, Integer.toString(solvedUnkowns.get(param)));
    				}
    			}
    
    			String resultVar = result;
    			if (solvedUnkowns.containsKey(resultVar)) {
    			    result = Integer.toString(solvedUnkowns.get(resultVar));
    			}
    			
    			if(result.matches("[A-Z]+")) {
    				
    				int resultUnknown;
    				int intParameter1 = Integer.parseInt(this.parameters.get(0));
    				int intParameter2 = Integer.parseInt(this.parameters.get(2));
    				
    					switch(this.parameters.get(1)) {
    						case "+":
    							resultUnknown = intParameter1+intParameter2;
    							break;
    						case "-":
    							resultUnknown = intParameter1-intParameter2;
    							break;
    						case "*":
    							resultUnknown = intParameter1*intParameter2;
    							break;
    						case "/":
    							resultUnknown = intParameter1/intParameter2;
    							break;
    						default: 
    							throw new IllegalArgumentException("Comando desconocido: ");
    				}
    				solvedUnkowns.put(result, resultUnknown);
    			}else if(this.parameters.get(0).matches("[A-Z]+")){
    				
    				int resultUnknown;
    				int intResult = Integer.parseInt(result);
    				int intParameter = Integer.parseInt(this.parameters.get(2));
    				
    				switch(this.parameters.get(1)) {
    				case "+":
    					resultUnknown = intResult-intParameter;
    					break;
    				case "-":
    					resultUnknown = intParameter+intResult;
    					break;
    				case "*":
    					resultUnknown = intResult/intParameter;
    					break;
    				case "/":
    					resultUnknown = intResult*intParameter;
    					break;
    				default: 
    					throw new IllegalArgumentException("Comando desconocido: ");
    				}
    				solvedUnkowns.put(this.parameters.get(0), resultUnknown);
    			}else if(this.parameters.get(2).matches("[A-Z]+")){
    				
    				int intResult = Integer.parseInt(result);
    				int intParameter = Integer.parseInt(this.parameters.get(0));
    				int resultUnknown;
    				
    				switch(this.parameters.get(1)) {
    				case "+":
    					resultUnknown = intResult-intParameter;
    					break;
    				case "-":
    					resultUnknown = intParameter-intResult;
    					break;
    				case "*":
    					resultUnknown = intResult/intParameter;
    					break;
    				case "/":
    					resultUnknown = intParameter/intResult;
    					break;
    				default: 
    					
    					throw new IllegalArgumentException("Comando desconocido: ");
    					
    				}
    				solvedUnkowns.put(this.parameters.get(2), resultUnknown);
    			}
    		}
    	
    	}
    	public static String[][] solve(String[][] board) {
    		HashMap<String, Integer> solvedUnkowns = new HashMap<String, Integer>();
    		LinkedList<Operation> operations = new LinkedList<CrossMath.Operation>();
    		for (int row = 0; row < board.length; row += 2) {
    			ArrayList<String> parameters = new ArrayList<String>();
    			for (int col = 0; col < board.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]);
    				}
    			}
    		}
    		int cont = 0;
    		while (0 < operations.size()) {
    			Operation op = operations.pollFirst();
    			switch (op.unknownAmmount(solvedUnkowns)) {
    			case 0:
    				cont = 0;
    				break;
    			case 1:
    				op.calculateUnkown(solvedUnkowns);
    				cont = 0;
    				break;
    			default:
    				operations.addLast(op);
    				cont++;
    				break;
    			}
    			if (operations.size() <= cont) {
    				String[][] res = new String[5][5];
    				for(int i = 0; i < board.length; i++) {
    					for(int k = 0; k < board[i].length; k++) {
    						if(board[i][k].matches("[A-Z]")) {
    							res[i][k] = String.valueOf(solvedUnkowns.get(board[i][k]));
    						}else {
    							res[i][k] = board[i][k];
    						}
    					}
    				}
    				
    				return res;
    			}
    		}
    		return null;
    	}
    }
    • import java.util.ArrayList;
    • import java.util.HashMap;
    • import java.util.LinkedList;
    • import java.util.regex.Pattern;
    • public class CrossMath {
    • static class Operation {
    • 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/])$";
    • final String REGEX = "^([0-9]+)|([-+*/])$";
    • 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) {
    • for(int position=0;position<this.parameters.size();position++) {
    • String param = this.parameters.get(position);
    • if (solvedUnkowns.containsKey(param)) {
    • this.parameters.set(position, Integer.toString(solvedUnkowns.get(param)));
    • }
    • }
    • String resultVar = result;
    • if (solvedUnkowns.containsKey(resultVar)) {
    • result = Integer.toString(solvedUnkowns.get(resultVar));
    • }
    • if(result.matches("[A-Z]+")) {
    • int resultUnknown=0;
    • int resultUnknown;
    • int intParameter1 = Integer.parseInt(this.parameters.get(0));
    • int intParameter2 = Integer.parseInt(this.parameters.get(2));
    • switch(this.parameters.get(1)) {
    • case "+":
    • resultUnknown = Integer.parseInt(this.parameters.get(0))+Integer.parseInt(this.parameters.get(2));
    • resultUnknown = intParameter1+intParameter2;
    • break;
    • case "-":
    • resultUnknown = Integer.parseInt(this.parameters.get(0))-Integer.parseInt(this.parameters.get(2));
    • resultUnknown = intParameter1-intParameter2;
    • break;
    • case "*":
    • resultUnknown = Integer.parseInt(this.parameters.get(0))*Integer.parseInt(this.parameters.get(2));
    • resultUnknown = intParameter1*intParameter2;
    • break;
    • case "/":
    • resultUnknown = Integer.parseInt(this.parameters.get(0))/Integer.parseInt(this.parameters.get(2));
    • resultUnknown = intParameter1/intParameter2;
    • break;
    • default:
    • throw new IllegalArgumentException("Comando desconocido: ");
    • }
    • solvedUnkowns.put(result, resultUnknown);
    • }else if(this.parameters.get(0).matches("[A-Z]+")){
    • int resultUnknown=0;
    • int resultUnknown;
    • int intResult = Integer.parseInt(result);
    • int intParameter = Integer.parseInt(this.parameters.get(2));
    • switch(this.parameters.get(1)) {
    • case "+":
    • resultUnknown = Integer.parseInt(result)-Integer.parseInt(this.parameters.get(2));
    • resultUnknown = intResult-intParameter;
    • break;
    • case "-":
    • resultUnknown = Integer.parseInt(this.parameters.get(2))+Integer.parseInt(result);
    • resultUnknown = intParameter+intResult;
    • break;
    • case "*":
    • resultUnknown = Integer.parseInt(result)/Integer.parseInt(this.parameters.get(2));
    • resultUnknown = intResult/intParameter;
    • break;
    • case "/":
    • resultUnknown = Integer.parseInt(result)*Integer.parseInt(this.parameters.get(2));
    • resultUnknown = intResult*intParameter;
    • break;
    • default:
    • throw new IllegalArgumentException("Comando desconocido: ");
    • }
    • solvedUnkowns.put(this.parameters.get(0), resultUnknown);
    • }else if(this.parameters.get(2).matches("[A-Z]+")){
    • int resultUnknown=0;
    • int intResult = Integer.parseInt(result);
    • int intParameter = Integer.parseInt(this.parameters.get(0));
    • int resultUnknown;
    • switch(this.parameters.get(1)) {
    • case "+":
    • resultUnknown = Integer.parseInt(result)-Integer.parseInt(this.parameters.get(0));
    • resultUnknown = intResult-intParameter;
    • break;
    • case "-":
    • resultUnknown = Integer.parseInt(this.parameters.get(0))-Integer.parseInt(result);
    • resultUnknown = intParameter-intResult;
    • break;
    • case "*":
    • resultUnknown = Integer.parseInt(result)/Integer.parseInt(this.parameters.get(0));
    • resultUnknown = intResult/intParameter;
    • break;
    • case "/":
    • resultUnknown = Integer.parseInt(this.parameters.get(0))/Integer.parseInt(result);
    • resultUnknown = intParameter/intResult;
    • break;
    • default:
    • throw new IllegalArgumentException("Comando desconocido: ");
    • }
    • solvedUnkowns.put(this.parameters.get(2), resultUnknown);
    • }
    • }
    • }
    • public static String[][] solve(String[][] board) {
    • HashMap<String, Integer> solvedUnkowns = new HashMap<String, Integer>();
    • LinkedList<Operation> operations = new LinkedList<CrossMath.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++) {
    • for (int col = 0; col < board.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]);
    • }
    • }
    • }
    • int cont = 0;
    • while (0 < operations.size()) {
    • Operation op = operations.pollFirst();
    • switch (op.unknownAmmount(solvedUnkowns)) {
    • case 0:
    • cont = 0;
    • break;
    • case 1:
    • op.calculateUnkown(solvedUnkowns);
    • cont = 0;
    • break;
    • default:
    • operations.addLast(op);
    • cont++;
    • break;
    • }
    • if (operations.size() <= cont) {
    • String[][] res = new String[5][5];
    • for(int i = 0; i < board.length; i++) {
    • for(int k = 0; k < board[i].length; k++) {
    • if(board[i][k].matches("[A-Z]")) {
    • res[i][k] = String.valueOf(solvedUnkowns.get(board[i][k]));
    • }else {
    • res[i][k] = board[i][k];
    • }
    • }
    • }
    • return res;
    • }
    • }
    • return null;
    • }
    • }
Code
Diff
  • package com.cruci.cruci;
     
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.LinkedList;
    import java.util.regex.Pattern;
     
    public class CrossMath {
    	static class Operation {
    		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) {
    			for(int position=0;position<this.parameters.size();position++) {
    				String param = this.parameters.get(position);
    				if (solvedUnkowns.containsKey(param)) {
    				    this.parameters.set(position, Integer.toString(solvedUnkowns.get(param)));
    				}
    			}
    
    			String resultVar = result;
    			if (solvedUnkowns.containsKey(resultVar)) {
    			    result = Integer.toString(solvedUnkowns.get(resultVar));
    			}
    			
    			if(result.matches("[A-Z]+")) {
    				int resultUnknown=0;
    					switch(this.parameters.get(1)) {
    						case "+":
    							resultUnknown = Integer.parseInt(this.parameters.get(0))+Integer.parseInt(this.parameters.get(2));
    							break;
    						case "-":
    							resultUnknown = Integer.parseInt(this.parameters.get(0))-Integer.parseInt(this.parameters.get(2));
    							break;
    						case "*":
    							resultUnknown = Integer.parseInt(this.parameters.get(0))*Integer.parseInt(this.parameters.get(2));
    							break;
    						case "/":
    							resultUnknown = Integer.parseInt(this.parameters.get(0))/Integer.parseInt(this.parameters.get(2));
    							break;
    						default: 
    							throw new IllegalArgumentException("Comando desconocido: ");
    				}
    				solvedUnkowns.put(result, resultUnknown);
    			}else if(this.parameters.get(0).matches("[A-Z]+")){
    				int resultUnknown=0;
    				switch(this.parameters.get(1)) {
    				case "+":
    					resultUnknown = Integer.parseInt(result)-Integer.parseInt(this.parameters.get(2));
    					break;
    				case "-":
    					resultUnknown = Integer.parseInt(this.parameters.get(2))+Integer.parseInt(result);
    					break;
    				case "*":
    					resultUnknown = Integer.parseInt(result)/Integer.parseInt(this.parameters.get(2));
    					break;
    				case "/":
    					resultUnknown = Integer.parseInt(result)*Integer.parseInt(this.parameters.get(2));
    					break;
    				default: 
    					throw new IllegalArgumentException("Comando desconocido: ");
    				}
    				solvedUnkowns.put(this.parameters.get(0), resultUnknown);
    			}else if(this.parameters.get(2).matches("[A-Z]+")){
    				int resultUnknown=0;
    				switch(this.parameters.get(1)) {
    				case "+":
    					resultUnknown = Integer.parseInt(result)-Integer.parseInt(this.parameters.get(0));
    					break;
    				case "-":
    					resultUnknown = Integer.parseInt(this.parameters.get(0))-Integer.parseInt(result);
    					break;
    				case "*":
    					resultUnknown = Integer.parseInt(result)/Integer.parseInt(this.parameters.get(0));
    					break;
    				case "/":
    					resultUnknown = Integer.parseInt(this.parameters.get(0))/Integer.parseInt(result);
    					break;
    				default: 
    					throw new IllegalArgumentException("Comando desconocido: ");
    				}
    				solvedUnkowns.put(this.parameters.get(2), resultUnknown);
    			}
    		}
    	
    	}
    	public static String[][] solve(String[][] board) {
    		HashMap<String, Integer> solvedUnkowns = new HashMap<String, Integer>();
    		LinkedList<Operation> operations = new LinkedList<CrossMath.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]);
    				}
    			}
    		}
    		int cont = 0;
    		while (0 < operations.size()) {
    			Operation op = operations.pollFirst();
    			switch (op.unknownAmmount(solvedUnkowns)) {
    			case 0:
    				cont = 0;
    				break;
    			case 1:
    				op.calculateUnkown(solvedUnkowns);
    				cont = 0;
    				break;
    			default:
    				operations.addLast(op);
    				cont++;
    				break;
    			}
    			if (operations.size() <= cont) {
    				String[][] res = new String[5][5];
    				for(int i = 0; i < board.length; i++) {
    					for(int k = 0; k < board[i].length; k++) {
    						if(board[i][k].matches("[A-Z]")) {
    							res[i][k] = String.valueOf(solvedUnkowns.get(board[i][k]));
    						}else {
    							res[i][k] = board[i][k];
    						}
    					}
    				}
    				
    				return res;
    			}
    		}
    		return null;
    	}
    }
    • package com.cruci.cruci;
    • import java.util.ArrayList;
    • import java.util.HashMap;
    • import java.util.LinkedList;
    • import java.util.regex.Pattern;
    • class Crossword {
    • public class CrossMath {
    • 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) {
    • for(int position=0;position<this.parameters.size();position++) {
    • String param = this.parameters.get(position);
    • if (solvedUnkowns.containsKey(param)) {
    • this.parameters.set(position, Integer.toString(solvedUnkowns.get(param)));
    • }
    • }
    • String resultVar = result;
    • if (solvedUnkowns.containsKey(resultVar)) {
    • result = Integer.toString(solvedUnkowns.get(resultVar));
    • }
    • 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)) {
    • int resultUnknown=0;
    • switch(this.parameters.get(1)) {
    • case "+":
    • resultUnknown+=Integer.parseInt(this.parameters.get(operador+1));
    • resultUnknown = Integer.parseInt(this.parameters.get(0))+Integer.parseInt(this.parameters.get(2));
    • break;
    • case "-":
    • resultUnknown-=Integer.parseInt(this.parameters.get(operador+1));
    • resultUnknown = Integer.parseInt(this.parameters.get(0))-Integer.parseInt(this.parameters.get(2));
    • break;
    • case "*":
    • resultUnknown*=Integer.parseInt(this.parameters.get(operador+1));
    • resultUnknown = Integer.parseInt(this.parameters.get(0))*Integer.parseInt(this.parameters.get(2));
    • break;
    • case "/":
    • resultUnknown/=Integer.parseInt(this.parameters.get(operador+1));
    • resultUnknown = Integer.parseInt(this.parameters.get(0))/Integer.parseInt(this.parameters.get(2));
    • 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;
    • }else if(this.parameters.get(0).matches("[A-Z]+")){
    • int resultUnknown=0;
    • switch(this.parameters.get(1)) {
    • case "+":
    • resultUnknown = Integer.parseInt(result)-Integer.parseInt(this.parameters.get(2));
    • break;
    • case "-":
    • resultUnknown = Integer.parseInt(this.parameters.get(2))+Integer.parseInt(result);
    • break;
    • case "*":
    • resultUnknown = Integer.parseInt(result)/Integer.parseInt(this.parameters.get(2));
    • break;
    • case "/":
    • resultUnknown = Integer.parseInt(result)*Integer.parseInt(this.parameters.get(2));
    • break;
    • default:
    • throw new IllegalArgumentException("Comando desconocido: ");
    • }
    • solvedUnkowns.put(this.parameters.get(0), resultUnknown);
    • }else if(this.parameters.get(2).matches("[A-Z]+")){
    • int resultUnknown=0;
    • switch(this.parameters.get(1)) {
    • case "+":
    • resultUnknown = Integer.parseInt(result)-Integer.parseInt(this.parameters.get(0));
    • break;
    • case "-":
    • resultUnknown = Integer.parseInt(this.parameters.get(0))-Integer.parseInt(result);
    • break;
    • case "*":
    • resultUnknown = Integer.parseInt(result)/Integer.parseInt(this.parameters.get(0));
    • break;
    • case "/":
    • resultUnknown = Integer.parseInt(this.parameters.get(0))/Integer.parseInt(result);
    • break;
    • default:
    • throw new IllegalArgumentException("Comando desconocido: ");
    • }
    • 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");
    • solvedUnkowns.put(this.parameters.get(2), resultUnknown);
    • }
    • }
    • 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) {
    • }
    • public static String[][] solve(String[][] board) {
    • HashMap<String, Integer> solvedUnkowns = new HashMap<String, Integer>();
    • LinkedList<Operation> operations = new LinkedList<Crossword.Operation>();
    • LinkedList<Operation> operations = new LinkedList<CrossMath.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;
    • String[][] res = new String[5][5];
    • for(int i = 0; i < board.length; i++) {
    • for(int k = 0; k < board[i].length; k++) {
    • if(board[i][k].matches("[A-Z]")) {
    • res[i][k] = String.valueOf(solvedUnkowns.get(board[i][k]));
    • }else {
    • res[i][k] = board[i][k];
    • }
    • }
    • }
    • return res;
    • }
    • }
    • return solvedUnkowns;
    • return null;
    • }