Advertisement
tomdodd4598

Car Cricket Java

Jun 29th, 2023
921
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 9.82 KB | None | 0 0
  1. package dodd;
  2.  
  3. import java.util.*;
  4. import java.util.function.*;
  5. import java.util.stream.IntStream;
  6.  
  7. public class Main {
  8.  
  9.     static class Box<T> {
  10.  
  11.         T value;
  12.  
  13.         Box(T value) {
  14.             this.value = value;
  15.         }
  16.  
  17.         public String toString() {
  18.             return value.toString();
  19.         }
  20.     }
  21.  
  22.     record Ball(int runs, boolean wicket) {}
  23.  
  24.     static int mod(int x, int y) {
  25.         return (x % y + y) % y;
  26.     }
  27.  
  28.     static int strHash(String str) {
  29.         return str.chars().reduce(5381, (acc, x) -> 127 * (acc & 0x00FFFFFF) + x);
  30.     }
  31.  
  32.     static Iterable<Integer> filteredStr(String str) {
  33.         return () -> str.codePoints().filter(x -> x < 0xFE00 || x > 0xFE0F).iterator();
  34.     }
  35.  
  36.     static class Team {
  37.  
  38.         final String name;
  39.  
  40.         final String coachUpper;
  41.         final String nameUpper;
  42.  
  43.         final List<String> players = new ArrayList<>();
  44.         final List<String> playersLast = new ArrayList<>();
  45.  
  46.         final List<Integer> bowl = new ArrayList<>();
  47.         final List<Integer> wk = new ArrayList<>();
  48.  
  49.         final int uuid;
  50.  
  51.         Team(String coach, String name, List<String> players) {
  52.             this.name = name;
  53.  
  54.             coachUpper = coach.toUpperCase(Locale.ROOT);
  55.             nameUpper = name.toUpperCase(Locale.ROOT);
  56.  
  57.             uuid = strHash(coach + name);
  58.  
  59.             for (int i = 0; i < 11; ++i) {
  60.                 var player = players.get(i);
  61.                 var suffix = "";
  62.                 if (player.length() >= 4) {
  63.                     suffix = player.substring(0, player.length() - 4).toLowerCase(Locale.ROOT);
  64.                 }
  65.                 if (suffix.equals("(wk)") || suffix.equals("[wk]") || suffix.equals("{wk}")) {
  66.                     this.wk.add(i);
  67.                 } else if (i - wk.size() > 5) {
  68.                     this.bowl.add(i);
  69.                 }
  70.                 this.players.add(player);
  71.  
  72.                 var split = player.split("\\s+");
  73.                 this.playersLast.add(split[split.length - 1]);
  74.             }
  75.         }
  76.  
  77.         String bowler(int count) {
  78.             var test = (count / 6) * this.uuid;
  79.             if (test % 8 == 0) {
  80.                 var index = mod(test, 11);
  81.                 if (!this.wk.contains(index)) {
  82.                     return this.playersLast.get(index);
  83.                 }
  84.             }
  85.             return this.playersLast.get(this.bowl.get(mod(test, this.bowl.size())));
  86.         }
  87.     }
  88.  
  89.     public static void main(String[] args) {
  90.         final var scanner = new Scanner(System.in);
  91.        
  92.         Supplier<Team> parseTeam = () -> {
  93.             var coach = scanner.nextLine();
  94.             var name = scanner.nextLine();
  95.             scanner.nextLine();
  96.             var players = IntStream.range(0, 11).mapToObj(x -> scanner.nextLine()).toList();
  97.             scanner.nextLine();
  98.             return new Team(coach, name, players);
  99.         };
  100.  
  101.         IntFunction<String> runsStr = x -> x == 0 ? "🦆" : Integer.toString(x);
  102.  
  103.         final var teams = new Team[] {parseTeam.get(), parseTeam.get()};
  104.         final var teamRuns = new int[] {0, 0};
  105.  
  106.         final var toss = Integer.parseInt(scanner.nextLine()) - 1;
  107.         final var batting = new Box<>(0);
  108.         final var line = scanner.nextLine().toLowerCase(Locale.ROOT);
  109.         batting.value = line.equals("bat") || line.equals("batting") ? toss : 1 - toss;
  110.         scanner.nextLine();
  111.  
  112.         IntSupplier bowling = () -> 1 - batting.value;
  113.  
  114.         final var count = new Box<>(6 * 123456789);
  115.  
  116.         final var batterRuns = new Box<>(0);
  117.         // final var batterBalls = new Box<>(0);
  118.         final var totalRuns = new Box<>(0);
  119.         final var totalWickets = new Box<>(0);
  120.         final var wicket = new Box<>(false);
  121.         final var innings = new Box<>(1);
  122.         final var target = new Box<>(0);
  123.  
  124.         IntFunction<String> runPl = x -> x + " RUN" + (x == 1 ? "" : "S");
  125.  
  126.         IntFunction<String> wicketPl = x -> x + " WICKET" + (x == 1 ? "" : "S");
  127.  
  128.         Supplier<String> batter = () -> teams[batting.value].players.get(totalWickets.value);
  129.  
  130.         Supplier<String> bowler = () -> teams[bowling.getAsInt()].bowler(count.value);
  131.  
  132.         Consumer<Boolean> printBatter = x -> {
  133.             if (x) {
  134.                 System.out.println(batter.get() + " " + runsStr.apply(batterRuns.value) + " (" + bowler.get() + ")");
  135.             } else {
  136.                 System.out.println(batter.get() + " " + batterRuns + " n/o");
  137.             }
  138.         };
  139.  
  140.         Runnable printCurrentInnings = () -> {
  141.             printBatter.accept(false);
  142.             for (var i = 1 + totalWickets.value; i < 11; ++i){
  143.                 System.out.println(teams[batting.value].players.get(i));
  144.             }
  145.             System.out.println("\n" + totalRuns + "/" + totalWickets + "\n");
  146.         };
  147.  
  148.         Map<Integer, Ball> ballDict = new HashMap<>();
  149.  
  150.         BiConsumer<Ball, int[]> putBall = (x, y) -> {
  151.             for (var code : y) {
  152.                 ballDict.put(code, x);
  153.             }
  154.         };
  155.  
  156.         var gone = new Ball(0, true);
  157.         var dot = new Ball(0, false);
  158.         var one = new Ball(1, false);
  159.         var two = new Ball(2, false);
  160.         var three = new Ball(3, false);
  161.         var four = new Ball(4, false);
  162.         var five = new Ball(5, false);
  163.         var six = new Ball(6, false);
  164.  
  165.         putBall.accept(gone, new int[] {33, 10084, 128308, 128997});
  166.         putBall.accept(dot, new int[] {48, 128420, 9899, 11035, 9899, 11035});
  167.         putBall.accept(one, new int[] {49, 129293, 9898, 11036, 9898, 11036});
  168.         putBall.accept(two, new int[] {50, 128154, 128994, 129001});
  169.         putBall.accept(three, new int[] {51, 129505, 128992, 128999});
  170.         putBall.accept(four, new int[] {52, 128153, 128309, 128998});
  171.         putBall.accept(five, new int[] {53, 128156, 128995, 129002});
  172.         putBall.accept(six, new int[] {54, 128155, 128993, 129000});
  173.  
  174.         Supplier<Ball> otherBall = () -> five;
  175.  
  176.         Function<Integer, Ball> carBall = x -> ballDict.getOrDefault(x, otherBall.get());
  177.  
  178.         var cars = scanner.nextLine();
  179.  
  180.         System.out.println(teams[0].coachUpper + " VS " + teams[1].coachUpper + " TEST\n");
  181.  
  182.         System.out.println(teams[0].nameUpper + "\nvs\n" + teams[1].nameUpper + "\n");
  183.  
  184.         var decision = toss == batting.value ? "bat" : "bowl";
  185.         System.out.println(teams[toss].name + " won the toss and chose to " + decision + "\n");
  186.  
  187.         System.out.println("1ST INNINGS\n");
  188.  
  189.         for (var car : filteredStr(cars)) {
  190.             count.value += 1;
  191.             var ball = carBall.apply(car);
  192.             batterRuns.value += ball.runs;
  193.             // batterBalls.value += 1;
  194.             totalRuns.value += ball.runs;
  195.             teamRuns[batting.value] += ball.runs;
  196.             wicket.value = ball.wicket;
  197.             if (wicket.value) {
  198.                 printBatter.accept(true);
  199.                 batterRuns.value = 0;
  200.                 // batterBalls.value = 0;
  201.                 totalWickets.value += 1;
  202.                 if (totalWickets.value > 10) {
  203.                     System.out.println("\n" + totalRuns + "/" + totalWickets + "\n");
  204.                     batting.value = bowling.getAsInt();
  205.                     totalRuns.value = 0;
  206.                     totalWickets.value = 0;
  207.                     innings.value += 1;
  208.                     if (innings.value == 3) {
  209.                         var lead = teamRuns[0] - teamRuns[1];
  210.                         if (lead == 0) {
  211.                             System.out.println("SCORES LEVEL");
  212.                         } else {
  213.                             var leading = lead > 0 ? 0 : 1;
  214.                             System.out.println(teams[leading].nameUpper + " LEAD BY " + runPl.apply(Math.abs(lead)) + "\n");
  215.                         }
  216.                         System.out.println("2ND INNINGS\n");
  217.                     } else if (innings.value == 4) {
  218.                         var deficit = teamRuns[bowling.getAsInt()] - teamRuns[batting.value];
  219.                         if (deficit < 0) {
  220.                             System.out.println(teams[batting.value].nameUpper + " WIN BY AN INNINGS AND " + runPl.apply(-deficit));
  221.                             return;
  222.                         } else {
  223.                             target.value = 1 + deficit;
  224.                             System.out.println(teams[batting.value].nameUpper + " NEED " + runPl.apply(target.value) + " TO WIN\n");
  225.                         }
  226.                     } else if (innings.value > 4) {
  227.                         var lead = teamRuns[batting.value] - teamRuns[bowling.getAsInt()];
  228.                         if (lead == 0) {
  229.                             System.out.println("MATCH TIED\n");
  230.                         } else {
  231.                             System.out.println(teams[batting.value].nameUpper + " WIN BY " + runPl.apply(lead) + "\n");
  232.                         }
  233.                         return;
  234.                     }
  235.                 }
  236.             } else if (innings.value == 4 && totalRuns.value >= target.value) {
  237.                 printCurrentInnings.run();
  238.                 System.out.println(teams[batting.value].nameUpper + " WIN BY " + wicketPl.apply(11 - totalWickets.value));
  239.                 return;
  240.             }
  241.         }
  242.  
  243.         printCurrentInnings.run();
  244.  
  245.         var lead = teamRuns[batting.value] - teamRuns[bowling.getAsInt()];
  246.         if (innings.value == 4) {
  247.             System.out.println(teams[batting.value].nameUpper + " NEED " + runPl.apply(1 - lead) + " TO WIN");
  248.         } else {
  249.             if (lead == 0) {
  250.                 System.out.println("SCORES LEVEL");
  251.             } else {
  252.                 var leading = lead > 0 ? batting.value : bowling.getAsInt();
  253.                 System.out.println(teams[leading].nameUpper + " LEAD BY " + runPl.apply(Math.abs(lead)));
  254.             }
  255.         }
  256.     }
  257. }
  258.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement