diff options
| author | Martial Simon <msimon_fr@hotmail.com> | 2025-09-15 01:08:27 +0200 |
|---|---|---|
| committer | Martial Simon <msimon_fr@hotmail.com> | 2025-09-15 01:08:27 +0200 |
| commit | c9b6b9a5ca082fe7c1b6f58d7713f785a9eb6a5c (patch) | |
| tree | 3e4f42f93c7ae89a364e4d51fff6e5cec4e55fa9 /graphs/java/nucBattle | |
add: graphs et rushs
Diffstat (limited to 'graphs/java/nucBattle')
11 files changed, 493 insertions, 0 deletions
diff --git a/graphs/java/nucBattle/.gitignore b/graphs/java/nucBattle/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/graphs/java/nucBattle/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store
\ No newline at end of file diff --git a/graphs/java/nucBattle/pom.xml b/graphs/java/nucBattle/pom.xml new file mode 100644 index 0000000..2ce959c --- /dev/null +++ b/graphs/java/nucBattle/pom.xml @@ -0,0 +1,150 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + <groupId>fr.epita.assistants</groupId> + <artifactId>nucBattle</artifactId> + <version>1.0</version> + + <properties> + <versions.java>21</versions.java> + <versions.junit>5.9.1</versions.junit> + <versions.maven-compiler-plugin>3.13.0</versions.maven-compiler-plugin> + <versions.maven-surefire-plugin>3.5.0</versions.maven-surefire-plugin> + <versions.maven-jar-plugin>3.1.1</versions.maven-jar-plugin> + <versions.maven-install-plugin>3.1.0</versions.maven-install-plugin> + + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + + <surefire.reportsDirectory>${project.build.directory}/surefire-reports</surefire.reportsDirectory> + </properties> + + <dependencies> + <dependency> + <groupId>org.projectlombok</groupId> + <artifactId>lombok</artifactId> + <version>1.18.30</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>org.junit.jupiter</groupId> + <artifactId>junit-jupiter</artifactId> + <version>${versions.junit}</version> + </dependency> + <dependency> + <groupId>com.fasterxml.jackson.core</groupId> + <artifactId>jackson-core</artifactId> + <version>2.18.0</version> + </dependency> + <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind --> + <dependency> + <groupId>com.fasterxml.jackson.core</groupId> + <artifactId>jackson-databind</artifactId> + <version>2.18.0</version> + </dependency> + <dependency> + <groupId>org.apache.maven.surefire</groupId> + <artifactId>surefire-junit-platform</artifactId> + <version>${versions.maven-surefire-plugin}</version> + </dependency> + <dependency> + <groupId>org.apache.maven</groupId> + <artifactId>maven-compat</artifactId> + <version>3.9.8</version> + </dependency> + <dependency> + <groupId>org.apache.maven</groupId> + <artifactId>maven-plugin-api</artifactId> + <version>3.9.8</version> + </dependency> + <dependency> + <groupId>org.apache.maven</groupId> + <artifactId>maven-project</artifactId> + <version>2.2.1</version> + </dependency> + <dependency> + <groupId>org.apache.maven</groupId> + <artifactId>maven-core</artifactId> + <version>3.8.1</version> + </dependency> + <dependency> + <groupId>org.apache.maven</groupId> + <artifactId>maven-monitor</artifactId> + <version>2.2.1</version> + </dependency> + <dependency> + <groupId>org.codehaus.plexus</groupId> + <artifactId>plexus-utils</artifactId> + <version>3.0.24</version> + </dependency> + <dependency> + <groupId>org.apache.maven.shared</groupId> + <artifactId>maven-filtering</artifactId> + <version>3.3.2</version> + </dependency> + <dependency> + <groupId>org.codehaus.plexus</groupId> + <artifactId>plexus-interpolation</artifactId> + <version>1.13</version> + </dependency> + <dependency> + <groupId>org.apache.maven</groupId> + <artifactId>maven-profile</artifactId> + <version>2.2.1</version> + </dependency> + <dependency> + <groupId>org.apache.maven</groupId> + <artifactId>maven-artifact-manager</artifactId> + <version>2.2.1</version> + </dependency> + <dependency> + <groupId>org.apache.maven</groupId> + <artifactId>maven-plugin-registry</artifactId> + <version>2.2.1</version> + </dependency> + <dependency> + <groupId>org.apache.maven</groupId> + <artifactId>maven-repository-metadata</artifactId> + <version>2.2.1</version> + </dependency> + <dependency> + <groupId>classworlds</groupId> + <artifactId>classworlds</artifactId> + <version>1.1</version> + </dependency> + <dependency> + <groupId>org.junit.platform</groupId> + <artifactId>junit-platform-commons</artifactId> + <version>1.9.3</version> + </dependency> + </dependencies> + + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + <version>${versions.maven-compiler-plugin}</version> + <configuration> + <source>${versions.java}</source> + <target>${versions.java}</target> + </configuration> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-install-plugin</artifactId> + <version>${versions.maven-install-plugin}</version> + </plugin> + + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-surefire-plugin</artifactId> + <version>${versions.maven-surefire-plugin}</version> + <configuration> + <reportsDirectory>${surefire.reportsDirectory}</reportsDirectory> + </configuration> + </plugin> + </plugins> + </build> +</project> diff --git a/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Battle.java b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Battle.java new file mode 100644 index 0000000..35a9b3e --- /dev/null +++ b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Battle.java @@ -0,0 +1,18 @@ +package fr.epita.assistants.nucbattle; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Getter +@AllArgsConstructor +@NoArgsConstructor +public class Battle { + @JsonProperty("battle_id") + private int battleId; + + private List<Turn> turns; +} diff --git a/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/BattleManager.java b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/BattleManager.java new file mode 100644 index 0000000..57d7dcc --- /dev/null +++ b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/BattleManager.java @@ -0,0 +1,101 @@ +package fr.epita.assistants.nucbattle; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.module.SimpleModule; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.HashMap; +import java.util.Map; +import java.util.stream.Stream; + +public class BattleManager { + String input; + private Map<String, Nuc> nucs; + private Battle battle; + + public BattleManager(String input) { + this.input = input; + } + + public void computeBattle(String reportPath) { + Report report = new Report(); + try (Stream<String> stream = Files.lines(Paths.get(input))) { + String jsonString = stream.reduce("", (s1, s2) -> s1 + s2); + ObjectMapper om = new ObjectMapper(); + JsonNode jn = om.readTree(jsonString); + if (jn == null || jn.isNull()) { + report.setType(ReportType.ERROR); + exportReport(reportPath, report); + } + nucs = om.readValue(jn.get("NUCs").toString(), new TypeReference<Map<String, Nuc>>() { + }); + + SimpleModule mod = new SimpleModule(); + mod.addDeserializer(Turn.class, new TurnDeserializer(nucs)); + om.registerModule(mod); + battle = om.readValue(jn.get("battle").toString(), Battle.class); + // winner pre-check + for (String t : nucs.keySet()) { + if (nucs.keySet().stream().filter(login -> !t.equals(login)).allMatch(login -> nucs.get(login).getHp() == 0.0)) { + report.setType(ReportType.WINNER); + report.setPlayer(t); + exportReport(reportPath, report); + return; + } + nucs.computeIfPresent(t, (k, tmp) -> new Nuc(tmp.getName(), Math.clamp(tmp.getHp(), 0, 100), tmp.getInstalledPrograms())); + } + for (Turn t : battle.getTurns()) { + if (nucs.get(t.getPlayerLogin()) == null || nucs.get(t.getTargetLogin()) == null) { + report.setType(ReportType.ERROR); + exportReport(reportPath, report); + return; + } + // cheater check + if (!t.getPlayerNuc().getInstalledPrograms().containsAll(t.getPacket().getUsedPrograms())) { + report.setType(ReportType.CHEATER); + report.setPlayer(t.getPlayerLogin()); + exportReport(reportPath, report); + return; + } + // swap nukes to update damage + Nuc n = nucs.get(t.getTargetLogin()); + Nuc tmp = new Nuc(n.getName(), Math.clamp(n.getHp() - t.getPacket().getDamage(), 0, 100), + n.getInstalledPrograms()); + nucs.put(t.getTargetLogin(), tmp); + + // winner check + if (nucs.keySet().stream().filter(login -> !t.getPlayerLogin().equals(login)).allMatch(login -> nucs.get(login).getHp() == 0.0)) { + report.setType(ReportType.WINNER); + report.setPlayer(t.getPlayerLogin()); + exportReport(reportPath, report); + return; + } + } + report.setType(ReportType.UNFINISHED); + exportReport(reportPath, report); + } catch (IOException e) { + report.setType(ReportType.ERROR); + exportReport(reportPath, report); + } + } + + private void exportReport(String reportPath, Report report) { + if (report.getType() != ReportType.ERROR && report.getType() != ReportType.CHEATER) { + report.outcome = new HashMap<>(); + for (String login : nucs.keySet()) { + report.outcome.put(login, nucs.get(login).getHp()); + } + } + ObjectMapper om = new ObjectMapper(); + try { + om.writeValue(new File(reportPath), report); + } catch (IOException e) { + throw new RuntimeException(e); + } + } +}
\ No newline at end of file diff --git a/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Nuc.java b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Nuc.java new file mode 100644 index 0000000..e2e4a48 --- /dev/null +++ b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Nuc.java @@ -0,0 +1,20 @@ +package fr.epita.assistants.nucbattle; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Getter +@AllArgsConstructor +@NoArgsConstructor +public class Nuc { + private String name; + + private float hp; + + @JsonProperty("installed_programs") + private List<String> installedPrograms; +} diff --git a/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Packet.java b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Packet.java new file mode 100644 index 0000000..e8806f7 --- /dev/null +++ b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Packet.java @@ -0,0 +1,20 @@ +package fr.epita.assistants.nucbattle; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Getter +@AllArgsConstructor +@NoArgsConstructor +public class Packet { + @JsonProperty("used_programs") + private List<String> usedPrograms; + + private String command; + + private float damage; +} diff --git a/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Report.java b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Report.java new file mode 100644 index 0000000..56aa10d --- /dev/null +++ b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Report.java @@ -0,0 +1,18 @@ +package fr.epita.assistants.nucbattle; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.util.Map; + +@NoArgsConstructor +@Getter +@Setter +@JsonInclude(JsonInclude.Include.NON_NULL) +public class Report { + ReportType type = ReportType.UNFINISHED; + String player = null; + Map<String, Float> outcome = null; +} diff --git a/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/ReportType.java b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/ReportType.java new file mode 100644 index 0000000..c643c1b --- /dev/null +++ b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/ReportType.java @@ -0,0 +1,14 @@ +package fr.epita.assistants.nucbattle; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +public enum ReportType { + @JsonProperty("winner") + WINNER, + @JsonProperty("cheater") + CHEATER, + @JsonProperty("error") + ERROR, + @JsonProperty("unfinished") + UNFINISHED; +} diff --git a/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Turn.java b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Turn.java new file mode 100644 index 0000000..57e44dc --- /dev/null +++ b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Turn.java @@ -0,0 +1,18 @@ +package fr.epita.assistants.nucbattle; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@AllArgsConstructor +@NoArgsConstructor +@Getter +public class Turn { + private Nuc playerNuc; + private String playerLogin; + + private Nuc targetNuc; + private String targetLogin; + + private Packet packet; +} diff --git a/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/TurnDeserializer.java b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/TurnDeserializer.java new file mode 100644 index 0000000..bfd60ba --- /dev/null +++ b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/TurnDeserializer.java @@ -0,0 +1,30 @@ +package fr.epita.assistants.nucbattle; + +import com.fasterxml.jackson.core.JacksonException; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; + +import java.io.IOException; +import java.util.Map; + +public class TurnDeserializer extends JsonDeserializer<Turn> { + public TurnDeserializer(Map<String, Nuc> nucs) { + this.nucs = nucs; + } + + Map<String, Nuc> nucs; + @Override + public Turn deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JacksonException { + JsonNode node = jsonParser.getCodec().readTree(jsonParser); + String player_login = node.get("player_login").asText(); + String target_login = node.get("target_login").asText(); + + final ObjectMapper om = new ObjectMapper(); + Packet packet = om.readValue(node.get("packet").toString(), Packet.class); + return new Turn(nucs.get(player_login), player_login, nucs.get(target_login), target_login, packet); + } +} diff --git a/graphs/java/nucBattle/src/main/resources/exampleBattle1.json b/graphs/java/nucBattle/src/main/resources/exampleBattle1.json new file mode 100644 index 0000000..3d541dd --- /dev/null +++ b/graphs/java/nucBattle/src/main/resources/exampleBattle1.json @@ -0,0 +1,66 @@ +{ + "NUCs": { + "xavier.login": { + "name": "r01p02", + "hp": 50.0, + "installed_programs": [ + "yes", + "grep", + "pkill", + "ping", + "bash" + ] + }, + "xavier.login2": { + "name": "r04p03", + "hp": 72.0, + "installed_programs": [ + "find", + "cp", + "bash", + "wget" + ] + } + }, + "battle": { + "battle_id": 9876, + "turns": [ + { + "player_login": "xavier.prout", + "target_login": "xavier.login2", + "packet": { + "used_programs": [ + "bash", + "yes" + ], + "command": "yes > ~/y", + "damage": 51.0 + } + }, + { + "player_login": "xavier.login2", + "target_login": "xavier.login", + "packet": { + "used_programs": [ + "bash", + "cp", + "find" + ], + "command": "find / -type f -exec cp {} /tmp/ \\;", + "damage": 21.0 + } + }, + { + "player_login": "xavier.login", + "target_login": "xavier.login2", + "packet": { + "used_programs": [ + "bash" + ], + "command": ":(){:|: &};:", + "damage": 32.0 + } + } + ] + } +} |
