Advertisement
icdef

Untitled

Dec 6th, 2024 (edited)
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 7.76 KB | Help | 0 0
  1. package day6;
  2.  
  3. import java.io.File;
  4. import java.io.FileNotFoundException;
  5. import java.util.ArrayList;
  6. import java.util.Arrays;
  7. import java.util.List;
  8. import java.util.Scanner;
  9.  
  10. public class Main {
  11.  
  12.     public static void main(String[] args) throws FileNotFoundException {
  13.         File inputFile = new File("input-data/day6.txt");
  14.         Scanner scanner = new Scanner(inputFile);
  15.         List<char[]> field = new ArrayList<>();
  16.         while (scanner.hasNextLine()) {
  17.             field.add(scanner.nextLine().toCharArray());
  18.         }
  19.         Guard guard = new Guard();
  20.         Guard oldGuard = new Guard();
  21.         Guard startGuard = new Guard();
  22.         // get guard position
  23.         for (int i = 0; i < field.size(); i++) {
  24.             for (int j = 0; j < field.get(i).length; j++) {
  25.                 if (field.get(i)[j] == '^') {
  26.                     guard.x = j;
  27.                     guard.y = i;
  28.                     oldGuard.y = i;
  29.                     oldGuard.x = j;
  30.                     startGuard.x = j;
  31.                     startGuard.y = i;
  32.                 }
  33.             }
  34.         }
  35.  
  36.         boolean[][] visited = new boolean[field.size()][field.size()];
  37.  
  38.         long maxSteps = (long) field.size() * field.size();
  39.         boolean turned;
  40.         int count = 0;
  41.         List<Guard> blockPositions = new ArrayList<>();
  42.         while (true) {
  43.             oldGuard.y = guard.y;
  44.             oldGuard.x = guard.x;
  45.             oldGuard.moveDirection = guard.moveDirection;
  46.             guard.move();
  47.             if (guard.x < 0 || guard.x >= field.getFirst().length ||
  48.                     guard.y < 0 || guard.y >= field.size()) {
  49.                 if (visited[oldGuard.y][oldGuard.x]) {
  50.                     field.get(oldGuard.y)[oldGuard.x] = '+';
  51.                 } else {
  52.                     field.get(oldGuard.y)[oldGuard.x] = guard.getMoveChar();
  53.                 }
  54.                 drawField(field);
  55.                 break;
  56.             }
  57.             if (field.get(guard.y)[guard.x] == '#') {
  58.                 guard.x = oldGuard.x;
  59.                 guard.y = oldGuard.y;
  60.                 guard.changeDirection();
  61.                 turned = true;
  62.             } else {
  63.                 if (visited[oldGuard.y][oldGuard.x]) {
  64.                     field.get(oldGuard.y)[oldGuard.x] = '+';
  65.                 } else {
  66.                     field.get(oldGuard.y)[oldGuard.x] = guard.getMoveChar();
  67. //                field.get(oldGuard.y)[oldGuard.x] = 'X';
  68.                 }
  69.                 turned = false;
  70.             }
  71.             if (!turned) {
  72.                 field.get(guard.y)[guard.x] = guard.lookCorrectSide();
  73.                 Guard ghost = new Guard(oldGuard.x, oldGuard.y, oldGuard.moveDirection);
  74.                 Guard oldGhostCopy = new Guard(oldGuard.x, oldGuard.y, oldGuard.moveDirection);
  75.                 ghost.changeDirection();
  76.                 ghost.move();
  77.                 int steps = 0;
  78.                 while (ghost.x != oldGuard.x || ghost.y != oldGuard.y) {
  79.                     if (steps > maxSteps)
  80.                         break;
  81.                     if (ghost.x < 0 || ghost.x >= field.getFirst().length ||
  82.                             ghost.y < 0 || ghost.y >= field.size())
  83.                         break;
  84.  
  85.                     if (field.get(ghost.y)[ghost.x] == '#') {
  86.                         ghost.y = oldGhostCopy.y;
  87.                         ghost.x = oldGhostCopy.x;
  88.                         ghost.changeDirection();
  89.                     }
  90.                     else {
  91.                         oldGhostCopy.y = ghost.y;
  92.                         oldGhostCopy.x = ghost.x;
  93.                         oldGhostCopy.moveDirection = ghost.moveDirection;
  94.                     }
  95.                     ghost.move();
  96.                     steps++;
  97.                 }
  98.  
  99.                 if (ghost.x == oldGuard.x && ghost.y == oldGuard.y) {
  100.                     if (!(guard.x == startGuard.x && guard.y == startGuard.y)) {
  101.                         Guard blockPosition = new Guard(guard.x, guard.y, guard.moveDirection);
  102.                         blockPositions.add(blockPosition);
  103.                         count++;
  104.                     }
  105.                 }
  106.             }
  107.             visited[oldGuard.y][oldGuard.x] = true;
  108.  
  109. //            drawField(field);
  110.  
  111.         }
  112.  
  113.         for (Guard g : blockPositions) {
  114.             field.get(g.y)[g.x] = 'O';
  115.         }
  116.         drawField(field);
  117.         System.out.println(count);
  118.  
  119.     }
  120.  
  121.     private static void drawField(List<char[]> field) {
  122.         for (char[] chars : field) {
  123.             System.out.println(Arrays.toString(chars));
  124.         }
  125.         System.out.println("-------------------------------");
  126.     }
  127.  
  128.     static class Guard {
  129.         private int x = 0;
  130.         private int y = 0;
  131.         private String moveDirection = "up";
  132.  
  133.         public Guard(int x, int y, String moveDirection) {
  134.             this.x = x;
  135.             this.y = y;
  136.             this.moveDirection = moveDirection;
  137.         }
  138.  
  139.         public Guard() {
  140.         }
  141.  
  142.         @Override
  143.         public String toString() {
  144.             return "Pair{" +
  145.                     "x=" + x +
  146.                     ", y=" + y +
  147.                     '}';
  148.         }
  149.  
  150.  
  151.         public void move() {
  152.             if (this.moveDirection.equals("up")) {
  153.                 y -= 1;
  154.             }
  155.             if (this.moveDirection.equals("right")) {
  156.                 x += 1;
  157.             }
  158.             if (this.moveDirection.equals("down")) {
  159.                 y += 1;
  160.             }
  161.             if (this.moveDirection.equals("left")) {
  162.                 x -= 1;
  163.             }
  164.         }
  165.  
  166.         public void changeDirection() {
  167.             switch (this.moveDirection) {
  168.                 case "up":
  169.                     this.moveDirection = "right";
  170.                     break;
  171.                 case "right":
  172.                     this.moveDirection = "down";
  173.                     break;
  174.                 case "down":
  175.                     this.moveDirection = "left";
  176.                     break;
  177.                 case "left":
  178.                     this.moveDirection = "up";
  179.                     break;
  180.             }
  181.         }
  182.  
  183.         public char getMoveChar() {
  184.             return switch (this.moveDirection) {
  185.                 case "up" -> 'u';
  186.                 case "right" -> 'r';
  187.                 case "down" -> 'd';
  188.                 case "left" -> 'l';
  189.                 default ->
  190.                     // should not happen
  191.                         'X';
  192.             };
  193.         }
  194.  
  195.         public char lookCorrectSide() {
  196.             return switch (this.moveDirection) {
  197.                 case "up" -> 'r';
  198.                 case "right" -> 'd';
  199.                 case "down" -> 'l';
  200.                 case "left" -> 'u';
  201.                 default ->
  202.                     // should not happen
  203.                         'X';
  204.             };
  205.         }
  206.         public char getShortMoveChar(){
  207.             if (this.moveDirection.equals("up") || this.moveDirection.equals("down"))
  208.                 return '|';
  209.             if (this.moveDirection.equals("right") || this.moveDirection.equals("left"))
  210.                 return '-';
  211.             // should not happen
  212.             return 'X';
  213.         }
  214.  
  215.         public boolean checkSides(List<char[]> field) {
  216.             if (field.get(this.y)[this.x] == '+')
  217.                 return true;
  218.             return switch (this.moveDirection) {
  219.                 case "up" -> field.get(this.y)[this.x] == 'u';
  220.                 case "down" -> field.get(this.y)[this.x] == 'd';
  221.                 case "right" -> field.get(this.y)[this.x] == 'r';
  222.                 case "left" -> field.get(this.y)[this.x] == 'l';
  223.                 default ->
  224.                     // should not happen
  225.                         field.get(this.y)[this.x] == 'X';
  226.             };
  227.         }
  228.     }
  229. }
  230.  
  231.  
  232.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement