Source code for submission s1326

Go to diff to previous submission

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.  
  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. // System.out.println("DOME CALLED");
  58. doMe();
  59.  
  60.  
  61.  
  62. }
  63.  
  64. public void doMe() {
  65. String prefix = "The last ant will fall down in ";
  66. String suffix = " seconds - started at ";
  67. boolean printed = false;
  68. while (klada.getLength() > 1) {
  69. //find first collision
  70. int minIndex = -1;
  71. double minDiff = -1;
  72. // System.out.println("BEFORE CYCLE");
  73. for (int i = 0; i < klada.getLength() - 1; i++) {
  74. // System.out.println(" KLADA LENGTH: " + klada.getLength());
  75. Ant a1 = klada.get(i);
  76. Ant a2 = klada.get(i + 1);
  77. // System.out.println(" after init KLADA LENGTH: " + klada.getLength());
  78. if (collide(a1, a2)) {
  79.  
  80. double diff = Math.abs(a1.getPosition() - a2.getPosition());
  81. // System.out.println("diff je :" + diff);
  82. if ((minDiff == -1 || diff < minDiff) && diff > 0) {
  83. minDiff = diff;
  84. minIndex = i;
  85. }
  86. }
  87. }
  88. double maxDistanceLeft = -1;
  89. double maxDistanceRight = -1;
  90.  
  91. Ant corrAntLeft = null;
  92. Ant corrAntRight = null;
  93. // System.out.println("MIN DIFF JE : " + minDiff);
  94. if (minDiff == -1) {
  95. // System.out.println("MIN DIFF JE -1");
  96. for (Ant a : klada.getAnts()) {
  97.  
  98.  
  99.  
  100. if (a.isIsRight()) {
  101. double maxLocal = (klada.getInitLength() - a.getPosition());
  102. if (maxDistanceRight == -1 || maxLocal > maxDistanceRight) {
  103. corrAntRight = a;
  104. maxDistanceRight = maxLocal;
  105. }
  106.  
  107. } else {
  108. double maxLocal = a.getPosition();
  109. if (maxDistanceLeft == -1 || maxLocal > maxDistanceLeft) {
  110. corrAntLeft = a;
  111. maxDistanceLeft = maxLocal;
  112. }
  113. }
  114. }
  115.  
  116. if (maxDistanceLeft > maxDistanceRight) {
  117. System.out.println(prefix + (int) (klada.getSeconds() + maxDistanceLeft) +
  118. suffix +
  119. corrAntLeft.getStartingPosition() + ".");
  120. } else if (maxDistanceLeft < maxDistanceRight) {
  121. System.out.println(prefix + (int) (klada.getSeconds() + maxDistanceRight) + suffix +
  122. corrAntRight.getStartingPosition() + ".");
  123. } else {
  124. int max = corrAntRight.getStartingPosition();
  125. int min = corrAntLeft.getStartingPosition();
  126. if (min > max) {
  127. int temp = min;
  128. min = max;
  129. max = temp;
  130. }
  131. System.out.println(prefix + (int) (klada.getSeconds() + maxDistanceRight) +
  132. suffix +
  133. min + " and " + max + ".");
  134. }
  135. printed = true;
  136. break;
  137. }
  138.  
  139.  
  140.  
  141. double collideIn = minDiff / 2.0;
  142. //shift all ants
  143. klada.shiftAnts(collideIn);
  144.  
  145. //turn all colliding ants
  146. klada.turnColliding();
  147. klada.removeFallen();
  148.  
  149. }
  150. Ant a = klada.get(0);
  151. double maxLocal;
  152. if (a.isIsRight()) {
  153. maxLocal = (klada.getInitLength() - a.getPosition());
  154. } else {
  155. maxLocal = a.getPosition();
  156.  
  157.  
  158. }
  159. if (!printed) {
  160. System.out.println(prefix + (int) (klada.getSeconds() + maxLocal) +
  161. suffix +
  162. a.getStartingPosition() + ".");
  163. }
  164. }
  165.  
  166. public boolean collide(Ant a1, Ant a2) {
  167. if (a1.isIsRight() && !a2.isIsRight()) {
  168. return true;
  169. }
  170. return false;
  171. }
  172. }
  173.  
  174. class Klada {
  175.  
  176. private double seconds = 0;
  177. private List<Ant> ants = new ArrayList<Ant>();
  178. private Integer length;
  179.  
  180. public Integer getInitLength() {
  181. return length;
  182. }
  183.  
  184. public Klada(Integer length) {
  185. this.length = length;
  186. }
  187.  
  188. public void turnColliding() {
  189. for (int i = 0; i < ants.size() - 1; i++) {
  190. Ant a1 = ants.get(i);
  191. Ant a2 = ants.get(i + 1);
  192. if (a1.getPosition() == a2.getPosition()) {
  193. a1.setIsRight(!a1.isIsRight());
  194. a2.setIsRight(!a2.isIsRight());
  195. }
  196. }
  197. }
  198.  
  199. public void sort() {
  200. for (int i = 0; i < ants.size() - 1; i++) {
  201. for (int j = 0; j < ants.size() - 1 - i; j++) {
  202. if (ants.get(j).getPosition() > ants.get(j + 1).getPosition()) {
  203. Ant a = ants.get(j);
  204. ants.set(j, ants.get(j + 1));
  205. ants.set(j + 1, a);
  206. }
  207. }
  208. }
  209.  
  210. }
  211.  
  212. public void removeFallen() {
  213. List<Ant> newAnts = new ArrayList<Ant>();
  214. for (Ant a : ants) {
  215. if (a.getPosition() >= 0 && a.getPosition() <= length) {
  216. newAnts.add(a);
  217. }
  218. }
  219. ants = newAnts;
  220. }
  221.  
  222. public void shiftAnts(double timeShiftFor) {
  223. seconds += timeShiftFor;
  224. for (Ant a : ants) {
  225. if (a.isIsRight()) {
  226. //shift right
  227. a.setPosition(a.getPosition() + timeShiftFor);
  228. } else {
  229. a.setPosition(a.getPosition() - timeShiftFor);
  230. }
  231. }
  232. }
  233.  
  234. public void addAnt(Ant ant) {
  235. ants.add(ant);
  236. }
  237.  
  238. public List<Ant> getAnts() {
  239. return ants;
  240. }
  241.  
  242. public Ant get(int i) {
  243. return ants.get(i);
  244. }
  245.  
  246. public void setAnts(List<Ant> ants) {
  247. this.ants = ants;
  248. }
  249.  
  250. public Integer getLength() {
  251. return ants.size();
  252. }
  253.  
  254. public void setLength(Integer length) {
  255. this.length = length;
  256. }
  257.  
  258. public double getSeconds() {
  259. return seconds;
  260. }
  261.  
  262. public void setSeconds(double seconds) {
  263. this.seconds = seconds;
  264. }
  265. }
  266.  
  267. class Ant {
  268.  
  269. private double position;
  270. private Integer startingPosition;
  271. //true= right; left= false
  272. private boolean isRight;
  273.  
  274. public Ant(Integer position, boolean isRight) {
  275. this.position = position;
  276. this.isRight = isRight;
  277. this.startingPosition = position;
  278. }
  279.  
  280. public Integer getStartingPosition() {
  281. return startingPosition;
  282. }
  283.  
  284. public void setStartingPosition(Integer startingPosition) {
  285. this.startingPosition = startingPosition;
  286. }
  287.  
  288. public boolean isIsRight() {
  289. return isRight;
  290. }
  291.  
  292. public void setIsRight(boolean isRight) {
  293. this.isRight = isRight;
  294. }
  295.  
  296. public double getPosition() {
  297. return position;
  298. }
  299.  
  300. public void setPosition(double position) {
  301. this.position = position;
  302. }
  303. }
  304.  

Diff to submission s1280

Ants.java

--- c4.s1280.cteam021.ants.java.0.Ants.java
+++ c4.s1326.cteam021.ants.java.0.Ants.java
@@ -123,7 +123,14 @@
                             corrAntRight.getStartingPosition() + ".");
                 } else {
+                    int max = corrAntRight.getStartingPosition();
+                    int min = corrAntLeft.getStartingPosition();
+                    if (min > max) {
+                        int temp = min;
+                        min = max;
+                        max = temp;
+                    }
                     System.out.println(prefix + (int) (klada.getSeconds() + maxDistanceRight) +
                             suffix +
-                            corrAntLeft.getStartingPosition() + " and " + corrAntRight.getStartingPosition() + ".");
+                            min + " and " + max + ".");
                 }
                 printed = true;