Advertisement
desislava_topuzakova

05. Nether Realms

Nov 20th, 2022
373
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.66 KB | None | 0 0
  1. package RegularExpressions.Exercises;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.IOException;
  5. import java.io.InputStreamReader;
  6. import java.util.*;
  7. import java.util.regex.Matcher;
  8. import java.util.regex.Pattern;
  9.  
  10. public class NetherRealms_06 {
  11.  
  12. public static void main(String[] args) throws IOException {
  13. BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
  14.  
  15. String input = reader.readLine();
  16. Map<String, Double> demons = new LinkedHashMap<>();
  17. Map<String, Double> demonsDamage = new HashMap<>();
  18. String[] eachDemon = input.split("[,\\s]+");
  19.  
  20. if (input.isEmpty()) return;
  21.  
  22. for (String demonName : eachDemon) {
  23. demons.putIfAbsent(demonName, 0d);
  24. demonsDamage.putIfAbsent(demonName, 0d);
  25.  
  26. double health = addDemonHealth(demonName);
  27. double dmg = addDamage(demonName);
  28.  
  29. demons.put(demonName, health);
  30. demonsDamage.put(demonName, dmg);
  31. }
  32.  
  33. demons
  34. .entrySet()
  35. .stream()
  36. .sorted(Comparator.comparing(Map.Entry::getKey))
  37. .forEach(value -> {
  38. double dmg = demonsDamage.get(value.getKey());
  39. System.out.printf("%s - %.0f health, %.2f damage%n",
  40. value.getKey(), value.getValue(), dmg);
  41. });
  42.  
  43. }
  44.  
  45. private static double addDamage(String demon) {
  46. double sum = 0d;
  47. Pattern findDmg = Pattern.compile("(\\+{1}|\\-{1}(?=\\d))?\\d+\\.?\\d*");
  48. String[] arithmetic = demon.split("[^/*]+");
  49.  
  50. // [-+.0-9]+
  51. Matcher digits = findDmg.matcher(demon);
  52. while (digits.find()) {
  53. double digit = Double.parseDouble(digits.group());
  54. sum += digit;
  55. }
  56.  
  57. for (String arithmeticSignCluster : arithmetic) {
  58. char[] arithmeticSigns = arithmeticSignCluster.toCharArray();
  59. for (char sign : arithmeticSigns) {
  60. if (sign == '*') {
  61. sum *= 2;
  62. } else if (sign == '/') {
  63. sum /= 2;
  64. }
  65. }
  66. }
  67.  
  68. return sum;
  69. }
  70.  
  71. private static double addDemonHealth(String demon) {
  72. double sum = 0d;
  73. Pattern pattern = Pattern.compile("[^0-9+\\-*/.]");
  74. Matcher matcher = pattern.matcher(demon);
  75.  
  76.  
  77. while (matcher.find()) {
  78. char match = matcher.group().charAt(0);
  79. sum += match;
  80. }
  81.  
  82. return sum;
  83. }
  84. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement