Advertisement
Guest User

Untitled

a guest
Jul 19th, 2018
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.34 KB | None | 0 0
  1. import java.util.List;
  2. import java.util.ArrayList;
  3. import java.util.Map;
  4. import java.util.HashMap;
  5. import java.util.Map.Entry;
  6. import java.util.regex.Matcher;
  7. import java.util.regex.Pattern;
  8.  
  9. public class Runes {
  10. private static final int DECIMAL_DIGITS_TOTAL = 9;
  11.  
  12. private static final Pattern REGEXP = Pattern.compile("(-?[\\d?]+)([+\\-*]{1})(-?[\\d?]+)(=-?[\\d?]+)");
  13. public static Runes rune = new Runes();
  14.  
  15. public static int solveExpression(final String expression) {
  16. Term t1 = obtainTerm(1, expression);
  17. Character operation = obtainOperation(expression);
  18. Term t2 = obtainTerm(2, expression);
  19. Term result = obtainResult(expression);
  20. Matcher m = REGEXP.matcher(expression);
  21. List<Integer> digitsToCheck = getDigitsToCheck(expression);
  22. System.out.println(t1);
  23. System.out.println(operation);
  24. System.out.println(t2);
  25. System.out.println(result);
  26. switch (operation) {
  27. case '+':
  28. for (Integer integer : digitsToCheck) {
  29. if (constructNumber(t1, integer) + constructNumber(t2, integer) == constructNumber(result, integer)) {
  30. return integer;
  31. }
  32. }
  33. break;
  34. case '-':
  35. for (Integer integer : digitsToCheck) {
  36. if (constructNumber(t1, integer) - constructNumber(t2, integer) == constructNumber(result, integer)) {
  37. return integer;
  38. }
  39. }
  40. break;
  41. case '*':
  42. for (Integer integer : digitsToCheck) {
  43. if (constructNumber(t1, integer) * constructNumber(t2, integer) == constructNumber(result, integer)) {
  44. return integer;
  45. }
  46. }
  47. break;
  48. default:
  49. break;
  50. }
  51. return -1;
  52. }
  53.  
  54. private static Term obtainResult(String expression) {
  55. Matcher matcher = REGEXP.matcher(expression);
  56. if (matcher.find()) {
  57. return rune.new Term(matcher.group(4).substring(1));
  58. }
  59. return null;
  60. }
  61.  
  62. private static Character obtainOperation(String expression) {
  63. Matcher matcher = REGEXP.matcher(expression);
  64. if (matcher.find()) {
  65. return matcher.group(2).charAt(0);
  66. }
  67. return null;
  68. }
  69.  
  70. private static Term obtainTerm(int i, String expression) {
  71. Matcher matcher = REGEXP.matcher(expression);
  72. if (matcher.find()) {
  73. if (i == 1) {
  74. return rune.new Term(matcher.group(i));
  75. }
  76. if (i == 2) {
  77. return rune.new Term(matcher.group(3));
  78. }
  79.  
  80. }
  81. return null;
  82.  
  83. }
  84. public static void main(String[] s){
  85. String expr = "-??*?=-99";
  86. System.out.println(solveExpression(expr));
  87. }
  88.  
  89. private static int constructNumber(Term term, int digit) {
  90. int result = 0;
  91.  
  92. for (Integer integer : term.digits.keySet()) {
  93. if (term.digits.get(integer) != null) {
  94. result += (int) Math.pow(10, integer) * term.digits.get(integer);
  95. } else {
  96. result += (int) Math.pow(10, integer) * digit;
  97. }
  98. }
  99. if(term.isNegative){
  100. result*=-1;
  101. }
  102. return result;
  103. }
  104.  
  105. private static List<Integer> getDigitsToCheck(String expression) {
  106. List<Integer> digitsToCheck = new ArrayList<>();
  107. for (int i = 0; i <= DECIMAL_DIGITS_TOTAL; i++) {
  108. if (!expression.contains(Integer.toString(i))) {
  109. digitsToCheck.add(i);
  110. }
  111. }
  112. for (int i = 0; i < expression.length() - 1; i++) {
  113. if (expression.charAt(i) == '?' && expression.charAt(i + 1) == '?') {
  114. digitsToCheck.remove(Integer.valueOf(0));
  115. }
  116. }
  117. return digitsToCheck;
  118. }
  119.  
  120. private static int getNumber(String numberString) {
  121. int result = 0;
  122. for (int i = 0; i < numberString.length(); i++) {
  123. if (Character.getNumericValue(numberString.charAt(i)) > 0) {
  124. result += Character.getNumericValue(numberString.charAt(i)) * Math.pow(10, numberString.length() - i - 1);
  125. } else {
  126. return -1;
  127. }
  128. }
  129. return result;
  130. }
  131.  
  132. private class Term {
  133. private Integer numericValue = 0;
  134. private int length;
  135. private Map<Integer, Integer> digits;
  136. private List<Integer> questionableDigits = new ArrayList<>();
  137. private boolean isNegative;
  138.  
  139. Term(String number) {
  140. this.length = number.length();
  141. isNegative = number.charAt(0) == '-';
  142. digits = obtainDigits(number);
  143. estimateNumericValue();
  144. }
  145.  
  146. void estimateNumericValue() {
  147. digits.forEach((k, v) -> {
  148. if (v == null) {
  149. questionableDigits.add(k);
  150. } else {
  151. numericValue += (int) Math.pow(10, k) * v;
  152. }
  153. });
  154. if (isNegative) {
  155. numericValue *= -1;
  156. }
  157. }
  158.  
  159. @Override
  160. public String toString() {
  161. return "Term{" +
  162. "numericValue=" + numericValue +
  163. ", length=" + length +
  164. ", digits=" + digits +
  165. ", questionableDigits=" + questionableDigits +
  166. ", isNegative=" + isNegative +
  167. '}';
  168. }
  169.  
  170. Map<Integer, Integer> obtainDigits(String numberString) {
  171. Map<Integer, Integer> result = new HashMap<>();
  172. for (int i = 0; i < numberString.length(); i++) {
  173. if (Character.getNumericValue(numberString.charAt(i)) >= 0) {
  174. result.put(numberString.length() - i - 1, Character.getNumericValue(numberString.charAt(i)));
  175. } else {
  176. if(numberString.charAt(i)=='-'){
  177. continue;
  178. }
  179. result.put(numberString.length() - i - 1, null);
  180. }
  181. }
  182. return result;
  183. }
  184.  
  185. }
  186. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement