Skip to content

Commit 40c378c

Browse files
committed
fixMediumPizzaSlicing. medium pizza slicing time 26m result 32422 cells sliced
1 parent 773455c commit 40c378c

File tree

5 files changed

+58
-43
lines changed

5 files changed

+58
-43
lines changed

outputDataSet/example.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
3
2-
0 2 2 2
3-
0 3 2 4
4-
0 0 2 1
2+
1 2 2 2
3+
1 3 1 4
4+
1 0 1 1

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

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ public class App {
2222
private static final Logger LOGGER = LoggerFactory.getLogger(App.class);
2323

2424
public static void main(String[] args) throws IOException {
25-
slicePizza(EXAMPLE_INPUT_FILE_PATH, OUTPUT_DATA_SET_EXAMPLE_TXT);
26-
slicePizza(SMALL_INPUT_FILE_PATH, OUTPUT_DATA_SET_SMALL_TXT);
27-
//slicePizza(MEDIUM_INPUT_FILE_PATH, OUTPUT_DATA_SET_MEDIUM_TXT);
25+
//slicePizza(EXAMPLE_INPUT_FILE_PATH, OUTPUT_DATA_SET_EXAMPLE_TXT);
26+
//slicePizza(SMALL_INPUT_FILE_PATH, OUTPUT_DATA_SET_SMALL_TXT);
27+
slicePizza(MEDIUM_INPUT_FILE_PATH, OUTPUT_DATA_SET_MEDIUM_TXT);
2828
//TODO troubles to input big files, possible exciting String max size
2929
//slicePizza(BIG_INPUT_FILE_PATH, OUTPUT_DATA_SET_BIG_TXT);
3030
}
@@ -45,6 +45,10 @@ public static void slicePizza(String inputFile, String outputFile) throws IOExce
4545
availableSteps = DFSMethods.getAvailableSteps(pizza, startPositions, output);
4646
LOGGER.info("OUTPUT AFTER A STEP: "
4747
+ "\n " + output);
48+
LOGGER.info("start positions cells number: " + startPositions.stream()
49+
.map(slice -> slice.cells.size())
50+
.reduce(0, (integer, integer2) -> integer + integer2)
51+
);
4852
}
4953
IoUtils.writeToFile(outputFile, IoUtils.parseSlices(output));
5054
LOGGER.info("FINISHED for " + inputFile + "!!!!!");

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

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ public boolean isValid(Pizza pizza) {
116116
boolean isPassedSliceInstructions = this.cells.size() <= pizza.getSliceInstruction().getMaxNumberOfCellsPerSlice()
117117
&& tomatoesNumber >= pizza.getSliceInstruction().getMinNumberOfIngredientPerSlice()
118118
&& mushroomsNumber >= pizza.getSliceInstruction().getMinNumberOfIngredientPerSlice();
119-
LOGGER.info("\n" + pizza.getSliceInstruction() +
119+
LOGGER.debug("\n" + pizza.getSliceInstruction() +
120120
"\nSlice :" + this +
121121
"\npassed validation: " + isPassedSliceInstructions);
122122
return isPassedSliceInstructions;
@@ -132,7 +132,7 @@ public Step generateStepAbove(Pizza pizza) {
132132
if (cell.isPresent()) {
133133
delta.cells.add(cell.get());
134134
} else {
135-
LOGGER.info("cant perform step left !");
135+
LOGGER.debug("cant perform step left !");
136136
return null;
137137
}
138138
}
@@ -142,7 +142,7 @@ public Step generateStepAbove(Pizza pizza) {
142142
if (step.isValid(pizza)) {
143143
return step;
144144
} else {
145-
LOGGER.info("step is invalid !");
145+
LOGGER.debug("step is invalid !");
146146
return null;
147147
}
148148
}
@@ -155,7 +155,7 @@ public Step generateStepBelow(Pizza pizza) {
155155
if (cell.isPresent()) {
156156
delta.cells.add(cell.get());
157157
} else {
158-
LOGGER.info("cant perform step left !");
158+
LOGGER.debug("cant perform step left !");
159159
return null;
160160
}
161161
}
@@ -165,7 +165,7 @@ public Step generateStepBelow(Pizza pizza) {
165165
if (step.isValid(pizza)) {
166166
return step;
167167
} else {
168-
LOGGER.info("step is invalid !");
168+
LOGGER.debug("step is invalid !");
169169
return null;
170170
}
171171
}
@@ -178,7 +178,7 @@ public Step generateStepLeft(Pizza pizza) {
178178
if (cell.isPresent()) {
179179
delta.cells.add(cell.get());
180180
} else {
181-
LOGGER.info("cant perform step left !");
181+
LOGGER.debug("cant perform step left !");
182182
return null;
183183
}
184184
}
@@ -188,7 +188,7 @@ public Step generateStepLeft(Pizza pizza) {
188188
if (step.isValid(pizza)) {
189189
return step;
190190
} else {
191-
LOGGER.info("step is invalid !");
191+
LOGGER.debug("step is invalid !");
192192
return null;
193193
}
194194
}
@@ -201,7 +201,7 @@ public Step generateStepRight(Pizza pizza) {
201201
if (cell.isPresent()) {
202202
delta.cells.add(cell.get());
203203
} else {
204-
LOGGER.info("cant perform step right !");
204+
LOGGER.debug("cant perform step right !");
205205
return null;
206206
}
207207
}
@@ -211,7 +211,7 @@ public Step generateStepRight(Pizza pizza) {
211211
if (step.isValid(pizza)) {
212212
return step;
213213
} else {
214-
LOGGER.info("step is invalid !");
214+
LOGGER.debug("step is invalid !");
215215
return null;
216216
}
217217
}

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

Lines changed: 39 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,23 @@ private DFSMethods() {
1818
* If used start position hasn't any steps and is invalid for a pizza ->
1919
* remove this slice from startPositions and add all it's cells to the pizza.
2020
*
21-
* @param pizza given pizza
22-
* @param startPositions given slices in the pizza
23-
* @param output list of valid slices
21+
* @param pizza given pizza(mutable)
22+
* @param startPositions given slices in the pizza(mutable)
23+
* @param output list of valid slices(mutable)
2424
* @return available steps
2525
*/
2626
public static Map<Slice, List<Step>> getAvailableSteps(Pizza pizza, List<Slice> startPositions, List<Slice> output) {
27-
Profiler profiler = new Profiler();
2827
Map<Slice, List<Step>> groupedSteps = new HashMap<>();
29-
Iterator iter = startPositions.iterator();
28+
Iterator iter;
29+
//optimization for big arrays
30+
if (startPositions.size() > 1_000) {
31+
List<Slice> startPositionsSubset = startPositions.subList(0, 20);
32+
iter = startPositionsSubset.iterator();
33+
}
34+
//iterate over all the start positions
35+
else {
36+
iter = startPositions.iterator();
37+
}
3038
while (iter.hasNext()) {
3139
Slice startPosition = (Slice) iter.next();
3240

@@ -58,7 +66,7 @@ public static Map<Slice, List<Step>> getAvailableSteps(Pizza pizza, List<Slice>
5866
groupedSteps.put(startPosition, steps);
5967
}
6068
}
61-
LOGGER.info("available steps for" +
69+
LOGGER.debug("available steps for" +
6270
"\npizza: " + pizza
6371
+ "\nsteps: " + groupedSteps);
6472
return groupedSteps;
@@ -68,53 +76,58 @@ public static Map<Slice, List<Step>> getAvailableSteps(Pizza pizza, List<Slice>
6876
* Pick-ups a step with a minimal cells delta number,
6977
* execute it(cut it from the pizza, and add to a slice)
7078
*
71-
* @param pizza given pizza
79+
* @param pizza given pizza(mutable)
7280
* @param step step to perform
73-
* @param startPositions
74-
* @param output @return formed slice that includes an original slice and delta from a step
81+
* @param startPositions given start positions(mutable_
82+
* @param output given list of output slices
7583
*/
7684
public static void performStep(Pizza pizza, Step step, List<Slice> startPositions, List<Slice> output) {
7785
//1. Pick ups a steps list with minimal total cells number
78-
LOGGER.info("STEP TO PERFORM " + step);
86+
LOGGER.debug("STEP TO PERFORM " + step);
7987
//2. Cut all the step delta cells from pizza
80-
LOGGER.info("pizza before step: " + pizza
88+
LOGGER.debug("pizza before step: " + pizza
8189
+ "\ndelta to remove from the pizza: " + step.delta);
8290
pizza.getCells().removeAll(step.delta.cells);
83-
84-
//3. remove previous version start position from startPositions
91+
//3. remove step start position from total start positions
8592
startPositions.remove(step.startPosition);
86-
8793
List<Cell> returnedList = step.startPosition.cells;
8894
returnedList.addAll(step.delta.cells);
8995
Slice finalSlice = new Slice(returnedList);
90-
91-
LOGGER.info("PIZZA AFTER STEP:" + pizza);
92-
//3. Add the step cells to an output slice
93-
94-
if (finalSlice.cells.size() == pizza.getSliceInstruction().getMaxNumberOfCellsPerSlice()) {
96+
LOGGER.debug("PIZZA AFTER STEP:" + pizza);
97+
//3. Add the step cells to an output slice if it's valid
98+
if (finalSlice.isValid(pizza)) {
9599
output.add(finalSlice);
96-
} else {
100+
}
101+
//4. add start position + delta to start positions
102+
else {
97103
startPositions.add(finalSlice);
98104
}
99105
}
100106

101107
/**
102108
* Selects a step which start position has minimal delta in all the steps
103109
*
104-
* @param steps
105-
* @return
110+
* @param steps given steps
111+
* @return optimal step
106112
*/
107113
public static Step selectStep(Map<Slice, List<Step>> steps) {
108114
List<Step> min = steps.values().stream()
109-
.min(Comparator.comparingLong(value -> value.stream().map(step -> step.delta.cells.size()).count())).get();
115+
.min(Comparator.comparingLong(value ->
116+
value.stream()
117+
.map(step -> step.delta.cells.size())
118+
.count()))
119+
.get();
110120
if (!min.isEmpty()) {
111-
LOGGER.info("steps list with minimal number of delta cells: " + min);
121+
LOGGER.debug("steps list with minimal number of delta cells: " + min);
112122
return min.get(0);
113123
} else {
114-
Optional<List<Step>> optionalStep = steps.values().stream().filter(steps1 -> !steps1.isEmpty()).findFirst();
124+
Optional<List<Step>> optionalStep = steps.values()
125+
.stream()
126+
.filter(steps1 -> !steps1.isEmpty())
127+
.findFirst();
115128
if (optionalStep.isPresent()) {
116129
final Step step = optionalStep.get().get(0);
117-
LOGGER.info("Selected step to perform:" + step);
130+
LOGGER.debug("Selected step to perform:" + step);
118131
return step;
119132
} else return null;
120133
}

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,6 @@ public void performStep() {
5353
List<Slice> output = new ArrayList<>();
5454
Map<Slice, List<Step>> availableSteps = DFSMethods.getAvailableSteps(pizza, startPositions, output);
5555
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));
5856
assertEquals(11, pizza.getCells().size());
5957
}
6058
}

0 commit comments

Comments
 (0)