1
0
Fork 0

move to PositionResolver the concern of the appropiated threshold for each case

This commit is contained in:
Xavier Fontanet 2024-06-22 18:55:33 +02:00
parent 3b8595c630
commit cae3fa399e
5 changed files with 58 additions and 22 deletions

View File

@ -18,7 +18,7 @@ public class MarsRover implements RotableRiderRover{
@Override @Override
public void moveTowards(Direction direction) { public void moveTowards(Direction direction) {
Coordinates newPosition = marsMap.getNewPositionTowards(direction); Coordinates newPosition = marsMap.getNextPositionTowards(direction);
boolean willCollide = marsMap.willCollideWithObstacle(newPosition); boolean willCollide = marsMap.willCollideWithObstacle(newPosition);
if (willCollide) { if (willCollide) {
roverActionReporter.reportObstacle(newPosition); roverActionReporter.reportObstacle(newPosition);

View File

@ -10,7 +10,7 @@ public class RoverActionReporter {
Logger logger = Logger.getLogger(this.getClass().getName()); Logger logger = Logger.getLogger(this.getClass().getName());
private static final String OBSTACLE_REPORT_MESSAGE = "There is an obstacle at %s, therefore I will keep the same position"; private static final String OBSTACLE_REPORT_MESSAGE = "There is an obstacle at %s, therefore I will keep the same position";
private static final String MOVEMENT_REPORT_MESSAGE = "Updated coordinates towards %s, now is %d-%d"; private static final String MOVEMENT_REPORT_MESSAGE = "Updated coordinates towards %s, now is %s-%s";
public static final String ROTATION_REPORT_MESSGE = "Rotated towards %s, now the direction is %s"; public static final String ROTATION_REPORT_MESSGE = "Rotated towards %s, now the direction is %s";
public void reportObstacle(Coordinates newPosition) { public void reportObstacle(Coordinates newPosition) {

View File

@ -1,17 +1,30 @@
package cat.hack3.codingtests.marsrover.cartography; package cat.hack3.codingtests.marsrover.cartography;
public record Coordinates(int latitude, int longitude) { public record Coordinates(Latitude latitude, Longitude longitude) {
public static Coordinates of(int latitude, int longitude) { public static Coordinates of(long latitude, long longitude) {
return new Coordinates(latitude, longitude); return new Coordinates(new Latitude(latitude), new Longitude(longitude));
} }
public Coordinates ofUpdatedLatitude(int newLatitude) { public Coordinates ofUpdatedLatitude(long newLatitude) {
return new Coordinates(newLatitude, longitude); return Coordinates.of(newLatitude, longitude.pointer);
} }
public Coordinates ofUpdatedLongitude(int newLongitude) { public Coordinates ofUpdatedLongitude(long newLongitude) {
return new Coordinates(latitude, newLongitude); return Coordinates.of(latitude.pointer, newLongitude);
}
record Latitude(long pointer) {
@Override
public String toString() {
return String.valueOf(pointer);
}
}
record Longitude(long pointer) {
@Override
public String toString() {
return String.valueOf(pointer);
}
} }
} }

View File

@ -1,22 +1,45 @@
package cat.hack3.codingtests.marsrover.cartography; package cat.hack3.codingtests.marsrover.cartography;
import cat.hack3.codingtests.marsrover.cartography.Coordinates.Latitude;
import cat.hack3.codingtests.marsrover.cartography.Coordinates.Longitude;
public class MapIncrementalPositionResolver { public class MapIncrementalPositionResolver {
private final int firstPositionInMap; private final int firstPositionInMap;
private final int incrementUnit; private final int incrementUnit;
private final long maximumYPosition;
private final long maximumXPosition;
public MapIncrementalPositionResolver(int firstPositionInMap, int incrementUnit) { public MapIncrementalPositionResolver(int firstPositionInMap, int incrementUnit, long maximumYPosition, long maximumXPosition) {
this.firstPositionInMap = firstPositionInMap; this.firstPositionInMap = firstPositionInMap;
this.incrementUnit = incrementUnit; this.incrementUnit = incrementUnit;
this.maximumYPosition = maximumYPosition;
this.maximumXPosition = maximumXPosition;
} }
int getIncrementedPosition(int currentPosition, int threshold) { long getIncremented(Longitude longitude) {
return getIncremented(longitude.pointer(), maximumXPosition);
}
long getIncremented(Latitude latitude) {
return getIncremented(latitude.pointer(), maximumYPosition);
}
private long getIncremented(long currentPosition, long threshold) {
return currentPosition + incrementUnit > threshold return currentPosition + incrementUnit > threshold
? firstPositionInMap ? firstPositionInMap
: ++currentPosition; : ++currentPosition;
} }
int getDecrementedPosition(int currentPosition, int threshold) { long getDecremented(Latitude latitude) {
return getDecremented(latitude.pointer(), maximumYPosition);
}
long getDecremented(Longitude longitude) {
return getDecremented(longitude.pointer(), maximumYPosition);
}
private long getDecremented(long currentPosition, long threshold) {
return currentPosition - incrementUnit < firstPositionInMap return currentPosition - incrementUnit < firstPositionInMap
? threshold ? threshold
: --currentPosition; : --currentPosition;

View File

@ -31,10 +31,10 @@ public class MarsMap {
this.width = width; this.width = width;
currentPosition = startingCoordinates; currentPosition = startingCoordinates;
this.obstaclesLocalizations = obstaclesLocalizations.length > 0 ? obstaclesLocalizations[0] : List.of(); this.obstaclesLocalizations = obstaclesLocalizations.length > 0 ? obstaclesLocalizations[0] : List.of();
positionResolver = new MapIncrementalPositionResolver(FIRST_POSITION_IN_MAP, INCREMENT_UNIT); positionResolver = new MapIncrementalPositionResolver(FIRST_POSITION_IN_MAP, INCREMENT_UNIT, height, width);
} }
public Coordinates getNewPositionTowards(Direction direction) { public Coordinates getNextPositionTowards(Direction direction) {
return switch (direction) { return switch (direction) {
case NORTH -> getDecrementLatitude(); case NORTH -> getDecrementLatitude();
case SOUTH -> getIncrementLatitude(); case SOUTH -> getIncrementLatitude();
@ -44,26 +44,26 @@ public class MarsMap {
} }
private Coordinates getIncrementLatitude() { private Coordinates getIncrementLatitude() {
int latitude = currentPosition.latitude(); var latitude = currentPosition.latitude();
int newLatitude = positionResolver.getIncrementedPosition(latitude, height); long newLatitude = positionResolver.getIncremented(latitude);
return currentPosition.ofUpdatedLatitude(newLatitude); return currentPosition.ofUpdatedLatitude(newLatitude);
} }
private Coordinates getDecrementLatitude() { private Coordinates getDecrementLatitude() {
int latitude = currentPosition.latitude(); var latitude = currentPosition.latitude();
int newLatitude = positionResolver.getDecrementedPosition(latitude, height); long newLatitude = positionResolver.getDecremented(latitude);
return currentPosition.ofUpdatedLatitude(newLatitude); return currentPosition.ofUpdatedLatitude(newLatitude);
} }
private Coordinates getIncrementLongitude() { private Coordinates getIncrementLongitude() {
int longitude = currentPosition.longitude(); var longitude = currentPosition.longitude();
int newLongitude = positionResolver.getIncrementedPosition(longitude, width); long newLongitude = positionResolver.getIncremented(longitude);
return currentPosition.ofUpdatedLongitude(newLongitude); return currentPosition.ofUpdatedLongitude(newLongitude);
} }
private Coordinates getDecrementLongitude() { private Coordinates getDecrementLongitude() {
int longitude = currentPosition.longitude(); var longitude = currentPosition.longitude();
int newLongitude = positionResolver.getDecrementedPosition(longitude, width); long newLongitude = positionResolver.getDecremented(longitude);
return currentPosition.ofUpdatedLongitude(newLongitude); return currentPosition.ofUpdatedLongitude(newLongitude);
} }