Skip to content

Commit ddbe18a

Browse files
authored
Merge pull request #17 from LyashenkoGS/#15
'#15.'Optimize slicing algoritm, avoiding iterations thru finished start posiions
2 parents 6c00f90 + 9ae048f commit ddbe18a

File tree

4 files changed

+40
-21
lines changed

4 files changed

+40
-21
lines changed

src/main/java/com/google/hashcode/App.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
import java.io.File;
1313
import java.io.IOException;
14+
import java.util.ArrayList;
1415
import java.util.List;
1516
import java.util.Map;
1617

@@ -30,18 +31,18 @@ public static void main(String[] args) throws IOException {
3031

3132
public static void slicePizza(String inputFile, String outputFile) throws IOException {
3233
Profiler profiler = new Profiler();
33-
List<Slice> output;
34+
List<Slice> startPositions;
35+
List<Slice> output = new ArrayList<>();
3436
Pizza pizza = new Pizza(new File(inputFile), IoUtils.parsePizza(inputFile), IoUtils.parseSliceInstructions(inputFile));
3537
//get start positions
36-
output = DFSMethods.cutAllStartPositions(pizza);
38+
startPositions = DFSMethods.cutAllStartPositions(pizza);
3739
//get All steps
38-
Map<Slice, List<Step>> availableSteps = DFSMethods.getAvailableSteps(pizza, output);
40+
Map<Slice, List<Step>> availableSteps = DFSMethods.getAvailableSteps(pizza, startPositions, output);
3941
while (!availableSteps.values().stream().allMatch(List::isEmpty)) {
4042
Step step = DFSMethods.selectStep(availableSteps);
41-
output.remove(step.startPosition);
42-
output.add(DFSMethods.performStep(pizza, step));
43+
DFSMethods.performStep(pizza, step, startPositions, output);
4344
//TODO available steps should include merging slices to each other
44-
availableSteps = DFSMethods.getAvailableSteps(pizza, output);
45+
availableSteps = DFSMethods.getAvailableSteps(pizza, startPositions, output);
4546
LOGGER.info("OUTPUT AFTER A STEP: "
4647
+ "\n " + output);
4748
}

src/main/java/com/google/hashcode/entity/Cell.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@ public boolean equals(Object o) {
2828
if (this == o) return true;
2929
if (!(o instanceof Cell)) return false;
3030
Cell cell = (Cell) o;
31-
return x == cell.x &&
32-
y == cell.y &&
33-
ingredient == cell.ingredient;
31+
return this.x == cell.x &&
32+
this.y == cell.y &&
33+
this.ingredient == cell.ingredient;
3434
}
3535

3636
@Override

src/main/java/com/google/hashcode/utils/DFSMethods.java

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,10 @@ private DFSMethods() {
1919
* remove this slice from startPositions and add all it's cells to pizza.
2020
* @param pizza given pizza
2121
* @param startPositions given slices in the pizza
22+
* @param output
2223
* @return available steps
2324
*/
24-
public static Map<Slice, List<Step>> getAvailableSteps(Pizza pizza, List<Slice> startPositions) {
25+
public static Map<Slice, List<Step>> getAvailableSteps(Pizza pizza, List<Slice> startPositions, List<Slice> output) {
2526
Map<Slice, List<Step>> groupedSteps = new HashMap<>();
2627
Iterator iter = startPositions.iterator();
2728
while (iter.hasNext()) {
@@ -43,7 +44,8 @@ public static Map<Slice, List<Step>> getAvailableSteps(Pizza pizza, List<Slice>
4344
if (startPosition.isValid(pizza)) {
4445
// if slice is valid and have'nt any steps -> cut it from
4546
// startPositions
46-
groupedSteps.put(startPosition, steps);
47+
output.add(startPosition);
48+
iter.remove();
4749
} else {
4850
// if slice isn't valid and have'nt any steps -> return all
4951
// it cells to pizza
@@ -66,20 +68,32 @@ public static Map<Slice, List<Step>> getAvailableSteps(Pizza pizza, List<Slice>
6668
*
6769
* @param pizza given pizza
6870
* @param step step to perform
69-
* @return formed slice that includes an original slice and delta from a step
71+
* @param startPositions
72+
*@param output @return formed slice that includes an original slice and delta from a step
7073
*/
71-
public static Slice performStep(Pizza pizza, Step step) {
74+
public static void performStep(Pizza pizza, Step step, List<Slice> startPositions, List<Slice> output) {
7275
//1. Pick ups a steps list with minimal total cells number
7376
LOGGER.info("STEP TO PERFORM " + step);
7477
//2. Cut all the step delta cells from pizza
7578
LOGGER.info("pizza before step: " + pizza
7679
+ "\ndelta to remove from the pizza: " + step.delta);
7780
pizza.getCells().removeAll(step.delta.cells);
81+
82+
//3. remove previous version start position from startPositions
83+
startPositions.remove(step.startPosition);
84+
85+
List<Cell> returnedList = step.startPosition.cells;
86+
returnedList.addAll(step.delta.cells);
87+
Slice finalSlice = new Slice(returnedList);
88+
7889
LOGGER.info("PIZZA AFTER STEP:" + pizza);
7990
//3. Add the step cells to an output slice
80-
Slice slice = new Slice(step.delta.cells);
81-
slice.cells.addAll(step.startPosition.cells);
82-
return slice;
91+
92+
if(finalSlice.cells.size() == pizza.getSliceInstruction().getMaxNumberOfCellsPerSlice()){
93+
output.add(finalSlice);
94+
} else{
95+
startPositions.add(finalSlice);
96+
}
8397
}
8498

8599
/**

src/test/java/com/google/hashcode/utils/DFSMethodsTest.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
import java.io.File;
88
import java.io.IOException;
9+
import java.util.ArrayList;
910
import java.util.Arrays;
1011
import java.util.List;
1112
import java.util.Map;
@@ -27,7 +28,8 @@ public void setup() throws IOException {
2728

2829
@Test
2930
public void getAvailableSteps() throws IOException {
30-
Map<Slice, List<Step>> actualMap = DFSMethods.getAvailableSteps(pizza, DFSMethods.cutAllStartPositions(pizza));
31+
List<Slice> output = new ArrayList<>();
32+
Map<Slice, List<Step>> actualMap = DFSMethods.getAvailableSteps(pizza, DFSMethods.cutAllStartPositions(pizza), output);
3133
assertEquals(3, actualMap.keySet().size());
3234
assertEquals(3, actualMap.get(new Slice(new Cell(1, 1, Ingredient.MUSHROOM))).size());
3335
assertEquals(2, actualMap.get(new Slice(new Cell(1, 2, Ingredient.MUSHROOM))).size());
@@ -47,10 +49,12 @@ public void cutAllStartPositions() throws IOException {
4749

4850
@Test
4951
public void performStep() {
50-
List<Slice> output = DFSMethods.cutAllStartPositions(pizza);
51-
Map<Slice, List<Step>> availableSteps = DFSMethods.getAvailableSteps(pizza, output);
52-
Slice slice = DFSMethods.performStep(pizza, DFSMethods.selectStep(availableSteps));
53-
assertEquals(new Slice(Arrays.asList(new Cell(2, 2, Ingredient.TOMATO), new Cell(1, 2, Ingredient.MUSHROOM))), slice);
52+
List<Slice> startPositions = DFSMethods.cutAllStartPositions(pizza);
53+
List<Slice> output = new ArrayList<>();
54+
Map<Slice, List<Step>> availableSteps = DFSMethods.getAvailableSteps(pizza, startPositions, output);
55+
DFSMethods.performStep(pizza, DFSMethods.selectStep(availableSteps), startPositions, output);
56+
assertEquals(new Slice(Arrays.asList(new Cell(1, 2, Ingredient.MUSHROOM), new Cell(2, 2, Ingredient.TOMATO)))
57+
, startPositions.get(2));
5458
assertEquals(11, pizza.getCells().size());
5559
}
5660
}

0 commit comments

Comments
 (0)