Advertisement
Guest User

Untitled

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