Source code for submission s1177

Ants.java

  1.  
  2. import java.io.BufferedReader;
  3.  
  4. /*
  5.  * To change this template, choose Tools | Templates
  6.  * and open the template in the editor.
  7.  */
  8. import java.io.FileReader;
  9. import java.io.IOException;
  10. import java.io.InputStreamReader;
  11. import java.util.ArrayList;
  12. import java.util.List;
  13. import java.util.Scanner;
  14. import java.util.logging.Level;
  15. import java.util.logging.Logger;
  16.  
  17. /**
  18.  *
  19.  * @author cteam021
  20.  */
  21. public class Ants {
  22.  
  23. private Klada klada;
  24.  
  25. public static void main(String[] args) {
  26. try {
  27. new Ants();
  28. } catch (Exception e) {
  29. System.out.println("Exc");
  30. e.printStackTrace();
  31. }
  32. }
  33.  
  34. public Ants() throws IOException {
  35.  
  36. String line = reader.readLine();
  37. String length = line.substring(0, line.indexOf(' '));
  38. Integer lengthKlada = Integer.parseInt(length);
  39.  
  40. Integer numAnts = Integer.parseInt(line.substring(line.indexOf(' ') + 1));
  41.  
  42. klada = new Klada(lengthKlada);
  43.  
  44.  
  45. for (int i = 0; i < numAnts; i++) {
  46. line = reader.readLine();
  47. int pos = Integer.parseInt(line.substring(0, line.indexOf(' ')));
  48. String or = line.substring(line.indexOf(' ') + 1);
  49. if (or.equals("R")) {
  50. klada.addAnt(new Ant(pos, true));
  51. } else {
  52. klada.addAnt(new Ant(pos, false));
  53. }
  54. }
  55.  
  56. klada.sort();
  57. doMe();
  58.  
  59.  
  60.  
  61. }
  62.  
  63. public void doMe() {
  64. String prefix = "The last ant will fall down in ";
  65. String suffix = " seconds - started at ";
  66. boolean printed = false;
  67. while (klada.getLength() > 1) {
  68. //find first collision
  69. int minIndex = -1;
  70. double minDiff = -1;
  71. for (int i = 0; i < klada.getLength() - 1; i++) {
  72. Ant a1 = klada.get(i);
  73. Ant a2 = klada.get(i + 1);
  74. if (collide(a1, a2)) {
  75. double diff = Math.abs(a1.getPosition() - a2.getPosition());
  76. if ((minDiff == -1 || diff < minDiff) && diff > 0) {
  77. minDiff = diff;
  78. minIndex = i;
  79. }
  80. }
  81. }
  82. double maxDistanceLeft = -1;
  83. double maxDistanceRight = -1;
  84.  
  85. Ant corrAntLeft = null;
  86. Ant corrAntRight = null;
  87. if (minDiff == -1) {
  88.  
  89. for (Ant a : klada.getAnts()) {
  90.  
  91.  
  92.  
  93. if (a.isIsRight()) {
  94. double maxLocal = (klada.getInitLength() - a.getPosition());
  95. if (maxDistanceRight == -1 || maxLocal > maxDistanceRight) {
  96. corrAntRight = a;
  97. maxDistanceRight = maxLocal;
  98. }
  99.  
  100. } else {
  101. double maxLocal = a.getPosition();
  102. if (maxDistanceLeft == -1 || maxLocal > maxDistanceLeft) {
  103. corrAntLeft = a;
  104. maxDistanceLeft = maxLocal;
  105. }
  106. }
  107. }
  108.  
  109. if (maxDistanceLeft > maxDistanceRight) {
  110. System.out.println(prefix + (int) (klada.getSeconds() + maxDistanceLeft) +
  111. suffix +
  112. corrAntLeft.getStartingPosition() + ".");
  113. } else if (maxDistanceLeft < maxDistanceRight) {
  114. System.out.println(prefix + (int) (klada.getSeconds() + maxDistanceRight) + suffix +
  115. corrAntRight.getStartingPosition() + ".");
  116. } else {
  117. System.out.println(prefix + (int) (klada.getSeconds() + maxDistanceRight) +
  118. suffix +
  119. corrAntLeft.getStartingPosition() + " and " + corrAntRight.getStartingPosition() + ".");
  120. }
  121. printed = true;
  122. break;
  123. }
  124.  
  125.  
  126.  
  127. double collideIn = minDiff / 2.0;
  128. //shift all ants
  129. klada.shiftAnts(collideIn);
  130.  
  131. //turn all colliding ants
  132. klada.turnColliding();
  133. klada.removeFallen();
  134.  
  135. }
  136. Ant a = klada.get(0);
  137. double maxLocal;
  138. if (a.isIsRight()) {
  139. maxLocal = (klada.getInitLength() - a.getPosition());
  140. } else {
  141. maxLocal = a.getPosition();
  142.  
  143.  
  144. }
  145. if (!printed) {
  146. System.out.println(prefix + (int) (klada.getSeconds() + maxLocal) +
  147. suffix +
  148. a.getStartingPosition() + ".");
  149. }
  150. }
  151.  
  152. public boolean collide(Ant a1, Ant a2) {
  153. if (a1.isIsRight() != a2.isIsRight()) {
  154. return true;
  155. }
  156. return false;
  157. }
  158. }
  159.  
  160. class Klada {
  161.  
  162. private double seconds = 0;
  163. private List<Ant> ants = new ArrayList<Ant>();
  164. private Integer length;
  165.  
  166. public Integer getInitLength() {
  167. return length;
  168. }
  169.  
  170. public Klada(Integer length) {
  171. this.length = length;
  172. }
  173.  
  174. public void turnColliding() {
  175. for (int i = 0; i < ants.size() - 1; i++) {
  176. Ant a1 = ants.get(i);
  177. Ant a2 = ants.get(i + 1);
  178. if (a1.getPosition() == a2.getPosition()) {
  179. a1.setIsRight(!a1.isIsRight());
  180. a2.setIsRight(!a2.isIsRight());
  181. }
  182. }
  183. }
  184.  
  185. public void sort() {
  186. for (int i = 0; i < ants.size() - 1; i++) {
  187. for (int j = 0; j < ants.size() - 1 - i; j++) {
  188. if (ants.get(j).getPosition() > ants.get(j + 1).getPosition()) {
  189. Ant a = ants.get(j);
  190. ants.set(j, ants.get(j + 1));
  191. ants.set(j + 1, a);
  192. }
  193. }
  194. }
  195.  
  196. }
  197.  
  198. public void removeFallen() {
  199. List<Ant> newAnts = new ArrayList<Ant>();
  200. for (Ant a : ants) {
  201. if (a.getPosition() >= 0 && a.getPosition() <= length) {
  202. newAnts.add(a);
  203. }
  204. }
  205. ants = newAnts;
  206. }
  207.  
  208. public void shiftAnts(double timeShiftFor) {
  209. seconds += timeShiftFor;
  210. for (Ant a : ants) {
  211. if (a.isIsRight()) {
  212. //shift right
  213. a.setPosition(a.getPosition() + timeShiftFor);
  214. } else {
  215. a.setPosition(a.getPosition() - timeShiftFor);
  216. }
  217. }
  218. }
  219.  
  220. public void addAnt(Ant ant) {
  221. ants.add(ant);
  222. }
  223.  
  224. public List<Ant> getAnts() {
  225. return ants;
  226. }
  227.  
  228. public Ant get(int i) {
  229. return ants.get(i);
  230. }
  231.  
  232. public void setAnts(List<Ant> ants) {
  233. this.ants = ants;
  234. }
  235.  
  236. public Integer getLength() {
  237. return ants.size();
  238. }
  239.  
  240. public void setLength(Integer length) {
  241. this.length = length;
  242. }
  243.  
  244. public double getSeconds() {
  245. return seconds;
  246. }
  247.  
  248. public void setSeconds(double seconds) {
  249. this.seconds = seconds;
  250. }
  251. }
  252.  
  253. class Ant {
  254.  
  255. private double position;
  256. private Integer startingPosition;
  257. //true= right; left= false
  258. private boolean isRight;
  259.  
  260. public Ant(Integer position, boolean isRight) {
  261. this.position = position;
  262. this.isRight = isRight;
  263. this.startingPosition = position;
  264. }
  265.  
  266. public Integer getStartingPosition() {
  267. return startingPosition;
  268. }
  269.  
  270. public void setStartingPosition(Integer startingPosition) {
  271. this.startingPosition = startingPosition;
  272. }
  273.  
  274. public boolean isIsRight() {
  275. return isRight;
  276. }
  277.  
  278. public void setIsRight(boolean isRight) {
  279. this.isRight = isRight;
  280. }
  281.  
  282. public double getPosition() {
  283. return position;
  284. }
  285.  
  286. public void setPosition(double position) {
  287. this.position = position;
  288. }
  289. }
  290.