diff --git a/module/module.iml b/module/module.iml
new file mode 100644
index 00000000..c90834f2
--- /dev/null
+++ b/module/module.iml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/module/src/snakesAndLadders/Main.java b/module/src/snakesAndLadders/Main.java
new file mode 100644
index 00000000..a0569654
--- /dev/null
+++ b/module/src/snakesAndLadders/Main.java
@@ -0,0 +1,42 @@
+package snakesAndLadders;
+
+import snakesAndLadders.game.Game;
+import snakesAndLadders.model.Player;
+
+import java.util.*;
+
+//TIP To Run code, press or
+// click the icon in the gutter.
+public class Main {
+ public static void main(String[] args) {
+ Scanner sc = new Scanner(System.in);
+ System.out.println("Please enter number of snakes: ");
+ int snakeCount = sc.nextInt();
+ Map snakes = new HashMap<>();
+ for(int i = 0; i < snakeCount; i++){
+ System.out.println("Enter snake head and tail: ");
+ int head = sc.nextInt();
+ int tail = sc.nextInt();
+ snakes.put(head, tail);
+ }
+ System.out.println("Please enter number of ladders: ");
+ int ladderCount = sc.nextInt();
+ Map ladders = new HashMap<>();
+ for(int i = 0; i < ladderCount; i++){
+ System.out.println("Enter ladder base and top: ");
+ int base = sc.nextInt();
+ int top = sc.nextInt();
+ ladders.put(base, top);
+ }
+ System.out.println("Please enter number of players: ");
+ int playerCount = sc.nextInt();
+ List players = new ArrayList<>();
+ for(int i = 0; i < playerCount; i++){
+ System.out.println("Enter player name: ");
+ String name = sc.next();
+ players.add(new Player(name));
+ }
+ Game game = new Game(players, snakes, ladders);
+ game.start();
+ }
+}
\ No newline at end of file
diff --git a/module/src/snakesAndLadders/board/Board.java b/module/src/snakesAndLadders/board/Board.java
new file mode 100644
index 00000000..c697adff
--- /dev/null
+++ b/module/src/snakesAndLadders/board/Board.java
@@ -0,0 +1,22 @@
+package snakesAndLadders.board;
+
+import java.util.Map;
+
+public class Board {
+ int size = 100;
+ Map snakes;
+ Map ladders;
+ public Board(Map snakes, Map ladders){
+ this.snakes = snakes;
+ this.ladders = ladders;
+ }
+ public int getNextPosition(int position){
+ if(snakes.containsKey(position)){
+ return snakes.get(position);
+ }
+ if(ladders.containsKey(position)){
+ return ladders.get(position);
+ }
+ return position;
+ }
+}
diff --git a/module/src/snakesAndLadders/game/Game.java b/module/src/snakesAndLadders/game/Game.java
new file mode 100644
index 00000000..3e8590fe
--- /dev/null
+++ b/module/src/snakesAndLadders/game/Game.java
@@ -0,0 +1,41 @@
+package snakesAndLadders.game;
+
+import snakesAndLadders.board.Board;
+import snakesAndLadders.model.Dice;
+import snakesAndLadders.model.Player;
+
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Queue;
+
+public class Game {
+ Queue players;
+ Board board;
+ Dice dice;
+ public Game(List players, Map snakes, Map ladders){
+ this.players = new LinkedList(players);
+ this.board = new Board(snakes,ladders);
+ this.dice = new Dice();
+ }
+ public void start(){
+ while(!players.isEmpty()){
+ Player current = players.peek();
+ players.remove();
+ int roll = dice.roll();
+ System.out.println("Player "+current.getName()+" rolled: "+roll);
+ int newPosition = current.getPosition() + roll;
+ if(newPosition > 100){
+ newPosition = current.getPosition();
+ } else{
+ newPosition = board.getNextPosition(newPosition);
+ }
+ current.setPosition(newPosition);
+ if(newPosition == 100){
+ System.out.println("Player " + current.getName() + " won!");
+ break;
+ }
+ players.add(current);
+ }
+ }
+}
diff --git a/module/src/snakesAndLadders/model/Dice.java b/module/src/snakesAndLadders/model/Dice.java
new file mode 100644
index 00000000..51aaf3be
--- /dev/null
+++ b/module/src/snakesAndLadders/model/Dice.java
@@ -0,0 +1,7 @@
+package snakesAndLadders.model;
+
+public class Dice {
+ public int roll(){
+ return 1 + (int)(Math.random()*6);
+ }
+}
diff --git a/module/src/snakesAndLadders/model/Player.java b/module/src/snakesAndLadders/model/Player.java
new file mode 100644
index 00000000..e76e210c
--- /dev/null
+++ b/module/src/snakesAndLadders/model/Player.java
@@ -0,0 +1,20 @@
+package snakesAndLadders.model;
+
+public class Player {
+ String name;
+ int position;
+
+ public Player(String name) {
+ this.name = name;
+ this.position = 0;
+ }
+ public String getName() {
+ return name;
+ }
+ public int getPosition() {
+ return position;
+ }
+ public void setPosition(int position) {
+ this.position = position;
+ }
+}
diff --git a/module/src/splitwise/Main.java b/module/src/splitwise/Main.java
new file mode 100644
index 00000000..34c3c395
--- /dev/null
+++ b/module/src/splitwise/Main.java
@@ -0,0 +1,80 @@
+package splitwise;
+
+import snakesAndLadders.game.Game;
+import snakesAndLadders.model.Player;
+import splitwise.model.Expense;
+import splitwise.model.Splitwise;
+import splitwise.model.User;
+
+import java.util.*;
+
+//TIP To Run code, press or
+// click the icon in the gutter.
+public class Main {
+ public static void main(String[] args) {
+ System.out.println("Welcome to Splitwise.");
+ Scanner sc = new Scanner(System.in);
+
+ User user1 = new User("Charu", "charu@sweet.com", 12345);
+ User user2 = new User("Rathi", "rathi@cute.com", 23456);
+ User user3 = new User("Ishita", "ishita@logic.com", 34567);
+ User user4 = new User("Kareena", "kareena@bitch.com", 45678);
+ List users = new ArrayList<>(Arrays.asList(user1, user2, user3, user4));
+ Splitwise splitwise = new Splitwise(users);
+ Map map = new HashMap<>();
+ for ( User u : users ) {
+ map.put(u.getName().toUpperCase(), u);
+ }
+ System.out.println("Commands: SHOW, SHOW , EXPENSE ..., EXIT");
+ while(true) {
+ System.out.println("> ");
+ String input = sc.nextLine().trim();
+ if (input.equalsIgnoreCase("EXIT")) {
+ System.out.println("Bye bye!");
+ break;
+ }
+ String[] commands = input.split(" ");
+ if (commands[0].equalsIgnoreCase("SHOW")) {
+ if (commands.length == 1) {
+ splitwise.showBalances();
+ } else if (commands.length == 2) {
+ User user = map.get(commands[1].toUpperCase());
+ if (user == null) {
+ System.out.println("User " + commands[1].toUpperCase() + " not found!");
+ continue;
+ }
+ splitwise.showBalances(user);
+ } else {
+ System.out.println("Wrong command!");
+ continue;
+ }
+ }
+ if (commands[0].equalsIgnoreCase("EXPENSE")) {
+ User payer = map.get(commands[1].toUpperCase());
+ if (payer == null) {
+ System.out.println("User " + commands[1].toUpperCase() + " not found!");
+ continue;
+ }
+ double totalExpense = Double.parseDouble(commands[2]);
+ int size = Integer.parseInt(commands[3]);
+ List payees = new ArrayList<>();
+ for (int i = 0; i < size; i++) {
+ payees.add(map.get(commands[i+4].toUpperCase()));
+ }
+ Expense.ExpenseType type = Expense.ExpenseType.valueOf(commands[4+size]);
+ List expenses = new ArrayList<>();
+ for(int i=5+size;i users;
+ List expenses;
+
+ public Expense(User payer, double totalExpense, ExpenseType type, List users, List expenses) {
+ this.payer = payer;
+ this.totalExpense = totalExpense;
+ this.type = type;
+ this.users = users;
+ this.size = users.size();
+ this.expenses = expenses;
+ }
+
+ public Expense(User payer, double totalExpense, ExpenseType type, List users) {
+ this(payer, totalExpense, type, users, null);
+ }
+}
diff --git a/module/src/splitwise/model/Splitwise.java b/module/src/splitwise/model/Splitwise.java
new file mode 100644
index 00000000..a4646f70
--- /dev/null
+++ b/module/src/splitwise/model/Splitwise.java
@@ -0,0 +1,113 @@
+package splitwise.model;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class Splitwise {
+ List users;
+ double [][] Balances;
+
+ public Splitwise(List users) {
+ this.users = users;
+ this.Balances = new double[users.size()][users.size()];
+ for (int i = 0; i < users.size(); i++) {
+ for (int j = 0; j < users.size(); j++) {
+ Balances[i][j] = 0;
+ }
+ }
+ }
+
+ boolean showBalances(User user1, boolean showOnlyNegative) {
+ int pos = users.indexOf(user1);
+ boolean nobalance = true;
+ for (int i = 0; i < Balances[pos].length; i++) {
+ if (Balances[pos][i] > 0) {
+ nobalance = false;
+ if (showOnlyNegative) continue;
+ System.out.println(user1.getName() + " owes " + users.get(i).getName() + ": " + Balances[pos][i]);
+ } else if(Balances[pos][i] < 0) {
+ nobalance = false;
+ System.out.println(users.get(i).getName() + " owes " + user1.getName() + ": " + Balances[i][pos]);
+ }
+ }
+ return nobalance;
+ }
+
+ public void showBalances(User user1) {
+ boolean nobalance = showBalances(user1, false);
+ if(nobalance){
+ System.out.println("No balances");
+ }
+ }
+
+ public void showBalances() {
+ boolean nobalance = true;
+ for (int i = 0; i < users.size(); i++) {
+ boolean val = showBalances(users.get(i), true);
+ if(!val){
+ nobalance = false;
+ }
+ }
+ if(nobalance){
+ System.out.println("No balances");
+ }
+ }
+
+ void setBalances(User user1, User user2, double expense) {
+ int pos1 = users.indexOf(user1);
+ int pos2 = users.indexOf(user2);
+ Balances[pos1][pos2] -= expense;
+ Balances[pos2][pos1] += expense;
+ addPersonalExpense(user2, expense);
+ }
+
+ void addPersonalExpense(User user2, double expense) {
+ user2.expenses += expense;
+ }
+
+ private double roundToTwoDecimals(double amount) {
+ return Math.round(amount * 100.0) / 100.0;
+ }
+
+ public void addExpense(Expense expense) {
+ User payer = expense.payer;
+ Expense.ExpenseType type = expense.type;
+ double totalExpense = expense.totalExpense;
+ int size = expense.size;
+ List users = expense.users;
+ List expenses = expense.expenses;
+ switch (expense.type) {
+ case EQUAL -> {
+ double base = Math.floor((totalExpense / size) * 100) / 100.0;
+ double remainder = totalExpense - (base * size);
+ int extra = (int)Math.round(remainder * 100);
+ for (int i = 0; i < size; i++) {
+ double amount = i < extra ? base + 0.01 : base;
+ setBalances(payer, users.get(i), roundToTwoDecimals(amount));
+ }
+ }
+ case EXACT -> {
+ for (int i = 0; i < size; i++) {
+ double amount = expenses.get(i);
+ setBalances(payer, users.get(i), roundToTwoDecimals(amount));
+ }
+ }
+ case PERCENT -> {
+ int sum = 0;
+ for (int i = 0; i < size; i++) {
+ sum += expenses.get(i);
+ }
+ if (sum != 100) {
+ System.out.println("ERROR! Percentages don't add up to 100");
+ } else {
+ for (int i = 0; i < size; i++) {
+ double amount = (expenses.get(i) * totalExpense) / 100;
+ setBalances(payer, users.get(i), roundToTwoDecimals(amount));
+ }
+ }
+ }
+ default -> System.out.println("Invalid Expense");
+ }
+ }
+}
\ No newline at end of file
diff --git a/module/src/splitwise/model/User.java b/module/src/splitwise/model/User.java
new file mode 100644
index 00000000..7b75fce5
--- /dev/null
+++ b/module/src/splitwise/model/User.java
@@ -0,0 +1,39 @@
+package splitwise.model;
+
+import java.util.UUID;
+
+public class User {
+ String name;
+ String email;
+ int phoneNumber;
+ int id;
+ double expenses;
+
+ public User(String name, String email, int phoneNumber){
+ this.name = name;
+ this.email = email;
+ this.phoneNumber = phoneNumber;
+ this.id = UUID.randomUUID().hashCode();
+ this.expenses = 0;
+ }
+
+ public String getName(){
+ return this.name;
+ }
+
+ public String getEmail(){
+ return this.email;
+ }
+
+ public int getPhone(){
+ return this.phoneNumber;
+ }
+
+ public int getId(){
+ return this.id;
+ }
+
+ public double getExpenses(){
+ return this.expenses;
+ }
+}