Advertisement
Guest User

Untitled

a guest
Jun 16th, 2022
213
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.94 KB | None | 0 0
  1. import java.io.BufferedReader;
  2. import java.io.IOException;
  3. import java.io.InputStreamReader;
  4. import java.nio.charset.StandardCharsets;
  5. import java.util.LinkedHashMap;
  6. import java.util.TreeMap;
  7. import java.util.function.BiConsumer;
  8. import java.util.function.Function;
  9. import java.util.regex.Matcher;
  10. import java.util.regex.Pattern;
  11. import java.util.stream.Collector;
  12. import java.util.stream.Collectors;
  13.  
  14. public class DragonArmy {
  15.     private static final Pattern DRAGON_PATTERN =
  16.             Pattern.compile("^(?<type>.+)\\s+(?<name>.+)\\s+(?<damage>.+)\\s+(?<health>.+)\\s+(?<armor>.+)$");
  17.  
  18.     public static void main(String[] args) throws IOException {
  19.         final BufferedReader reader = new BufferedReader(new InputStreamReader(System.in, StandardCharsets.UTF_8));
  20.  
  21.         reader.lines()
  22.                 .limit(Long.parseLong(reader.readLine()))
  23.                 .sequential()
  24.                 .map(DRAGON_PATTERN::matcher)
  25.                 .filter(Matcher::matches)
  26.                 .map(matcherToDragon())
  27.                 .collect(dragonsCollector())
  28.                 .forEach(dragonsGroupConsolePrinter());
  29.     }
  30.  
  31.     private static Function<Matcher, Dragon> matcherToDragon() {
  32.         final String NULL_STR = "null";
  33.         return matcher -> {
  34.             final String type = matcher.group("type");
  35.             final String name = matcher.group("name");
  36.             final String damageStr = matcher.group("damage");
  37.             final String healthStr = matcher.group("health");
  38.             final String armorStr = matcher.group("armor");
  39.             final int damage = NULL_STR.equals(damageStr) ? 45 : Integer.parseInt(damageStr);
  40.             final int health = NULL_STR.equals(healthStr) ? 250 : Integer.parseInt(healthStr);
  41.             final int armor = NULL_STR.equals(armorStr) ? 10 : Integer.parseInt(armorStr);
  42.             return new Dragon(type, name, damage, health, armor);
  43.         };
  44.     }
  45.  
  46.     private static Collector<Dragon, ?, LinkedHashMap<String, TreeMap<String, Dragon>>> dragonsCollector() {
  47.         return Collectors.groupingBy(
  48.                 dragon -> dragon.type,
  49.                 LinkedHashMap::new,
  50.                 Collectors.collectingAndThen(Collectors.toList(),
  51.                         dragonsList -> dragonsList.stream()
  52.                                 .sequential()
  53.                                 .collect(Collectors.toMap(dragon -> dragon.name,
  54.                                         Function.identity(),
  55.                                         (existing, replacement) -> replacement,
  56.                                         TreeMap::new)
  57.                                 )
  58.                 )
  59.         );
  60.     }
  61.  
  62.     private static BiConsumer<String, TreeMap<String, Dragon>> dragonsGroupConsolePrinter() {
  63.         return (type, dragons) -> {
  64.             final double averageDamage = dragons.values().stream().mapToDouble(d -> d.damage).average().orElse(0.0);
  65.             final double averageHealth = dragons.values().stream().mapToDouble(d -> d.health).average().orElse(0.0);
  66.             final double averageArmor = dragons.values().stream().mapToDouble(d -> d.armor).average().orElse(0.0);
  67.             System.out.printf("%s::(%.2f/%.2f/%.2f)%n", type, averageDamage, averageHealth, averageArmor);
  68.             dragons.values().forEach(dragon ->
  69.                     System.out.printf("-%s -> damage: %d, health: %d, armor: %d%n",
  70.                             dragon.name, dragon.damage, dragon.health, dragon.armor));
  71.         };
  72.     }
  73.  
  74.     private static final class Dragon {
  75.         private final String type;
  76.         private final String name;
  77.         private final int damage;
  78.         private final int health;
  79.         private final int armor;
  80.  
  81.         public Dragon(String type, String name, int damage, int health, int armor) {
  82.             this.type = type;
  83.             this.name = name;
  84.             this.damage = damage;
  85.             this.health = health;
  86.             this.armor = armor;
  87.         }
  88.     }
  89. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement