Advertisement
Guest User

Untitled

a guest
Mar 26th, 2019
216
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.52 KB | None | 0 0
  1. public class Solution {
  2.  
  3. private static int change;
  4. private static int mIndex;
  5. private static int mSubIndex;
  6. private static int round;
  7. private static boolean isMyTurn;
  8. private static StringBuilder current, winner;
  9. private static char player1 = 'x';
  10. private static char player2 = 'x';
  11. private static char player0 = 'x';
  12.  
  13.  
  14. public static void main(String[] args) {
  15.  
  16. System.out.println("Changed: " + handFormationChange(5, 2, "RP") + " times");
  17.  
  18.  
  19. }
  20.  
  21. private static int handFormationChange(int n, int a, String formation) {
  22.  
  23. //Check if the given string is Empty
  24. if (formation.length() < 1) {
  25. return 0;
  26. } else {
  27. //Extract all empty spaces from the given string (if any)
  28. formation = formation.replaceAll("\\s+", "");
  29. current = new StringBuilder(formation);
  30. winner = new StringBuilder();
  31.  
  32. //Set the index to the given initial position
  33. mIndex = a;
  34.  
  35. //insert arbitrary char in my position to complete the number of players
  36. current.insert(a, 'x');
  37. System.out.println(current);
  38. //Determine my first formation by checking the status and position of my first opponent
  39. if (((a + 1) % 2 == 0) && (a - 1 >= 0)) {
  40. player0 = pickWinnerAgainst(current.charAt(a - 1));
  41. } else if (((a + 1) % 2 != 0) && (a < current.length() - 1)) {
  42. player0 = pickWinnerAgainst(current.charAt(a + 1));
  43. }
  44.  
  45. //As long as no final winner yet..
  46. while (current.length() > 1) {
  47. round++;
  48.  
  49. //Start the competition..
  50. for (int i = 0; i < current.length(); i += 2) {
  51.  
  52. //if the first player of any pairs is me
  53. if (i == mIndex) {
  54. //and I am the last player in the line - hasn't chosen a formation yet
  55. if (player0 == 'x') {
  56. //and there at least another opponent to play against yet
  57. if (winner.length() > 0) {
  58. //choose my first winning formation and qualify
  59. player0 = pickWinnerAgainst(winner.charAt(0));
  60. winner.append(player0);
  61. continue;
  62. } else {
  63. //if I'm the only remaining player .. I win with any formation
  64. player0 = 'S';
  65. winner.append(player0);
  66. continue;
  67. }
  68.  
  69. } else {
  70. //If I am the last player in the line with a formation chosen
  71. player1 = player0;
  72. //Ask to pick a winning formation for me as a first player in pair
  73. mSubIndex = 1;
  74. isMyTurn = true;
  75. }
  76.  
  77. } else {
  78. //If I'm not one of the pair
  79. player1 = current.charAt(i);
  80. }
  81.  
  82. //if the second player of any pairs is me
  83. if ((i + 1) == mIndex) {
  84. player2 = player0;
  85. //Ask to pick a winning formation for me as a second player in pair
  86. mSubIndex = 2;
  87. isMyTurn = true;
  88. } else {
  89. //If I'm not one of the pair & there's enough players in the line, pick the second player
  90. if ((i + 1) <= current.length() - 1) {
  91. player2 = current.charAt(i + 1);
  92. } else {
  93. //if I'm the first player in pair and the last player
  94. if (i == mIndex) {
  95. //qualify me
  96. winner.append(player1);
  97. //save my new position for the next round
  98. mIndex = winner.length() - 1;
  99. isMyTurn = false;
  100. continue;
  101. //if the last player has no opponent and wasn't me, qualify him for the next round
  102. } else {
  103. winner.append(player1);
  104. continue;
  105. }
  106. }
  107. }
  108.  
  109. // if I'm in the pair
  110. if (isMyTurn) {
  111. //and I'm player1 in pair
  112. if (mSubIndex == 1) {
  113. insertWinner(player1, player2);
  114. //and I'm player2 in pair
  115. } else if (mSubIndex == 2) {
  116. insertWinner(player2, player1);
  117. }
  118. //if I'm not in the pair
  119. } else {
  120. if (player1 == 'P' && player2 == 'R') {
  121. winner.append(player1);
  122. } else if (player1 == 'R' && player2 == 'P') {
  123. winner.append(player2);
  124. } else if (player1 == 'S' && player2 == 'P') {
  125. winner.append(player1);
  126. } else if (player1 == 'P' && player2 == 'S') {
  127. winner.append(player2);
  128. } else if (player1 == 'R' && player2 == 'S') {
  129. winner.append(player1);
  130. } else if (player1 == 'S' && player2 == 'R') {
  131. winner.append(player2);
  132. }
  133. }
  134.  
  135. }
  136.  
  137. //start a new round with the previous round winners
  138. current = new StringBuilder(winner);
  139. winner.setLength(0);
  140. winner = new StringBuilder();
  141. }
  142.  
  143. return change;
  144. }
  145.  
  146. }
  147.  
  148. //check if my current formation help me winning
  149. private static boolean isWinning(char m, char n) {
  150. if (m == 'P' && n == 'R') {
  151. return true;
  152. } else if (m == 'R' && n == 'P') {
  153. return false;
  154. } else if (m == 'S' && n == 'P') {
  155. return true;
  156. } else if (m == 'P' && n == 'S') {
  157. return false;
  158. } else if (m == 'R' && n == 'S') {
  159. return true;
  160. } else if (m == 'S' && n == 'R') {
  161. return false;
  162. //in case of a draw, All lose!
  163. } else {
  164. return false;
  165. }
  166. }
  167.  
  168. //Advice me with the perfect formation to win
  169. private static char pickWinnerAgainst(char mChar) {
  170. if (mChar == 'P') {
  171. return 'S';
  172.  
  173. } else if (mChar == 'S') {
  174. return 'R';
  175. } else {
  176. return 'P';
  177. }
  178.  
  179.  
  180. }
  181.  
  182. //Do what's best for me and save my new position in the next round
  183. private static void insertWinner(char playerA, char playerB) {
  184. if (isWinning(playerA, playerB)) {
  185. winner.append(playerA);
  186. mIndex = winner.length() - 1;
  187. isMyTurn = false;
  188. } else {
  189. player0 = pickWinnerAgainst(playerB);
  190. winner.append(player0);
  191. System.out.println(playerA + " -> " + player0 + " @R" + round);
  192. change++;
  193. mIndex = winner.length() - 1;
  194. isMyTurn = false;
  195. }
  196. }
  197.  
  198. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement