From d6e56961226f46f5888841ae2ba93379eb009c1d Mon Sep 17 00:00:00 2001 From: vaasu Date: Wed, 1 Apr 2020 05:10:15 +0530 Subject: [PATCH] Added files for generating route --- ...a => TruecallerAssignmentApplication.java} | 4 +- .../TruecallerAssignmentController.java | 30 ++++- .../backend/entities/CBRouteResponse.java | 7 + .../backend/entities/Tile.java | 49 ++----- .../backend/services/ChessBoardService.java | 26 ++++ .../backend/utilities/ChessBoardUtility.java | 123 ++++++++++++++++++ 6 files changed, 195 insertions(+), 44 deletions(-) rename src/main/java/com/truecaller/truecallerassignment/backend/{AssignmentApplication.java => TruecallerAssignmentApplication.java} (67%) create mode 100644 src/main/java/com/truecaller/truecallerassignment/backend/entities/CBRouteResponse.java create mode 100644 src/main/java/com/truecaller/truecallerassignment/backend/services/ChessBoardService.java create mode 100644 src/main/java/com/truecaller/truecallerassignment/backend/utilities/ChessBoardUtility.java diff --git a/src/main/java/com/truecaller/truecallerassignment/backend/AssignmentApplication.java b/src/main/java/com/truecaller/truecallerassignment/backend/TruecallerAssignmentApplication.java similarity index 67% rename from src/main/java/com/truecaller/truecallerassignment/backend/AssignmentApplication.java rename to src/main/java/com/truecaller/truecallerassignment/backend/TruecallerAssignmentApplication.java index adf40a8..be04b02 100644 --- a/src/main/java/com/truecaller/truecallerassignment/backend/AssignmentApplication.java +++ b/src/main/java/com/truecaller/truecallerassignment/backend/TruecallerAssignmentApplication.java @@ -4,10 +4,10 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication -public class AssignmentApplication { +public class TruecallerAssignmentApplication { public static void main(String[] args) { - SpringApplication.run(AssignmentApplication.class, args); + SpringApplication.run(TruecallerAssignmentApplication.class, args); } } diff --git a/src/main/java/com/truecaller/truecallerassignment/backend/controller/TruecallerAssignmentController.java b/src/main/java/com/truecaller/truecallerassignment/backend/controller/TruecallerAssignmentController.java index b771560..ce39fdb 100644 --- a/src/main/java/com/truecaller/truecallerassignment/backend/controller/TruecallerAssignmentController.java +++ b/src/main/java/com/truecaller/truecallerassignment/backend/controller/TruecallerAssignmentController.java @@ -1,17 +1,37 @@ package com.truecaller.truecallerassignment.backend.controller; -import java.util.concurrent.atomic.AtomicLong; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import com.truecaller.truecallerassignment.backend.entities.Tile; +import com.truecaller.truecallerassignment.backend.services.ChessBoardService; +import com.truecaller.truecallerassignment.backend.utilities.ChessBoardUtility; + @RestController public class TruecallerAssignmentController { - private static final String template = "Hello, %s!"; - private final AtomicLong counter = new AtomicLong(); + + @Autowired + private ChessBoardService service; + + @Autowired + private ChessBoardUtility utility; @GetMapping("/") - public String index() { - return "Hello there! I'm running."; + public List findPath(@RequestParam int row, @RequestParam int column) { + Set allTiles = utility.populateAllTiles(); + allTiles.stream().forEach(tile -> utility.generateAllowedMoves(tile, allTiles)); + Tile tile = utility.getTile(row, column, allTiles); + List traversedTiles = new ArrayList(); + service.findPath(tile, traversedTiles); + utility.transformResponse(traversedTiles); + return traversedTiles; } + + } \ No newline at end of file diff --git a/src/main/java/com/truecaller/truecallerassignment/backend/entities/CBRouteResponse.java b/src/main/java/com/truecaller/truecallerassignment/backend/entities/CBRouteResponse.java new file mode 100644 index 0000000..0eb2b3f --- /dev/null +++ b/src/main/java/com/truecaller/truecallerassignment/backend/entities/CBRouteResponse.java @@ -0,0 +1,7 @@ +package com.truecaller.truecallerassignment.backend.entities; + +public class CBRouteResponse { + private int row; + private int column; + private int order; +} diff --git a/src/main/java/com/truecaller/truecallerassignment/backend/entities/Tile.java b/src/main/java/com/truecaller/truecallerassignment/backend/entities/Tile.java index 436ab18..6a05d87 100644 --- a/src/main/java/com/truecaller/truecallerassignment/backend/entities/Tile.java +++ b/src/main/java/com/truecaller/truecallerassignment/backend/entities/Tile.java @@ -1,6 +1,5 @@ package com.truecaller.truecallerassignment.backend.entities; -import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @@ -9,6 +8,7 @@ public class Tile { private int column; private boolean visited; private List allowedMoves; + private String allowedMovesUI; public Tile(int row, int column, boolean visited) { super(); @@ -41,47 +41,22 @@ public class Tile { public void setVisited(boolean visited) { this.visited = visited; } - - public String getAllowedMoves() { - String moves = null; - if (allowedMoves != null) { - moves = allowedMoves.stream().map(tile -> tile.row + "-" + tile.column).collect(Collectors.joining(", ")); - } - - return moves; + + public List getAllowedMoves() { + return allowedMoves; } - + public void setAllowedMoves(List allowedMoves) { this.allowedMoves = allowedMoves; } - /** - * Function to generate all possible moves from a tile based on it's current position. - * - * @return List list of all positions possible from given tile - * - */ -// public void generateAllowedMoves() { -// List allowedMoves = new ArrayList(); -// if (row > 3) -// allowedMoves.add(getTile(row - 3, column)); -// if (row < 8) -// allowedMoves.add(getTile(row + 3, column)); -// if (column > 3) -// allowedMoves.add(getTile(row, column - 3)); -// if (column < 8) -// allowedMoves.add(getTile(row, column + 3)); -// if (row > 2 && column > 2) -// allowedMoves.add(getTile(row - 2, column - 2)); -// if (row > 2 && column < 9) -// allowedMoves.add(getTile(row - 2, column + 2)); -// if (row < 9 && column > 2) -// allowedMoves.add(getTile(row + 2, column - 2)); -// if (row < 9 && column < 9) -// allowedMoves.add(getTile(row + 2, column + 2)); -// -// this.allowedMoves = allowedMoves.stream().filter(tile -> !tile.visited).collect(Collectors.toList()); -// } + public String getAllowedMovesUI() { + return allowedMovesUI; + } + + public void setAllowedMovesUI(String allowedMovesUI) { + this.allowedMovesUI = allowedMovesUI; + } @Override public String toString() { diff --git a/src/main/java/com/truecaller/truecallerassignment/backend/services/ChessBoardService.java b/src/main/java/com/truecaller/truecallerassignment/backend/services/ChessBoardService.java new file mode 100644 index 0000000..624d8f6 --- /dev/null +++ b/src/main/java/com/truecaller/truecallerassignment/backend/services/ChessBoardService.java @@ -0,0 +1,26 @@ +package com.truecaller.truecallerassignment.backend.services; + +import java.util.List; + +import org.springframework.stereotype.Service; + +import com.truecaller.truecallerassignment.backend.entities.Tile; + +@Service +public class ChessBoardService { + + public static void findPath(Tile currentTile, List traversedTiles) { + if (currentTile.isVisited()) { + return; + } + if (currentTile.isVisited()) { + return; + } + currentTile.setVisited(true); + traversedTiles.add(currentTile); + if (traversedTiles.size() == 100) { + return; + } + currentTile.getAllowedMoves().stream().forEach(tile -> findPath(tile, traversedTiles)); + } +} diff --git a/src/main/java/com/truecaller/truecallerassignment/backend/utilities/ChessBoardUtility.java b/src/main/java/com/truecaller/truecallerassignment/backend/utilities/ChessBoardUtility.java new file mode 100644 index 0000000..0105b51 --- /dev/null +++ b/src/main/java/com/truecaller/truecallerassignment/backend/utilities/ChessBoardUtility.java @@ -0,0 +1,123 @@ +package com.truecaller.truecallerassignment.backend.utilities; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import org.springframework.stereotype.Component; + +import com.truecaller.truecallerassignment.backend.entities.Tile; + +@Component +public class ChessBoardUtility { + + public static Set populateAllTiles() { + return IntStream.rangeClosed(1, 10).boxed().flatMap( + row -> IntStream.rangeClosed(1, 10) + .boxed().map(column -> new Tile(row, column, false))).collect(Collectors.toSet()); + } + + public static Tile getTile(int x, int y, Set allTiles) { + if (allTiles == null) { + allTiles = new HashSet(); + } + List pList = allTiles.stream().filter(tile -> tile.getRow() == x && tile.getColumn() == y).collect(Collectors.toList()); + if (pList.size() != 0) { + return pList.get(0); + } else { + Tile p = new Tile(x, y, false); + allTiles.add(p); + return p; + } + } + + public static void displayPath(List traversedTiles) { + Function tileToPosition = tile -> tile.getRow() + "," + tile.getColumn(); + if (traversedTiles.size() == 100) { + String path = traversedTiles.stream().map(tileToPosition).collect(Collectors.joining(" => ")); + System.out.println("Found a tour from the specified position:\n" + path); + } else { + System.out.println("No path could be generated with given initial position and rules of movement!"); + } + } + + public static void displayAdvanced(List traversedTiles) { + Function tileToPosition = tile -> tile.getRow() + "," + tile.getColumn(); + int count = 1; + String [][] chessBoard = new String[10][10]; + if (traversedTiles.size() == 100) { + for (Tile tile : traversedTiles) { + String displayValue = count + ": " + tile.getRow() + "-" + tile.getColumn(); + count++; + chessBoard[tile.getRow() - 1][tile.getColumn()-1] = displayValue; + } + System.out.println("Found a tour from the specified position:\n"); +// Stream.of(chessBoard) +// .flatMap(Stream::of) +//// .map(t -> Integer.parseInt(t.substring(0, t.indexOf(":")))) +//// .sorted((t1, t2) -> Integer.compare(Integer.parseInt(t1.substring(0, t1.indexOf(":"))), Integer.parseInt(t2.substring(0, t2.indexOf(":"))))) +// .forEach(System.out::print); + for (int i = 0; i < chessBoard.length; i++) { + System.out.println(); + if (i == 9) { + for (int j = 0; j < chessBoard[0].length; j++) { + System.out.print(chessBoard[i][j] + "\t"); + } + } else { + for (int j = 0; j < chessBoard[0].length; j++) { + System.out.print(chessBoard[i][j] + "\t\t"); + } + } + } + } else { + System.out.println("No path could be generated with given initial position and rules of movement!"); + } + } + + /** + * Function to generate all possible moves from a tile based on it's current position. + * + * @return List list of all positions possible from given tile + * + */ + public void generateAllowedMoves(Tile tile, Set allTiles) { + List allowedMoves = new ArrayList(); + int row = tile.getRow(); + int column = tile.getColumn(); + if (row > 3) + allowedMoves.add(getTile(row - 3, column, allTiles)); + if (row < 8) + allowedMoves.add(getTile(row + 3, column, allTiles)); + if (column > 3) + allowedMoves.add(getTile(row, column - 3, allTiles)); + if (column < 8) + allowedMoves.add(getTile(row, column + 3, allTiles)); + if (row > 2 && column > 2) + allowedMoves.add(getTile(row - 2, column - 2, allTiles)); + if (row > 2 && column < 9) + allowedMoves.add(getTile(row - 2, column + 2, allTiles)); + if (row < 9 && column > 2) + allowedMoves.add(getTile(row + 2, column - 2, allTiles)); + if (row < 9 && column < 9) + allowedMoves.add(getTile(row + 2, column + 2, allTiles)); + + tile.setAllowedMoves(allowedMoves.stream().filter(tile1 -> !tile1.isVisited()).collect(Collectors.toList())); + } + + public void transformResponse(List traversedTiles) { + traversedTiles = traversedTiles.stream().map(tile -> { + List tiles = tile.getAllowedMoves(); + String moves = null; + if (tiles != null) { + moves = tiles.stream().map(tile1 -> tile1.getRow() + "-" + tile1.getColumn()).collect(Collectors.joining(", ")); + } + tile.setAllowedMoves(null); + tile.setAllowedMovesUI(moves); + return tile; + }).collect(Collectors.toList()); + } +}